diff --git a/README.md b/README.md index 853dc48..75aae9c 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,7 @@ Every KO should have properties: - uid - tags (with class) + +## Abbreviations + +- fm - FrontMatter diff --git a/app/src/adapters/output/DailyNotePersistenceAdapter.ts b/app/src/adapters/output/DailyNotePersistenceAdapter.ts index c825603..3dc0f44 100644 --- a/app/src/adapters/output/DailyNotePersistenceAdapter.ts +++ b/app/src/adapters/output/DailyNotePersistenceAdapter.ts @@ -1,6 +1,6 @@ import DailyNote from "../../../../core/src/domain/DailyNote"; import {TFile} from "obsidian"; -import DailyNoteCreator from "../../utils/DailyNoteCreator"; +import DailyNoteCreator from "../../utils/creators/DailyNoteCreator"; import AppUtils from "../../utils/AppUtils"; import DailyNoteRepository from "../../../../core/src/ports/output/DailyNoteRepository"; @@ -20,6 +20,6 @@ export default class DailyNotePersistenceAdapter implements DailyNoteRepository return this.appUtils.getTagsFromFile(f).includes("TMS/DailyNote"); }); - return rawDailyNotes.map(f => this.dailyNoteCreator.createFromTFile(f)); + return Promise.all(rawDailyNotes.map(async f => await this.dailyNoteCreator.create(f))); } } diff --git a/app/src/utils/AreaCreator.ts b/app/src/utils/AreaCreator.ts deleted file mode 100644 index 3035f2d..0000000 --- a/app/src/utils/AreaCreator.ts +++ /dev/null @@ -1,24 +0,0 @@ -import AppUtils from "./AppUtils"; -import {TFile} from "obsidian"; -import Area from "../../../core/src/domain/Area"; -import {UUID} from "node:crypto"; - -export default class AreaCreator { - constructor(private appUtils: AppUtils) { - } - - async create(file: TFile): Promise { - const koProperties = this.appUtils.getFrontmatterOrThrow(file); - - const id: UUID = koProperties["uid"] as UUID; - - let parentArea: Area | null = null; - const parentStr: string = koProperties["a-parent"]; - if (parentStr) { - const file = this.appUtils.getTFileFromStrLink(parentStr); - parentArea = await this.create(file); - } - - return new Area(id, file.name.replace(".md", ""), parentArea) - } -} diff --git a/app/src/utils/DailyNoteCreator.ts b/app/src/utils/DailyNoteCreator.ts deleted file mode 100644 index d334692..0000000 --- a/app/src/utils/DailyNoteCreator.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {TFile} from "obsidian"; -import DailyNote from "../../../core/src/domain/DailyNote"; -import AppUtils from "./AppUtils"; -import {UUID} from "node:crypto"; - -export default class DailyNoteCreator { - constructor(private appUtils: AppUtils) { - } - - createFromTFile(file: TFile) { - const frontmatter = this.appUtils.getFrontmatterOrThrow(file); - const id = frontmatter["uid"] as UUID; - const dateStr = frontmatter["dn-date"]; - const date = new Date(dateStr); - return new DailyNote(id, date); - } -} diff --git a/app/src/utils/EffortCreator.ts b/app/src/utils/EffortCreator.ts deleted file mode 100644 index f018fbf..0000000 --- a/app/src/utils/EffortCreator.ts +++ /dev/null @@ -1,38 +0,0 @@ -import AppUtils from "./AppUtils"; -import {TFile} from "obsidian"; -import {UUID} from "node:crypto"; -import Effort from "../../../core/src/domain/effort/Effort"; -import {EffortStatus} from "../../../core/src/domain/effort/EffortStatus"; -import Area from "../../../core/src/domain/Area"; -import AreaCreator from "./AreaCreator"; - -export default class EffortCreator { - constructor(private appUtils: AppUtils, private areaCreator: AreaCreator) { - } - - async create(file: TFile): Promise { - const koProperties = this.appUtils.getFrontmatterOrThrow(file); - - const id: UUID = koProperties["uid"] as UUID; - const status: EffortStatus = koProperties["e-status"] as EffortStatus; - const started: Date | null = koProperties["started"] ? koProperties["started"] as Date : null; - const ended: Date | null = koProperties["ended"] ? koProperties["ended"] as Date : null; - - let area: Area | null = null; - const areaStr: string = koProperties["area"]; - if (areaStr) { - const file = this.appUtils.getTFileFromStrLink(areaStr); - area = await this.areaCreator.create(file); - } - - let parent: Effort | null = null; - const parentStr: string = koProperties["e-parent"]; - if (parentStr) { - const file = this.appUtils.getTFileFromStrLink(parentStr); - parent = await this.create(file); - } - - const body: string = await this.appUtils.getFileBody(file); - return new Effort(id, file.name.replace(".md", ""), status, started, ended, area, parent, body); - } -} diff --git a/app/src/utils/KObjectCreator.ts b/app/src/utils/KObjectCreator.ts deleted file mode 100644 index fd524e8..0000000 --- a/app/src/utils/KObjectCreator.ts +++ /dev/null @@ -1,52 +0,0 @@ -import {TFile} from "obsidian"; -import KObject from "../../../core/src/domain/KObject"; -import {KOC} from "../../../core/src/domain/KOC"; -import AppUtils from "./AppUtils"; -import Area from "../../../core/src/domain/Area"; -import {UUID} from "node:crypto"; -import KOCFactory from "./KOCFactory"; -import ExoContext from "../../../common/ExoContext"; - -export default class KObjectCreator { - constructor(private appUtils: AppUtils, private ctx: ExoContext) { - } - - createFromTFile(file: TFile) { - const frontmatter = this.appUtils.getFrontmatterOrThrow(file); - const id = frontmatter["uid"] as UUID; - const koc = this.getFileKoc(file); - return new KObject(id, koc); - } - - async createFromTFileTyped(file: TFile) { - const koc = this.getFileKoc(file); - switch (koc) { - case KOC.EMS_AREA: - return this.createArea(file); - case KOC.EMS_EFFORT: - return await this.ctx.effortCreator.create(file); - default: - throw new Error("Not implemented createFromTFileTyped") - } - } - - createArea(file: TFile): Area { - const koProperties = this.appUtils.getFrontmatterOrThrow(file); - - const id: UUID = koProperties["uid"] as UUID; - - let parentArea: Area | null = null; - const parentStr: string = koProperties["a-parent"]; - if (parentStr) { - const file = this.appUtils.getTFileFromStrLink(parentStr); - parentArea = this.createArea(file); - } - - return new Area(id, file.name.replace(".md", ""), parentArea) - } - - getFileKoc(file: TFile): KOC { - const tags = this.appUtils.getTagsFromFile(file); - return KOCFactory.create(tags); - } -} diff --git a/app/src/utils/KObjectUtility.ts b/app/src/utils/KObjectUtility.ts index e39f879..6075c47 100644 --- a/app/src/utils/KObjectUtility.ts +++ b/app/src/utils/KObjectUtility.ts @@ -4,6 +4,7 @@ export default class KObjectUtility { constructor(private ctx: ExoContext) { } + // noinspection JSUnusedGlobalSymbols async addMissingId(): Promise { let allMdFiles = this.ctx.appUtils.getAllMdFiles(); diff --git a/app/src/utils/creators/AbstractCreator.ts b/app/src/utils/creators/AbstractCreator.ts new file mode 100644 index 0000000..d63455f --- /dev/null +++ b/app/src/utils/creators/AbstractCreator.ts @@ -0,0 +1,16 @@ +import {FrontMatterCache, TFile} from "obsidian"; +import {UUID} from "node:crypto"; +import ExoContext from "../../../../common/ExoContext"; + +export default abstract class AbstractCreator { + constructor(protected ctx: ExoContext) { + } + + async create(file: TFile): Promise { + const fm = this.ctx.appUtils.getFrontmatterOrThrow(file); + const id: UUID = fm["uid"] as UUID; + return this.createInternal(file, id, fm); + } + + protected abstract createInternal(file: TFile, id: UUID, fm: FrontMatterCache): Promise; +} diff --git a/app/src/utils/creators/AreaCreator.ts b/app/src/utils/creators/AreaCreator.ts new file mode 100644 index 0000000..75041af --- /dev/null +++ b/app/src/utils/creators/AreaCreator.ts @@ -0,0 +1,22 @@ +import {FrontMatterCache, TFile} from "obsidian"; +import Area from "../../../../core/src/domain/Area"; +import {UUID} from "node:crypto"; +import AbstractCreator from "./AbstractCreator"; +import ExoContext from "../../../../common/ExoContext"; + +export default class AreaCreator extends AbstractCreator { + constructor(ctx: ExoContext) { + super(ctx); + } + + async createInternal(file: TFile, id: UUID, fm: FrontMatterCache): Promise { + let parentArea: Area | null = null; + const parentStr: string = fm["a-parent"]; + if (parentStr) { + const file = this.ctx.appUtils.getTFileFromStrLink(parentStr); + parentArea = await this.create(file); + } + + return new Area(id, file.name.replace(".md", ""), parentArea) + } +} diff --git a/app/src/utils/creators/DailyNoteCreator.ts b/app/src/utils/creators/DailyNoteCreator.ts new file mode 100644 index 0000000..0b97d62 --- /dev/null +++ b/app/src/utils/creators/DailyNoteCreator.ts @@ -0,0 +1,17 @@ +import {FrontMatterCache, TFile} from "obsidian"; +import DailyNote from "../../../../core/src/domain/DailyNote"; +import {UUID} from "node:crypto"; +import AbstractCreator from "./AbstractCreator"; +import ExoContext from "../../../../common/ExoContext"; + +export default class DailyNoteCreator extends AbstractCreator { + constructor(ctx: ExoContext) { + super(ctx); + } + + async createInternal(file: TFile, id: UUID, fm: FrontMatterCache): Promise { + const dateStr = fm["dn-date"]; + const date = new Date(dateStr); + return new DailyNote(id, date); + } +} diff --git a/app/src/utils/creators/EffortCreator.ts b/app/src/utils/creators/EffortCreator.ts new file mode 100644 index 0000000..9d9a715 --- /dev/null +++ b/app/src/utils/creators/EffortCreator.ts @@ -0,0 +1,36 @@ +import {FrontMatterCache, TFile} from "obsidian"; +import {UUID} from "node:crypto"; +import Effort from "../../../../core/src/domain/effort/Effort"; +import {EffortStatus} from "../../../../core/src/domain/effort/EffortStatus"; +import Area from "../../../../core/src/domain/Area"; +import AbstractCreator from "./AbstractCreator"; +import ExoContext from "../../../../common/ExoContext"; + +export default class EffortCreator extends AbstractCreator { + constructor(ctx: ExoContext) { + super(ctx); + } + + async createInternal(file: TFile, id: UUID, fm: FrontMatterCache): Promise { + const status: EffortStatus = fm["e-status"] as EffortStatus; + const started: Date | null = fm["started"] ? fm["started"] as Date : null; + const ended: Date | null = fm["ended"] ? fm["ended"] as Date : null; + + let area: Area | null = null; + const areaStr: string = fm["area"]; + if (areaStr) { + const file = this.ctx.appUtils.getTFileFromStrLink(areaStr); + area = await this.ctx.areaCreator.create(file); + } + + let parent: Effort | null = null; + const parentStr: string = fm["e-parent"]; + if (parentStr) { + const file = this.ctx.appUtils.getTFileFromStrLink(parentStr); + parent = await this.create(file); + } + + const body: string = await this.ctx.appUtils.getFileBody(file); + return new Effort(id, file.name.replace(".md", ""), status, started, ended, area, parent, body); + } +} diff --git a/app/src/utils/creators/KObjectCreator.ts b/app/src/utils/creators/KObjectCreator.ts new file mode 100644 index 0000000..716635c --- /dev/null +++ b/app/src/utils/creators/KObjectCreator.ts @@ -0,0 +1,35 @@ +import {TFile} from "obsidian"; +import KObject from "../../../../core/src/domain/KObject"; +import {KOC} from "../../../../core/src/domain/KOC"; +import {UUID} from "node:crypto"; +import KOCFactory from "../KOCFactory"; +import ExoContext from "../../../../common/ExoContext"; + +export default class KObjectCreator { + constructor(private ctx: ExoContext) { + } + + createFromTFile(file: TFile) { + const frontmatter = this.ctx.appUtils.getFrontmatterOrThrow(file); + const id = frontmatter["uid"] as UUID; + const koc = this.getFileKoc(file); + return new KObject(id, koc); + } + + async createFromTFileTyped(file: TFile) { + const koc = this.getFileKoc(file); + switch (koc) { + case KOC.EMS_AREA: + return this.ctx.areaCreator.create(file); + case KOC.EMS_EFFORT: + return await this.ctx.effortCreator.create(file); + default: + throw new Error("Not implemented createFromTFileTyped") + } + } + + getFileKoc(file: TFile): KOC { + const tags = this.ctx.appUtils.getTagsFromFile(file); + return KOCFactory.create(tags); + } +} diff --git a/common/ExoContext.ts b/common/ExoContext.ts index 7159784..0986a62 100644 --- a/common/ExoContext.ts +++ b/common/ExoContext.ts @@ -1,8 +1,8 @@ import {App} from "obsidian"; import DailyNoteRepository from "../core/src/ports/output/DailyNoteRepository"; import Utils from "../core/src/utils/Utils"; -import DailyNoteCreator from "../app/src/utils/DailyNoteCreator"; -import KObjectCreator from "../app/src/utils/KObjectCreator"; +import DailyNoteCreator from "../app/src/utils/creators/DailyNoteCreator"; +import KObjectCreator from "../app/src/utils/creators/KObjectCreator"; import AppUtils from "../app/src/utils/AppUtils"; import CountNotesUseCase from "../core/src/ports/input/CountNotesUseCase"; import CountNotesService from "../core/src/service/CountNotesService"; @@ -15,8 +15,8 @@ import EffortRepository from "../core/src/ports/output/EffortRepository"; import EffortPersistenceAdapter from "../app/src/adapters/output/EffortPersistenceAdapter"; import KObjectUtility from "../app/src/utils/KObjectUtility"; import EffortPathRulesHelper from "../app/src/helpers/EffortPathRulesHelper"; -import EffortCreator from "../app/src/utils/EffortCreator"; -import AreaCreator from "../app/src/utils/AreaCreator"; +import EffortCreator from "../app/src/utils/creators/EffortCreator"; +import AreaCreator from "../app/src/utils/creators/AreaCreator"; import LayoutFactory from "../app/src/adapters/input/layouts/LayoutFactory"; export default class ExoContext { @@ -42,10 +42,10 @@ export default class ExoContext { this.appUtils = new AppUtils(this.app); this.layoutFactory = new LayoutFactory(this); - this.dailyNoteCreator = new DailyNoteCreator(this.appUtils); - this.areaCreator = new AreaCreator(this.appUtils); - this.effortCreator = new EffortCreator(this.appUtils, this.areaCreator); - this.kObjectCreator = new KObjectCreator(this.appUtils, this); + this.dailyNoteCreator = new DailyNoteCreator(this); + this.areaCreator = new AreaCreator(this); + this.effortCreator = new EffortCreator(this); + this.kObjectCreator = new KObjectCreator(this); this.dailyNoteRepository = new DailyNotePersistenceAdapter(this.appUtils, this.dailyNoteCreator); this.kObjectUtility = new KObjectUtility(this);