/** * Class model for Entity Interface */ import type { EntityInterface } from "@/types/entity"; import type { EventInterface } from "@/types/event"; import type { TaskInterface } from "@/types/task"; import type { JournalInterface } from "@/types/journal"; import { EventObject } from "./event"; import { TaskObject } from "./task"; import { JournalObject } from "./journal"; export class EntityObject implements EntityInterface { _data!: EntityInterface; constructor() { this._data = { provider: '', service: '', collection: '', identifier: '', signature: null, created: null, modified: null, properties: new EventObject(), }; } fromJson(data: EntityInterface): EntityObject { this._data = data if (data.properties) { const type = data.properties.type if (type === 'task') { this._data.properties = new TaskObject().fromJson(data.properties as TaskInterface); } else if (type === 'journal') { this._data.properties = new JournalObject().fromJson(data.properties as JournalInterface); } else { this._data.properties = new EventObject().fromJson(data.properties as EventInterface); } } return this; } toJson(): EntityInterface { const json = { ...this._data } if (this._data.properties instanceof EventObject || this._data.properties instanceof TaskObject || this._data.properties instanceof JournalObject) { json.properties = this._data.properties.toJson(); } return json as EntityInterface } clone(): EntityObject { const cloned = new EntityObject() cloned._data = { ...this._data } return cloned } /** Immutable Properties */ get provider(): string { return this._data.provider } get service(): string { return this._data.service } get collection(): string | number { return this._data.collection } get identifier(): string | number { return this._data.identifier } get signature(): string | null { return this._data.signature } get created(): string | null { return this._data.created } get modified(): string | null { return this._data.modified } get properties(): EventObject | TaskObject | JournalObject { if (this._data.properties instanceof EventObject || this._data.properties instanceof TaskObject || this._data.properties instanceof JournalObject) { return this._data.properties } const defaultProperties = new EventObject(); this._data.properties = defaultProperties; return defaultProperties } set properties(value: EventObject | TaskObject | JournalObject) { this._data.properties = value } }