@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 5.78 kB
Source Map (JSON)
{"version":3,"file":"permanently-delete-media.mjs","names":["mediaServices.checks.checkHasMediaStrategy","mediaServices.strategies.deleteObject"],"sources":["../../../../src/services/media/helpers/permanently-delete-media.ts"],"sourcesContent":["import { copy } from \"../../../libs/i18n/index.js\";\nimport cacheKeys from \"../../../libs/kv/cache-keys.js\";\nimport { invalidateHttpCacheTags } from \"../../../libs/kv/http-cache.js\";\nimport {\n\tMediaRepository,\n\tProcessedImagesRepository,\n} from \"../../../libs/repositories/index.js\";\nimport { resolveMediaKeyTenant } from \"../../../utils/media/index.js\";\nimport type { ServiceFn } from \"../../../utils/services/types.js\";\nimport { mediaServices } from \"../../index.js\";\nimport clearClientMediaSingleCache from \"./clear-client-media-cache.js\";\n\n/** Permanently deletes owned descendants before their parent and stored objects. */\nconst permanentlyDeleteMedia: ServiceFn<\n\t[\n\t\t{\n\t\t\tid: number;\n\t\t\tinvalidateCache?: boolean;\n\t\t},\n\t],\n\tundefined\n> = async (context, data) => {\n\tconst mediaStrategyRes =\n\t\tawait mediaServices.checks.checkHasMediaStrategy(context);\n\tif (mediaStrategyRes.error) return mediaStrategyRes;\n\n\tconst Media = new MediaRepository(context.db.client, context.config.db);\n\tconst ProcessedImages = new ProcessedImagesRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst getMediaRes = await Media.selectSingleById({\n\t\tid: data.id,\n\t\ttenantKey: context.request.tenantKey,\n\t\tincludeOwned: true,\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t\tdefaultError: {\n\t\t\t\tmessage: copy(\"server:core.media.not.found.message\"),\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t},\n\t});\n\tif (getMediaRes.error) return getMediaRes;\n\n\tconst childrenRes = await Media.selectMultiple({\n\t\tselect: [\"id\"],\n\t\twhere: [\n\t\t\t{ key: \"parent_media_id\", operator: \"=\", value: getMediaRes.data.id },\n\t\t],\n\t\tvalidation: { enabled: true },\n\t});\n\tif (childrenRes.error) return childrenRes;\n\n\tconst childDeleteResults = await Promise.all(\n\t\tchildrenRes.data.map((child) =>\n\t\t\tpermanentlyDeleteMedia(context, {\n\t\t\t\tid: child.id,\n\t\t\t\tinvalidateCache: false,\n\t\t\t}),\n\t\t),\n\t);\n\tconst failedChildDelete = childDeleteResults.find((result) => result.error);\n\tif (failedChildDelete) return failedChildDelete;\n\n\tconst [processedImagesRes, deleteMediaRes] = await Promise.all([\n\t\tProcessedImages.selectMultiple({\n\t\t\tselect: [\"key\", \"file_size\"],\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"media_key\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: getMediaRes.data.key,\n\t\t\t\t},\n\t\t\t],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t}),\n\t\tMedia.deleteSingle({\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"id\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: data.id,\n\t\t\t\t},\n\t\t\t],\n\t\t\treturning: [\"file_size\", \"id\", \"key\", \"tenant_key\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t}),\n\t]);\n\tif (processedImagesRes.error) return processedImagesRes;\n\tif (deleteMediaRes.error) return deleteMediaRes;\n\tconst tenant = resolveMediaKeyTenant(context.config, deleteMediaRes.data.key);\n\n\tconst [_, deleteObjectRes] = await Promise.all([\n\t\tmediaStrategyRes.data.deleteMultiple(context, {\n\t\t\tkeys: processedImagesRes.data.map((i) => i.key),\n\t\t\ttenant,\n\t\t}),\n\t\tmediaServices.strategies.deleteObject(context, {\n\t\t\tkey: deleteMediaRes.data.key,\n\t\t\tsize: deleteMediaRes.data.file_size,\n\t\t\tprocessedSize: processedImagesRes.data.reduce(\n\t\t\t\t(acc, i) => acc + i.file_size,\n\t\t\t\t0,\n\t\t\t),\n\t\t\ttenantKey: deleteMediaRes.data.tenant_key,\n\t\t}),\n\t]);\n\tif (deleteObjectRes.error) return deleteObjectRes;\n\n\tif (data.invalidateCache !== false) {\n\t\tawait Promise.all([\n\t\t\tclearClientMediaSingleCache(context, data.id),\n\t\t\tinvalidateHttpCacheTags(context, [cacheKeys.http.tags.clientMedia]),\n\t\t]);\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default permanentlyDeleteMedia;\n"],"mappings":"6fAaA,MAAM,EAQF,MAAO,EAAS,IAAS,CAC5B,IAAM,EACL,MAAMA,EAA2C,CAAO,EACzD,GAAI,EAAiB,MAAO,OAAO,EAEnC,IAAM,EAAQ,IAAI,EAAgB,EAAQ,GAAG,OAAQ,EAAQ,OAAO,EAAE,EAChE,EAAkB,IAAI,EAC3B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EAEM,EAAc,MAAM,EAAM,iBAAiB,CAChD,GAAI,EAAK,GACT,UAAW,EAAQ,QAAQ,UAC3B,aAAc,GACd,WAAY,CACX,QAAS,GACT,aAAc,CACb,QAAS,EAAK,qCAAqC,EACnD,OAAQ,GACT,CACD,CACD,CAAC,EACD,GAAI,EAAY,MAAO,OAAO,EAE9B,IAAM,EAAc,MAAM,EAAM,eAAe,CAC9C,OAAQ,CAAC,IAAI,EACb,MAAO,CACN,CAAE,IAAK,kBAAmB,SAAU,IAAK,MAAO,EAAY,KAAK,EAAG,CACrE,EACA,WAAY,CAAE,QAAS,EAAK,CAC7B,CAAC,EACD,GAAI,EAAY,MAAO,OAAO,EAU9B,IAAM,GAAoB,MARO,QAAQ,IACxC,EAAY,KAAK,IAAK,GACrB,EAAuB,EAAS,CAC/B,GAAI,EAAM,GACV,gBAAiB,EAClB,CAAC,CACF,CACD,EAAA,CAC6C,KAAM,GAAW,EAAO,KAAK,EAC1E,GAAI,EAAmB,OAAO,EAE9B,GAAM,CAAC,EAAoB,GAAkB,MAAM,QAAQ,IAAI,CAC9D,EAAgB,eAAe,CAC9B,OAAQ,CAAC,MAAO,WAAW,EAC3B,MAAO,CACN,CACC,IAAK,YACL,SAAU,IACV,MAAO,EAAY,KAAK,GACzB,CACD,EACA,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,EAAM,aAAa,CAClB,MAAO,CACN,CACC,IAAK,KACL,SAAU,IACV,MAAO,EAAK,EACb,CACD,EACA,UAAW,CAAC,YAAa,KAAM,MAAO,YAAY,EAClD,WAAY,CACX,QAAS,EACV,CACD,CAAC,CACF,CAAC,EACD,GAAI,EAAmB,MAAO,OAAO,EACrC,GAAI,EAAe,MAAO,OAAO,EACjC,IAAM,EAAS,EAAsB,EAAQ,OAAQ,EAAe,KAAK,GAAG,EAEtE,CAAC,EAAG,GAAmB,MAAM,QAAQ,IAAI,CAC9C,EAAiB,KAAK,eAAe,EAAS,CAC7C,KAAM,EAAmB,KAAK,IAAK,GAAM,EAAE,GAAG,EAC9C,QACD,CAAC,EACDC,EAAsC,EAAS,CAC9C,IAAK,EAAe,KAAK,IACzB,KAAM,EAAe,KAAK,UAC1B,cAAe,EAAmB,KAAK,QACrC,EAAK,IAAM,EAAM,EAAE,UACpB,CACD,EACA,UAAW,EAAe,KAAK,UAChC,CAAC,CACF,CAAC,EAUD,OATI,EAAgB,MAAc,GAE9B,EAAK,kBAAoB,IAC5B,MAAM,QAAQ,IAAI,CACjB,EAA4B,EAAS,EAAK,EAAE,EAC5C,EAAwB,EAAS,CAAC,EAAU,KAAK,KAAK,WAAW,CAAC,CACnE,CAAC,EAGK,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,EACD"}