{"version":3,"file":"release-action.mjs","sources":["../../../server/src/controllers/release-action.ts"],"sourcesContent":["import type Koa from 'koa';\n\nimport { async } from '@strapi/utils';\nimport {\n  validateReleaseAction,\n  validateReleaseActionUpdateSchema,\n  validateFindManyActionsParams,\n} from './validation/release-action';\nimport type {\n  CreateReleaseAction,\n  CreateManyReleaseActions,\n  GetReleaseActions,\n  UpdateReleaseAction,\n  DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { getService } from '../utils';\nimport { RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { AlreadyOnReleaseError } from '../services/validation';\n\nconst releaseActionController = {\n  async create(ctx: Koa.Context) {\n    const releaseId: CreateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n    const releaseActionArgs = ctx.request.body as CreateReleaseAction.Request['body'];\n\n    await validateReleaseAction(releaseActionArgs);\n\n    const releaseActionService = getService('release-action', { strapi });\n    const releaseAction = await releaseActionService.create(releaseId, releaseActionArgs);\n\n    ctx.created({\n      data: releaseAction,\n    });\n  },\n\n  async createMany(ctx: Koa.Context) {\n    const releaseId: CreateManyReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n    const releaseActionsArgs = ctx.request.body as CreateManyReleaseActions.Request['body'];\n\n    await Promise.all(\n      releaseActionsArgs.map((releaseActionArgs) => validateReleaseAction(releaseActionArgs))\n    );\n\n    const releaseActionService = getService('release-action', { strapi });\n    const releaseService = getService('release', { strapi });\n\n    const releaseActions = await strapi.db.transaction(async () => {\n      const releaseActions = await Promise.all(\n        releaseActionsArgs.map(async (releaseActionArgs) => {\n          try {\n            const action = await releaseActionService.create(releaseId, releaseActionArgs, {\n              disableUpdateReleaseStatus: true,\n            });\n            return action;\n          } catch (error) {\n            // If the entry is already in the release, we don't want to throw an error, so we catch and ignore it\n            if (error instanceof AlreadyOnReleaseError) {\n              return null;\n            }\n            throw error;\n          }\n        })\n      );\n      return releaseActions;\n    });\n\n    const newReleaseActions = releaseActions.filter((action) => action !== null);\n\n    if (newReleaseActions.length > 0) {\n      releaseService.updateReleaseStatus(releaseId);\n    }\n\n    ctx.created({\n      data: newReleaseActions,\n      meta: {\n        entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,\n        totalEntries: releaseActions.length,\n      },\n    });\n  },\n\n  async findMany(ctx: Koa.Context) {\n    const releaseId: GetReleaseActions.Request['params']['releaseId'] = ctx.params.releaseId;\n    const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n      ability: ctx.state.userAbility,\n      model: RELEASE_ACTION_MODEL_UID,\n    });\n\n    await validateFindManyActionsParams(ctx.query);\n\n    if (ctx.query.groupBy) {\n      if (!['action', 'contentType', 'locale'].includes(ctx.query.groupBy as string)) {\n        ctx.badRequest('Invalid groupBy parameter');\n      }\n    }\n\n    ctx.query.sort = ctx.query.groupBy === 'action' ? 'type' : ctx.query.groupBy;\n    delete ctx.query.groupBy;\n\n    const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n    const releaseActionService = getService('release-action', { strapi });\n    const { results, pagination } = await releaseActionService.findPage(releaseId, {\n      ...query,\n    });\n\n    /**\n     * Release actions can be related to entries of different content types.\n     * We need to sanitize the entry output according to that content type.\n     * So, we group the sanitized output function by content type.\n     */\n    const contentTypeOutputSanitizers = results.reduce((acc: Record<string, any>, action: any) => {\n      if (acc[action.contentType]) {\n        return acc;\n      }\n\n      const contentTypePermissionsManager = strapi\n        .service('admin::permission')\n        .createPermissionsManager({\n          ability: ctx.state.userAbility,\n          model: action.contentType,\n        });\n\n      acc[action.contentType] = contentTypePermissionsManager.sanitizeOutput;\n\n      return acc;\n    }, {});\n\n    /**\n     * sanitizeOutput doesn't work if you use it directly on the Release Action model, it doesn't sanitize the entries\n     * So, we need to sanitize manually each entry inside a Release Action\n     */\n    const sanitizedResults = await async.map(results, async (action: any) => ({\n      ...action,\n      entry: action.entry\n        ? await contentTypeOutputSanitizers[action.contentType](action.entry)\n        : {},\n    }));\n\n    const groupedData = await releaseActionService.groupActions(sanitizedResults, query.sort);\n\n    const contentTypes = await releaseActionService.getContentTypeModelsFromActions(results);\n\n    const releaseService = getService('release', { strapi });\n    const components = await releaseService.getAllComponents();\n\n    ctx.body = {\n      data: groupedData,\n      meta: {\n        pagination,\n        contentTypes,\n        components,\n      },\n    };\n  },\n\n  async update(ctx: Koa.Context) {\n    const actionId: UpdateReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n    const releaseId: UpdateReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n    const releaseActionUpdateArgs = ctx.request.body as UpdateReleaseAction.Request['body'];\n\n    await validateReleaseActionUpdateSchema(releaseActionUpdateArgs);\n\n    const releaseActionService = getService('release-action', { strapi });\n\n    const updatedAction = await releaseActionService.update(\n      actionId,\n      releaseId,\n      releaseActionUpdateArgs\n    );\n\n    ctx.body = {\n      data: updatedAction,\n    };\n  },\n\n  async delete(ctx: Koa.Context) {\n    const actionId: DeleteReleaseAction.Request['params']['actionId'] = ctx.params.actionId;\n    const releaseId: DeleteReleaseAction.Request['params']['releaseId'] = ctx.params.releaseId;\n\n    const releaseActionService = getService('release-action', { strapi });\n\n    const deletedReleaseAction = await releaseActionService.delete(actionId, releaseId);\n\n    ctx.body = {\n      data: deletedReleaseAction,\n    };\n  },\n};\n\nexport default releaseActionController;\n"],"names":["releaseActionController","create","ctx","releaseId","params","releaseActionArgs","request","body","validateReleaseAction","releaseActionService","getService","strapi","releaseAction","created","data","createMany","releaseActionsArgs","Promise","all","map","releaseService","releaseActions","db","transaction","action","disableUpdateReleaseStatus","error","AlreadyOnReleaseError","newReleaseActions","filter","length","updateReleaseStatus","meta","entriesAlreadyInRelease","totalEntries","findMany","permissionsManager","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_ACTION_MODEL_UID","validateFindManyActionsParams","query","groupBy","includes","badRequest","sort","sanitizeQuery","results","pagination","findPage","contentTypeOutputSanitizers","reduce","acc","contentType","contentTypePermissionsManager","sanitizeOutput","sanitizedResults","async","entry","groupedData","groupActions","contentTypes","getContentTypeModelsFromActions","components","getAllComponents","update","actionId","releaseActionUpdateArgs","validateReleaseActionUpdateSchema","updatedAction","delete","deletedReleaseAction"],"mappings":"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"}