@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 8.24 kB
Source Map (JSON)
{"version":3,"file":"delete-batch.mjs","names":["mediaServices.checks.checkHasMediaStrategy","mediaServices.checks.checkMediaAccess"],"sources":["../../../src/services/media/delete-batch.ts"],"sourcesContent":["import executeHooks from \"../../libs/hooks/execute-hooks.js\";\nimport cacheKeys from \"../../libs/kv/cache-keys.js\";\nimport { invalidateHttpCacheTags } from \"../../libs/kv/http-cache.js\";\nimport {\n\tMediaFoldersRepository,\n\tMediaRepository,\n} from \"../../libs/repositories/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { mediaServices } from \"../index.js\";\nimport checkFolderAccess from \"../media-folders/checks/check-folder-access.js\";\nimport clearClientMediaSingleCache from \"./helpers/clear-client-media-cache.js\";\n\nconst deleteBatch: ServiceFn<\n\t[\n\t\t{\n\t\t\tmediaIds: number[];\n\t\t\tfolderIds: number[];\n\t\t\trecursiveMedia: boolean;\n\t\t\tuserId: number;\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 MediaFolders = new MediaFoldersRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tif (\n\t\t(data.mediaIds?.length ?? 0) === 0 &&\n\t\t(data.folderIds?.length ?? 0) === 0\n\t) {\n\t\treturn { error: undefined, data: undefined };\n\t}\n\n\tif (data.mediaIds && data.mediaIds.length > 0) {\n\t\tconst mediaAccessRes = await mediaServices.checks.checkMediaAccess(\n\t\t\tcontext,\n\t\t\t{\n\t\t\t\tids: data.mediaIds,\n\t\t\t},\n\t\t);\n\t\tif (mediaAccessRes.error) return mediaAccessRes;\n\t}\n\n\tif (data.folderIds && data.folderIds.length > 0) {\n\t\tconst folderAccessResults = await Promise.all(\n\t\t\tdata.folderIds.map((folderId) =>\n\t\t\t\tcheckFolderAccess(context, {\n\t\t\t\t\tfolderId,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tconst folderAccessError = folderAccessResults.find((res) => res.error);\n\t\tif (folderAccessError?.error) {\n\t\t\treturn {\n\t\t\t\terror: folderAccessError.error,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\tlet descendantFolderIds: number[] = [];\n\tif (data.recursiveMedia && data.folderIds && data.folderIds.length > 0) {\n\t\tconst execFolders = await MediaFolders.getDescendantIds({\n\t\t\tfolderIds: data.folderIds,\n\t\t\ttenantKey: context.request.tenantKey,\n\t\t\tscope: \"read\",\n\t\t});\n\t\tif (execFolders.error) return execFolders;\n\n\t\tdescendantFolderIds = execFolders.data.map((r) => r.id);\n\t}\n\n\tconst recursiveMediaIds =\n\t\tdata.recursiveMedia && descendantFolderIds.length > 0\n\t\t\t? await Media.selectMultipleIdsByFolderIds({\n\t\t\t\t\tfolderIds: descendantFolderIds,\n\t\t\t\t\ttenantKey: context.request.tenantKey,\n\t\t\t\t\tvalidation: { enabled: true },\n\t\t\t\t})\n\t\t\t: undefined;\n\tif (recursiveMediaIds?.error) return recursiveMediaIds;\n\n\tconst updates = [\n\t\t...(data.mediaIds && data.mediaIds.length > 0\n\t\t\t? [\n\t\t\t\t\tMedia.updateMultiple({\n\t\t\t\t\t\twhere: [{ key: \"id\", operator: \"in\", value: data.mediaIds }],\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tis_deleted: true,\n\t\t\t\t\t\t\tis_deleted_at: new Date().toISOString(),\n\t\t\t\t\t\t\tdeleted_by: data.userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treturning: [\"id\"],\n\t\t\t\t\t}),\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(recursiveMediaIds !== undefined && recursiveMediaIds.data.length > 0\n\t\t\t? [\n\t\t\t\t\tMedia.updateMultiple({\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: \"id\",\n\t\t\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t\t\t\tvalue: recursiveMediaIds.data.map((media) => media.id),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tis_deleted: true,\n\t\t\t\t\t\t\tis_deleted_at: new Date().toISOString(),\n\t\t\t\t\t\t\tdeleted_by: data.userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treturning: [\"id\"],\n\t\t\t\t\t}),\n\t\t\t\t]\n\t\t\t: []),\n\t];\n\tconst clearCachePromises = [];\n\tconst deletedMediaIds = new Set<number>();\n\tif (updates.length > 0) {\n\t\tconst res = await Promise.all(updates);\n\t\tfor (const r of res) {\n\t\t\tif (r.error) return { error: r.error, data: undefined };\n\t\t\tif (r.data && r.data.length > 0) {\n\t\t\t\tfor (const item of r.data) {\n\t\t\t\t\tdeletedMediaIds.add(item.id);\n\t\t\t\t\tclearCachePromises.push(\n\t\t\t\t\t\tclearClientMediaSingleCache(context, item.id),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//* folders are deleted after otherwise we would orphan media before being able to mark them as deleted\n\tif (data.folderIds && data.folderIds.length > 0) {\n\t\tconst delFoldersRes = await MediaFolders.deleteMultiple({\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"id\",\n\t\t\t\t\toperator: \"in\",\n\t\t\t\t\tvalue: data.folderIds,\n\t\t\t\t},\n\t\t\t],\n\t\t\tvalidation: { enabled: false },\n\t\t});\n\t\tif (delFoldersRes.error) return delFoldersRes;\n\t}\n\n\tawait Promise.all([\n\t\t...clearCachePromises,\n\t\tinvalidateHttpCacheTags(context, [cacheKeys.http.tags.clientMedia]),\n\t]);\n\n\tif (deletedMediaIds.size > 0) {\n\t\tconst hookRes = await executeHooks(\n\t\t\tcontext,\n\t\t\t{\n\t\t\t\tservice: \"media\",\n\t\t\t\tevent: \"afterDelete\",\n\t\t\t\tconfig: context.config,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmeta: {\n\t\t\t\t\ttenantKey: context.request.tenantKey ?? null,\n\t\t\t\t},\n\t\t\t\tdata: {\n\t\t\t\t\tids: Array.from(deletedMediaIds),\n\t\t\t\t\tuserId: data.userId,\n\t\t\t\t\thardDelete: false,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (hookRes.error) return hookRes;\n\t}\n\n\treturn { error: undefined, data: undefined };\n};\n\nexport default deleteBatch;\n"],"mappings":"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"}