diff --git a/packages/core/src/__tests__/memdb.test.ts b/packages/core/src/__tests__/memdb.test.ts index 133c9ebba9..b326bec84e 100644 --- a/packages/core/src/__tests__/memdb.test.ts +++ b/packages/core/src/__tests__/memdb.test.ts @@ -25,7 +25,7 @@ const txes = genMinModel() async function createModel (): Promise<{ model: ModelDb, hierarchy: Hierarchy }> { const hierarchy = new Hierarchy() - for (const tx of txes) await hierarchy.tx(tx) + for (const tx of txes) hierarchy.tx(tx) const model = new ModelDb(hierarchy) for (const tx of txes) await model.tx(tx) return { model, hierarchy } @@ -144,7 +144,7 @@ describe('memdb', () => { it('should push to array', async () => { const hierarchy = new Hierarchy() - for (const tx of txes) await hierarchy.tx(tx) + for (const tx of txes) hierarchy.tx(tx) const model = new TxOperations(new ModelDb(hierarchy), core.account.System) for (const tx of txes) await model.tx(tx) const space = await model.createDoc(core.class.Space, core.space.Model, { diff --git a/packages/core/src/__tests__/minmodel.ts b/packages/core/src/__tests__/minmodel.ts index f95540c70c..ebb7727c22 100644 --- a/packages/core/src/__tests__/minmodel.ts +++ b/packages/core/src/__tests__/minmodel.ts @@ -17,7 +17,7 @@ import type { Plugin } from '@anticrm/platform' import { plugin } from '@anticrm/platform' import type { Class, Data, Doc, Obj, Ref, Mixin, Arr } from '../classes' import { ClassifierKind, DOMAIN_MODEL } from '../classes' -import type { Tx, TxCreateDoc } from '../tx' +import type { TxCUD, TxCreateDoc } from '../tx' import core from '../component' import { DOMAIN_TX, TxFactory } from '../tx' @@ -45,7 +45,7 @@ export const test = plugin('test' as Plugin, { * Generate minimal model for testing purposes. * @returns R */ -export function genMinModel (): Tx[] { +export function genMinModel (): TxCUD<Doc>[] { const txes = [] // Fill Tx'es with basic model classes. txes.push(createClass(core.class.Obj, { kind: ClassifierKind.CLASS })) diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts index 73370d75a1..9345ceae1b 100644 --- a/packages/core/src/client.ts +++ b/packages/core/src/client.ts @@ -78,6 +78,7 @@ export async function createClient ( txBuffer?.push(tx) } else { if (tx.objectSpace === core.space.Model) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises hierarchy.tx(tx) // eslint-disable-next-line @typescript-eslint/no-floating-promises model.tx(tx) diff --git a/packages/core/src/hierarchy.ts b/packages/core/src/hierarchy.ts index 2ce5bdd20b..a14895e648 100644 --- a/packages/core/src/hierarchy.ts +++ b/packages/core/src/hierarchy.ts @@ -86,28 +86,35 @@ export class Hierarchy { } tx (tx: Tx): void { - if (tx._class !== core.class.TxCreateDoc) { - if (tx._class === core.class.TxMixin) { - const mixinTx = tx as TxMixin<Doc, Doc> - if (tx.objectClass !== core.class.Class) { return } - const obj = this.getClass(tx.objectId as Ref<Class<Obj>>) as any - obj[mixinTx.mixin] = mixinTx.attributes - } - return + switch (tx._class) { + case core.class.TxCreateDoc: + this.txCreateDoc(tx as TxCreateDoc<Doc>) + return + case core.class.TxMixin: + this.txMixin(tx as TxMixin<Doc, Doc>) } - const createTx = tx as TxCreateDoc<Doc> - if (createTx.objectClass === core.class.Class) { + } + + private txCreateDoc (tx: TxCreateDoc<Doc>): void { + if (tx.objectClass === core.class.Class) { const createTx = tx as TxCreateDoc<Class<Obj>> const _id = createTx.objectId this.classes.set(_id, TxProcessor.createDoc2Doc(createTx)) this.addAncestors(_id) this.addDescendant(_id) - } else if (createTx.objectClass === core.class.Attribute) { + } else if (tx.objectClass === core.class.Attribute) { const createTx = tx as TxCreateDoc<AnyAttribute> this.addAttribute(TxProcessor.createDoc2Doc(createTx)) } } + private txMixin (tx: TxMixin<Doc, Doc>): void { + if (tx.objectClass === core.class.Class) { + const obj = this.getClass(tx.objectId as Ref<Class<Obj>>) as any + obj[tx.mixin] = tx.attributes + } + } + isDerived<T extends Obj>(_class: Ref<Class<T>>, from: Ref<Class<T>>): boolean { let cl: Ref<Class<Obj>> | undefined = _class while (cl !== undefined) { diff --git a/packages/core/src/tx.ts b/packages/core/src/tx.ts index 12557ed0d5..c0bc332bee 100644 --- a/packages/core/src/tx.ts +++ b/packages/core/src/tx.ts @@ -22,16 +22,22 @@ import { generateId } from './utils' /** * @public */ -export interface Tx<T extends Doc = Doc> extends Doc { - objectId: Ref<T> - objectClass: Ref<Class<T>> - objectSpace: Ref<Space> +export interface Tx extends Doc { + objectSpace: Ref<Space> // space where transaction will operate } /** * @public */ -export interface TxCreateDoc<T extends Doc> extends Tx<T> { +export interface TxCUD<T extends Doc> extends Tx { + objectId: Ref<T> + objectClass: Ref<Class<T>> +} + +/** + * @public + */ +export interface TxCreateDoc<T extends Doc> extends TxCUD<T> { attributes: Data<T> } @@ -43,7 +49,7 @@ export type ExtendedAttributes<D extends Doc, M extends D> = Omit<M, keyof D> /** * @public */ -export interface TxMixin<D extends Doc, M extends D> extends Tx<D> { +export interface TxMixin<D extends Doc, M extends D> extends TxCUD<D> { mixin: Ref<Mixin<M>> attributes: ExtendedAttributes<D, M> } @@ -85,14 +91,14 @@ export type DocumentUpdate<T extends Doc> = Partial<Data<T>> & PushOptions<T> & /** * @public */ -export interface TxUpdateDoc<T extends Doc> extends Tx<T> { +export interface TxUpdateDoc<T extends Doc> extends TxCUD<T> { operations: DocumentUpdate<T> } /** * @public */ -export interface TxRemoveDoc<T extends Doc> extends Tx<T> { +export interface TxRemoveDoc<T extends Doc> extends TxCUD<T> { } /** @@ -122,6 +128,7 @@ export class TxProcessor implements WithTx { case core.class.TxMixin: return await this.txMixin(tx as TxMixin<Doc, Doc>) } + throw new Error('TxProcessor: unhandled transaction class: ' + tx._class) } static createDoc2Doc<T extends Doc> (tx: TxCreateDoc<T>): T { @@ -156,7 +163,7 @@ export class TxOperations implements Storage { return this.storage.findAll(_class, query, options) } - tx (tx: Tx<Doc>): Promise<void> { + tx (tx: Tx): Promise<void> { return this.storage.tx(tx) }