{"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<string, any>\n): Record<string, any> => {\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<string, any>) =>\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<string, any>) => {\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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"}