{"version":3,"file":"localizations.mjs","sources":["../../../server/src/services/localizations.ts"],"sourcesContent":["import { cloneDeep, isEmpty } from 'lodash/fp';\n\nimport type { Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Mutates the provided data object in place and returns the same reference\n * with populated media values replaced by their upload file IDs.\n */\nconst normalizeMediaIds = (\n schema: Schema.ContentType | Schema.Component,\n data: Record\n): Record => {\n if (!schema?.attributes || !data || typeof data !== 'object') {\n return data;\n }\n\n Object.entries(schema.attributes).forEach(([attributeName, attribute]) => {\n const value = data[attributeName];\n\n if (value == null) {\n return;\n }\n\n if (attribute.type === 'media') {\n if (attribute.multiple) {\n data[attributeName] = Array.isArray(value)\n ? value.map((file: unknown) =>\n file && typeof file === 'object' && 'id' in file ? file.id : file\n )\n : value;\n } else {\n data[attributeName] =\n value && typeof value === 'object' && 'id' in value ? value.id : value;\n }\n\n return;\n }\n\n if (attribute.type === 'component') {\n const componentSchema = strapi.getModel(attribute.component);\n\n if (attribute.repeatable && Array.isArray(value)) {\n value.forEach((componentValue: Record) =>\n normalizeMediaIds(componentSchema, componentValue)\n );\n } else {\n normalizeMediaIds(componentSchema, value);\n }\n\n return;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n value.forEach((componentValue: Record) => {\n if (componentValue?.__component) {\n normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);\n }\n });\n }\n });\n\n return data;\n};\n\n/**\n * Update non localized fields of all the related localizations of an entry with the entry values\n */\nconst syncNonLocalizedAttributes = async (sourceEntry: any, model: Schema.ContentType) => {\n const { copyNonLocalizedAttributes } = getService('content-types');\n\n const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);\n if (isEmpty(nonLocalizedAttributes)) {\n return;\n }\n\n const normalizedNonLocalizedAttributes = normalizeMediaIds(model, nonLocalizedAttributes);\n\n const uid = model.uid;\n const documentId = sourceEntry.documentId;\n const locale = sourceEntry.locale;\n const status = sourceEntry?.publishedAt ? 'published' : 'draft';\n\n // Find all the entries that need to be updated\n // this is every other entry of the document in the same status but a different locale\n const localeEntriesToUpdate = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $ne: locale },\n },\n select: ['locale', 'id'],\n });\n\n const entryData = await strapi.documents(uid).omitComponentData(normalizedNonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(normalizedNonLocalizedAttributes),\n {\n uid,\n status,\n locale: entry.locale,\n allowMissingId: true,\n }\n );\n\n // Update or create non localized components for the entry\n const componentData = await strapi\n .documents(uid)\n .updateComponents(entry, transformedData as any);\n\n // Update every other locale entry of this documentId in the same status\n await strapi.db.query(uid).update({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $eq: entry.locale },\n },\n // The data we send to the update function is the entry data merged with\n // the updated component data\n data: Object.assign(cloneDeep(entryData), componentData),\n });\n });\n};\n\nconst localizations = () => ({\n syncNonLocalizedAttributes,\n});\n\ntype LocalizationsService = typeof localizations;\n\nexport default localizations;\nexport type { LocalizationsService };\n"],"names":["normalizeMediaIds","schema","data","attributes","Object","entries","forEach","attributeName","attribute","value","type","multiple","Array","isArray","map","file","id","componentSchema","strapi","getModel","component","repeatable","componentValue","__component","syncNonLocalizedAttributes","sourceEntry","model","copyNonLocalizedAttributes","getService","nonLocalizedAttributes","isEmpty","normalizedNonLocalizedAttributes","uid","documentId","locale","status","publishedAt","localeEntriesToUpdate","db","query","findMany","where","$ne","select","entryData","documents","omitComponentData","async","entry","transformedData","utils","transformData","cloneDeep","allowMissingId","componentData","updateComponents","update","$eq","assign","localizations"],"mappings":"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"}