{"version":3,"file":"entries.mjs","sources":["../../../src/services/document-service/entries.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { assoc, omit } from 'lodash/fp';\n\nimport * as components from './components';\n\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { transformParamsToQuery } from './transform/query';\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\nimport { transformData } from './transform/data';\n\nconst createEntriesService = (\n  uid: UID.ContentType,\n  entityValidator: Modules.EntityValidator.EntityValidator\n) => {\n  const contentType = strapi.contentType(uid);\n\n  async function createEntry(params = {} as any) {\n    const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n    const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n    // Validation\n    if (!data) {\n      throw new Error('Create requires data attribute');\n    }\n\n    // Check for uniqueness based on documentId and locale (if localized)\n    if (data.documentId) {\n      const i18nService = strapi.plugin('i18n')?.service('content-types');\n      const isLocalized = i18nService?.isLocalizedContentType(contentType) ?? false;\n      const hasDraftAndPublish = contentType.options?.draftAndPublish === true;\n\n      const whereClause: Record<string, unknown> = { documentId: data.documentId };\n\n      if (isLocalized) {\n        whereClause.locale = data.locale;\n      }\n\n      let publishedStateDescription = '';\n\n      if (hasDraftAndPublish) {\n        if (data.publishedAt) {\n          // Current entry is published, check for existing published entry\n          whereClause.publishedAt = { $notNull: true };\n          publishedStateDescription = 'published';\n        } else {\n          // Current entry is a draft, check for existing draft entry\n          whereClause.publishedAt = { $null: true };\n          publishedStateDescription = 'draft';\n        }\n      }\n\n      const existingEntry = await strapi.db.query(uid).findOne({\n        select: ['id'],\n        where: whereClause,\n      });\n\n      if (existingEntry) {\n        let errorMsg = `A ${publishedStateDescription} entry with documentId \"${data.documentId}\"`;\n        if (isLocalized && data.locale) {\n          errorMsg += ` and locale \"${data.locale}\"`;\n        }\n        errorMsg += ` already exists for UID \"${uid}\". This combination must be unique.`;\n        throw new errors.ApplicationError(errorMsg);\n      }\n    }\n\n    const validData = await entityValidator.validateEntityCreation(contentType, data, {\n      // Note: publishedAt value will always be set when DP is disabled\n      isDraft: !params?.data?.publishedAt,\n      locale: params?.locale,\n    });\n\n    // Component handling\n    const componentData = await components.createComponents(uid, validData);\n    const dataWithComponents = components.assignComponentData(\n      contentType,\n      componentData,\n      validData\n    );\n\n    const entryData = applyTransforms(contentType, dataWithComponents);\n\n    const doc = await strapi.db.query(uid).create({ ...query, data: entryData });\n\n    return doc;\n  }\n\n  async function deleteEntry(id: number, query = {} as any) {\n    const componentsToDelete = await components.getComponents(uid, { id });\n\n    const deletedEntry = await strapi.db.query(uid).delete({ ...query, where: { id } });\n\n    await components.deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n    return deletedEntry;\n  }\n\n  async function updateEntry(entryToUpdate: any, params = {} as any) {\n    const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n    const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n    const validData = await entityValidator.validateEntityUpdate(\n      contentType,\n      data,\n      {\n        isDraft: !params?.data?.publishedAt, // Always update the draft version\n        locale: params?.locale,\n      },\n      entryToUpdate\n    );\n    // Component handling\n    const componentData = await components.updateComponents(uid, entryToUpdate, validData as any);\n    const dataWithComponents = components.assignComponentData(\n      contentType,\n      componentData,\n      validData\n    );\n\n    const entryData = applyTransforms(contentType, dataWithComponents);\n\n    return strapi.db\n      .query(uid)\n      .update({ ...query, where: { id: entryToUpdate.id }, data: entryData });\n  }\n\n  async function publishEntry(entry: any, params = {} as any) {\n    return async.pipe(\n      omit('id'),\n      assoc('publishedAt', new Date()),\n      (draft) => {\n        const opts = { uid, locale: draft.locale, status: 'published', allowMissingId: true };\n        return transformData(draft, opts);\n      },\n      // Create the published entry\n      (draft) => createEntry({ ...params, data: draft, locale: draft.locale, status: 'published' })\n    )(entry);\n  }\n\n  async function discardDraftEntry(entry: any, params = {} as any) {\n    return async.pipe(\n      omit('id'),\n      assoc('publishedAt', null),\n      (entry) => {\n        const opts = { uid, locale: entry.locale, status: 'draft', allowMissingId: true };\n        return transformData(entry, opts);\n      },\n      // Create the draft entry\n      (data) => createEntry({ ...params, locale: data.locale, data, status: 'draft' })\n    )(entry);\n  }\n\n  return {\n    create: createEntry,\n    delete: deleteEntry,\n    update: updateEntry,\n    publish: publishEntry,\n    discardDraft: discardDraftEntry,\n  };\n};\n\nexport { createEntriesService };\n"],"names":["createEntriesService","uid","entityValidator","contentType","strapi","createEntry","params","data","restParams","transformParamsDocumentId","query","transformParamsToQuery","pickSelectionParams","Error","documentId","i18nService","plugin","service","isLocalized","isLocalizedContentType","hasDraftAndPublish","options","draftAndPublish","whereClause","locale","publishedStateDescription","publishedAt","$notNull","$null","existingEntry","db","findOne","select","where","errorMsg","errors","ApplicationError","validData","validateEntityCreation","isDraft","componentData","components","dataWithComponents","entryData","applyTransforms","doc","create","deleteEntry","id","componentsToDelete","deletedEntry","delete","loadComponents","updateEntry","entryToUpdate","validateEntityUpdate","update","publishEntry","entry","async","pipe","omit","assoc","Date","draft","opts","status","allowMissingId","transformData","discardDraftEntry","publish","discardDraft"],"mappings":"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"}