diff --git a/packages/model-typings/src/updater.ts b/packages/model-typings/src/updater.ts index 33ec78f4b86be..fe8354479c1f1 100644 --- a/packages/model-typings/src/updater.ts +++ b/packages/model-typings/src/updater.ts @@ -1,15 +1,18 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import type { Join, NestedPaths, PropertyType, ArrayElement, NestedPathsOfType, Filter } from 'mongodb'; +import type { Join, NestedPaths, PropertyType, ArrayElement, NestedPathsOfType, Filter, UpdateFilter } from 'mongodb'; export interface Updater { set

, K extends keyof P>(key: K, value: P[K]): Updater; unset>(key: K): Updater; inc>(key: K, value: number): Updater; - addToSet>(key: K, value: AddToSetProps[K]): Updater; + addToSet>(key: K, value: ArrayElementType[K]>): Updater; persist(query: Filter): Promise; hasChanges(): boolean; + getUpdateFilter(): UpdateFilter; } +type ArrayElementType = T extends (infer E)[] ? E : T; + export type SetProps = Readonly< { [Property in Join, '.'>]: PropertyType; diff --git a/packages/models/src/updater.spec.ts b/packages/models/src/updater.spec.ts index 4decc57d7c3ba..ae75400bd9eef 100644 --- a/packages/models/src/updater.spec.ts +++ b/packages/models/src/updater.spec.ts @@ -1,3 +1,5 @@ +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; + import { UpdaterImpl } from './updater'; test('updater typings', () => { @@ -15,6 +17,20 @@ test('updater typings', () => { e: string[]; }>({} as any); + const omnichannel = new UpdaterImpl({} as any); + omnichannel.addToSet('v.activity', 'asd'); + // @ts-expect-error + omnichannel.addToSet('v.activity', 1); + // @ts-expect-error + omnichannel.addToSet('v.activity', { + asdas: 1, + }); + + // @ts-expect-error + omnichannel.addToSet('v.activity.asd', { + asdas: 1, + }); + updater.addToSet('e', 'a'); // @ts-expect-error @@ -160,7 +176,7 @@ test('it should add items to array', async () => { { _id: 'test', }, - { $addToSet: { $each: { a: ['b', 'c'] } } }, + { $addToSet: { a: { $each: ['b', 'c'] } } }, ); }); diff --git a/packages/models/src/updater.ts b/packages/models/src/updater.ts index ef163ea09e40e..361e228e65acf 100644 --- a/packages/models/src/updater.ts +++ b/packages/models/src/updater.ts @@ -71,12 +71,12 @@ export class UpdaterImpl implements Updater { return Object.keys(this.getUpdateFilter()).length > 0; } - private getUpdateFilter() { + getUpdateFilter() { return { ...(this._set && { $set: Object.fromEntries(this._set) }), ...(this._unset && { $unset: Object.fromEntries([...this._unset.values()].map((k) => [k, 1])) }), ...(this._inc && { $inc: Object.fromEntries(this._inc) }), - ...(this._addToSet && { $addToSet: { $each: Object.fromEntries(this._addToSet) } }), + ...(this._addToSet && { $addToSet: Object.fromEntries([...this._addToSet.entries()].map(([k, v]) => [k, { $each: v }])) }), } as unknown as UpdateFilter; } }