@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 4.57 kB
Source Map (JSON)
{"version":3,"file":"delete-expired-deleted-documents.mjs","names":[],"sources":["../../../src/services/crons/delete-expired-deleted-documents.ts"],"sourcesContent":["import { getDocumentTableSchema } from \"../../libs/collection/schema/runtime/runtime-schema-selectors.js\";\nimport { DocumentsRepository } from \"../../libs/repositories/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport getRetentionDays from \"./helpers/get-retention-days.js\";\nimport groupQueuePayloadsByTenant from \"./helpers/group-queue-payloads-by-tenant.js\";\n\n/**\n * Finds all soft-deleted documents for all collections that are older than 30 days and queues them for permanent deletion\n */\nconst deleteExpiredDeletedDocuments: ServiceFn<[], undefined> = async (\n\tcontext,\n) => {\n\tconst Documents = new DocumentsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst collectionKeys = context.config.collections.map(\n\t\t(collection) => collection.key,\n\t);\n\n\tconst docTablesRes = await Promise.all(\n\t\tcollectionKeys.map((key) => getDocumentTableSchema(context, key)),\n\t);\n\tfor (const item of docTablesRes) {\n\t\tif (item.error) return item;\n\t}\n\n\tconst docTables = docTablesRes\n\t\t.map((table) => table.data)\n\t\t.filter((table) => table !== undefined);\n\n\tconst compDate = getRetentionDays(\n\t\tcontext.config.retention,\n\t\t\"deletedDocuments\",\n\t);\n\n\tconst expiredDocLookup = await Promise.all(\n\t\tdocTables.map(async (table) => {\n\t\t\tconst softDeletedDocsRes = await Documents.selectMultiple(\n\t\t\t\t{\n\t\t\t\t\tselect: [\n\t\t\t\t\t\t\"id\",\n\t\t\t\t\t\t\"collection_key\",\n\t\t\t\t\t\t\"deleted_by\",\n\t\t\t\t\t\t\"created_by\",\n\t\t\t\t\t\t\"tenant_key\",\n\t\t\t\t\t],\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: \"is_deleted\",\n\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\tvalue: context.config.db.getDefault(\"boolean\", \"true\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: \"is_deleted_at\",\n\t\t\t\t\t\t\toperator: \"<\",\n\t\t\t\t\t\t\tvalue: compDate,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttableName: table.name,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (softDeletedDocsRes.error) return softDeletedDocsRes;\n\n\t\t\tif (softDeletedDocsRes.data.length === 0) return;\n\n\t\t\tconst groups = groupQueuePayloadsByTenant(\n\t\t\t\tsoftDeletedDocsRes.data.map((d) => ({\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tid: d.id,\n\t\t\t\t\t\tcollectionKey: d.collection_key,\n\t\t\t\t\t\tuserId: d.deleted_by ?? d.created_by,\n\t\t\t\t\t\ttenantKey: d.tenant_key,\n\t\t\t\t\t},\n\t\t\t\t\ttenantKeys: [d.tenant_key],\n\t\t\t\t})),\n\t\t\t);\n\n\t\t\tfor (const group of groups) {\n\t\t\t\tconst queueRes = await context.queue.addBatch(context, {\n\t\t\t\t\tevent: \"documents:delete\",\n\t\t\t\t\tpayloads: group.payloads,\n\t\t\t\t\toptions:\n\t\t\t\t\t\tgroup.tenantKeys.length > 0\n\t\t\t\t\t\t\t? { tenantKeys: group.tenantKeys }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t\tif (queueRes.error) return queueRes;\n\t\t\t}\n\t\t}),\n\t);\n\tfor (const result of expiredDocLookup) {\n\t\tif (result?.error) return result;\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default deleteExpiredDeletedDocuments;\n"],"mappings":"4QASA,MAAM,EAA0D,KAC/D,IACI,CACJ,IAAM,EAAY,IAAI,EACrB,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EACM,EAAiB,EAAQ,OAAO,YAAY,IAChD,GAAe,EAAW,GAC5B,EAEM,EAAe,MAAM,QAAQ,IAClC,EAAe,IAAK,GAAQ,EAAuB,EAAS,CAAG,CAAC,CACjE,EACA,IAAK,IAAM,KAAQ,EAClB,GAAI,EAAK,MAAO,OAAO,EAGxB,IAAM,EAAY,EAChB,IAAK,GAAU,EAAM,IAAI,CAAC,CAC1B,OAAQ,GAAU,IAAU,IAAA,EAAS,EAEjC,EAAW,EAChB,EAAQ,OAAO,UACf,kBACD,EAEM,EAAmB,MAAM,QAAQ,IACtC,EAAU,IAAI,KAAO,IAAU,CAC9B,IAAM,EAAqB,MAAM,EAAU,eAC1C,CACC,OAAQ,CACP,KACA,iBACA,aACA,aACA,YACD,EACA,MAAO,CACN,CACC,IAAK,aACL,SAAU,IACV,MAAO,EAAQ,OAAO,GAAG,WAAW,UAAW,MAAM,CACtD,EACA,CACC,IAAK,gBACL,SAAU,IACV,MAAO,CACR,CACD,EACA,WAAY,CACX,QAAS,EACV,CACD,EACA,CACC,UAAW,EAAM,IAClB,CACD,EACA,GAAI,EAAmB,MAAO,OAAO,EAErC,GAAI,EAAmB,KAAK,SAAW,EAAG,OAE1C,IAAM,EAAS,EACd,EAAmB,KAAK,IAAK,IAAO,CACnC,QAAS,CACR,GAAI,EAAE,GACN,cAAe,EAAE,eACjB,OAAQ,EAAE,YAAc,EAAE,WAC1B,UAAW,EAAE,UACd,EACA,WAAY,CAAC,EAAE,UAAU,CAC1B,EAAE,CACH,EAEA,IAAK,IAAM,KAAS,EAAQ,CAC3B,IAAM,EAAW,MAAM,EAAQ,MAAM,SAAS,EAAS,CACtD,MAAO,mBACP,SAAU,EAAM,SAChB,QACC,EAAM,WAAW,OAAS,EACvB,CAAE,WAAY,EAAM,UAAW,EAC/B,IAAA,EACL,CAAC,EACD,GAAI,EAAS,MAAO,OAAO,CAC5B,CACD,CAAC,CACF,EACA,IAAK,IAAM,KAAU,EACpB,GAAI,GAAQ,MAAO,OAAO,EAG3B,MAAO,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,CACD"}