Skip to content

Commit

Permalink
create a dedicated pull command for #7
Browse files Browse the repository at this point in the history
  • Loading branch information
Heiss committed Jul 18, 2024
1 parent 31af453 commit 004942c
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 73 deletions.
7 changes: 7 additions & 0 deletions main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ export default class VikunjaPlugin extends Plugin {
await this.processor.exec();
}
});
this.addCommand({
id: 'vikunja-pull-tasks',
name: 'Pull tasks from Vikunja',
callback: async () => {
await this.commands.pullTasksFromVikunja();
}
})
this.addCommand({
id: 'vikunja-move-tasks-to-default-project',
name: 'Move all tasks to default project',
Expand Down
21 changes: 19 additions & 2 deletions src/commands/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {appHasDailyNotesPluginLoaded} from "obsidian-daily-notes-interface";
import {App, Notice} from "obsidian";
import {getAPI} from "obsidian-dataview";
import VikunjaPlugin from "../../main";
import {PluginTask} from "../vaultSearcher/vaultSearcher";

export default class Commands {
private plugin: VikunjaPlugin;
Expand Down Expand Up @@ -62,10 +63,26 @@ export default class Commands {
}
if (this.plugin.settings.debugging) console.log("Move all tasks to default project");

const tasks = (await this.getTasksFromVault()).filter(task => task.task.id !== undefined).map(task => task.task);
await this.plugin.tasksApi.updateProjectsIdInVikunja(tasks, this.plugin.settings.defaultVikunjaProject);
}

async pullTasksFromVikunja() {
if (this.isEverythingSetup()) {
new Notice("Vikunja Plugin: Found problems in plugin. Have to be fixed first. Syncing is stopped.");
return;
}
if (this.plugin.settings.debugging) console.log("Pull tasks from Vikunja");

const vikunjaTasks = await this.plugin.tasksApi.getAllTasks();
const vaultTasks = await this.getTasksFromVault();
await this.plugin.processor.pullTasksFromVikunjaToVault(vaultTasks, vikunjaTasks);
}

async getTasksFromVault(): Promise<PluginTask[]> {
const vaultSearcher = this.plugin.processor.getVaultSearcher();
const taskParser = this.plugin.processor.getTaskParser();

const tasks = (await vaultSearcher.getTasks(taskParser)).filter(task => task.task.id !== undefined).map(task => task.task);
await this.plugin.tasksApi.updateProjectsIdInVikunja(tasks, this.plugin.settings.defaultVikunjaProject);
return await vaultSearcher.getTasks(taskParser);
}
}
71 changes: 2 additions & 69 deletions src/processing/createTasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,78 +32,11 @@ class CreateTasks implements IAutomatonSteps {
private async createTasks(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) {

if (this.plugin.settings.debugging) console.log("Step CreateTask: Creating tasks in Vikunja and vault", localTasks, vikunjaTasks);
await this.pullTasksFromVikunjaToVault(localTasks, vikunjaTasks);
await this.pushTasksFromVaultToVikunja(localTasks, vikunjaTasks);
await this.processor.pullTasksFromVikunjaToVault(localTasks, vikunjaTasks);
await this.processor.pushTasksFromVaultToVikunja(localTasks, vikunjaTasks);
}


private async pushTasksFromVaultToVikunja(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) {
const tasksToPushToVikunja = localTasks.filter(task => !vikunjaTasks.find(vikunjaTask => vikunjaTask.id === task.task.id));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vikunja", tasksToPushToVikunja);
const createdTasksInVikunja = await this.plugin.tasksApi.createTasks(tasksToPushToVikunja.map(task => task.task));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Created tasks in vikunja", createdTasksInVikunja);

let tasksToUpdateInVault = [];

for (const task of tasksToPushToVikunja) {
const createdTask = createdTasksInVikunja.find((vikunjaTask: ModelsTask) => vikunjaTask.title === task.task.title);
if (!createdTask) {
continue;
}
task.task = createdTask;
tasksToUpdateInVault.push(task);
}

for (const task of tasksToUpdateInVault) {
if (this.plugin.settings.debugging) console.log("Step CreateTask: Updating task in vault", task);
await this.processor.updateToVault(task);
}
}

private async pullTasksFromVikunjaToVault(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) {
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pulling tasks from vikunja to vault, vault tasks", localTasks, "vikunja tasks", vikunjaTasks);

const tasksToPushToVault = vikunjaTasks.filter(task => !localTasks.find(vaultTask => vaultTask.task.id === task.id));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vault", tasksToPushToVault);

const createdTasksInVault: PluginTask[] = [];
for (const task of tasksToPushToVault) {
let file: TFile;
const chosenFile = this.app.vault.getFileByPath(this.plugin.settings.chosenOutputFile);
const date = moment();
const dailies = getAllDailyNotes()

switch (this.plugin.settings.chooseOutputFile) {
case chooseOutputFile.File:
if (!chosenFile) throw new Error("Output file not found");
file = chosenFile;
break;
case chooseOutputFile.DailyNote:
if (!appHasDailyNotesPluginLoaded()) {
new Notice("Daily notes core plugin is not loaded. So we cannot create daily note. Please install daily notes core plugin. Interrupt now.")
continue;
}

file = getDailyNote(date, dailies)
if (file == null) {
file = await createDailyNote(date)
}
break;
default:
throw new Error("No valid chooseOutputFile selected");
}
const pluginTask: PluginTask = {
file: file,
lineno: 0,
task: task
};
createdTasksInVault.push(pluginTask);
}

for (const task of createdTasksInVault) {
await this.processor.saveToVault(task);
}
}
}

export default CreateTasks;
80 changes: 78 additions & 2 deletions src/processing/processor.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import Plugin from "../../main";
import {App, MarkdownView, Notice} from "obsidian";
import {App, MarkdownView, moment, Notice, TFile} from "obsidian";
import {PluginTask, VaultSearcher} from "../vaultSearcher/vaultSearcher";
import {TaskFormatter, TaskParser} from "../taskFormats/taskFormats";
import {Automaton, AutomatonStatus, IAutomatonSteps} from "./automaton";
import UpdateTasks from "./updateTasks";
import {EmojiTaskFormatter, EmojiTaskParser} from "../taskFormats/emojiTaskFormat";
import {backendToFindTasks, supportedTasksPluginsFormat} from "../enums";
import {backendToFindTasks, chooseOutputFile, supportedTasksPluginsFormat} from "../enums";
import {DataviewSearcher} from "../vaultSearcher/dataviewSearcher";
import {ModelsTask} from "../../vikunja_sdk";
import {
appHasDailyNotesPluginLoaded,
createDailyNote,
getAllDailyNotes,
getDailyNote
} from "obsidian-daily-notes-interface";


class Processor {
Expand Down Expand Up @@ -220,6 +227,75 @@ class Processor {
return taskParser;
}

async pushTasksFromVaultToVikunja(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) {
const tasksToPushToVikunja = localTasks.filter(task => !vikunjaTasks.find(vikunjaTask => vikunjaTask.id === task.task.id));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vikunja", tasksToPushToVikunja);
const createdTasksInVikunja = await this.plugin.tasksApi.createTasks(tasksToPushToVikunja.map(task => task.task));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Created tasks in vikunja", createdTasksInVikunja);

let tasksToUpdateInVault = [];

for (const task of tasksToPushToVikunja) {
const createdTask = createdTasksInVikunja.find((vikunjaTask: ModelsTask) => vikunjaTask.title === task.task.title);
if (!createdTask) {
continue;
}
task.task = createdTask;
tasksToUpdateInVault.push(task);
}

for (const task of tasksToUpdateInVault) {
if (this.plugin.settings.debugging) console.log("Step CreateTask: Updating task in vault", task);
await this.updateToVault(task);
}
}

async pullTasksFromVikunjaToVault(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) {
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pulling tasks from vikunja to vault, vault tasks", localTasks, "vikunja tasks", vikunjaTasks);

const tasksToPushToVault = vikunjaTasks.filter(task => !localTasks.find(vaultTask => vaultTask.task.id === task.id));
if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vault", tasksToPushToVault);

const createdTasksInVault: PluginTask[] = [];
for (const task of tasksToPushToVault) {
let file: TFile;
const chosenFile = this.app.vault.getFileByPath(this.plugin.settings.chosenOutputFile);
// FIXME This should be the date of the vikunja created date, so the task is created in the correct daily note
const date = moment();
const dailies = getAllDailyNotes()

switch (this.plugin.settings.chooseOutputFile) {
case chooseOutputFile.File:
if (!chosenFile) throw new Error("Output file not found");
file = chosenFile;
break;
case chooseOutputFile.DailyNote:
if (!appHasDailyNotesPluginLoaded()) {
new Notice("Daily notes core plugin is not loaded. So we cannot create daily note. Please install daily notes core plugin. Interrupt now.")
continue;
}

file = getDailyNote(date, dailies)
if (file == null) {
file = await createDailyNote(date)
}
break;
default:
throw new Error("No valid chooseOutputFile selected");
}
const pluginTask: PluginTask = {
file: file,
lineno: 0,
task: task
};
createdTasksInVault.push(pluginTask);
}

for (const task of createdTasksInVault) {
await this.saveToVault(task);
}
}

}

export {Processor};

0 comments on commit 004942c

Please sign in to comment.