diff --git a/lib/controller/multi-language.ts b/lib/controller/multi-language.ts index 68984a1..ebae77c 100644 --- a/lib/controller/multi-language.ts +++ b/lib/controller/multi-language.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/method-signature-style */ +import DeepMerge from '@fastify/deepmerge' import AggregateBuilder from '@kakang/mongodb-aggregate-builder' import { isEmpty, isExist, isNull, isUndefined } from '@kakang/validator' import { type AggregateOptions, type AnyBulkWriteOperation, type BulkWriteOptions, type Collection, type Document, type Filter, type FindOptions, type UpdateFilter } from 'mongodb' @@ -6,6 +7,7 @@ import { appendBasicSchema, appendUpdateSchema } from '../utils/append' import { computeSharedOption } from '../utils/option' import { normalizeQueryDate, retrieveUpdateQueryData } from '../utils/query' import { Controller, type ControllerOptions, type SearchOptions } from './default' +const deepmerge = DeepMerge() export interface MultiLanguageControllerOptions extends Partial { slugField: keyof TSchema @@ -64,8 +66,10 @@ export class MultiLanguageController extend // insert when it is fallback, update when item exist if (isFallback) { + // we need to merge the old and new document to prevent missing fields + const doc: any = deepmerge(item, retrieveUpdateQueryData(docs)) // we append needed info for the document - const document: any = appendBasicSchema(retrieveUpdateQueryData(docs), this.appendBasicSchema) + const document: any = appendBasicSchema(doc as TSchema, this.appendBasicSchema) // ensure slug is exist document[this.slugField] = item[this.slugField] // insert if language is not exist diff --git a/package.json b/package.json index 792cbd7..17202ae 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "typescript": "~5.3.3" }, "dependencies": { + "@fastify/deepmerge": "^1.3.0", "@kakang/eventemitter": "^0.2.1", "@kakang/mongodb-aggregate-builder": "^0.2.2", "@kakang/validator": "^0.1.4",