UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 4.08 kB
{"version":3,"file":"delete-expired-deleted-users.mjs","names":[],"sources":["../../../src/services/crons/delete-expired-deleted-users.ts"],"sourcesContent":["import {\n\tUsersRepository,\n\tUserTenantsRepository,\n} 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 users older than 30 days and queues them for permanent deletion\n */\nconst deleteExpiredDeletedUsers: ServiceFn<[], undefined> = async (context) => {\n\tconst Users = new UsersRepository(context.db.client, context.config.db);\n\tconst UserTenants = new UserTenantsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst compDate = getRetentionDays(context.config.retention, \"deletedUsers\");\n\n\tconst softDeletedUsersRes = await Users.selectMultiple({\n\t\tselect: [\"id\"],\n\t\twhere: [\n\t\t\t{\n\t\t\t\tkey: \"is_deleted\",\n\t\t\t\toperator: \"=\",\n\t\t\t\tvalue: context.config.db.getDefault(\"boolean\", \"true\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"is_deleted_at\",\n\t\t\t\toperator: \"<\",\n\t\t\t\tvalue: compDate,\n\t\t\t},\n\t\t],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (softDeletedUsersRes.error) return softDeletedUsersRes;\n\n\tif (softDeletedUsersRes.data.length === 0) {\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst userIds = softDeletedUsersRes.data.map((user) => user.id);\n\tconst userTenantsRes = await UserTenants.selectMultiple({\n\t\tselect: [\"user_id\", \"tenant_key\"],\n\t\twhere: [\n\t\t\t{\n\t\t\t\tkey: \"user_id\",\n\t\t\t\toperator: \"in\",\n\t\t\t\tvalue: userIds,\n\t\t\t},\n\t\t],\n\t});\n\tif (userTenantsRes.error) return userTenantsRes;\n\n\tconst tenantKeysByUserId = new Map<number, string[]>();\n\tfor (const userTenant of userTenantsRes.data ?? []) {\n\t\tconst tenantKeys = tenantKeysByUserId.get(userTenant.user_id) ?? [];\n\t\ttenantKeys.push(userTenant.tenant_key);\n\t\ttenantKeysByUserId.set(userTenant.user_id, tenantKeys);\n\t}\n\n\tconst groups = groupQueuePayloadsByTenant(\n\t\tsoftDeletedUsersRes.data.map((user) => ({\n\t\t\tpayload: {\n\t\t\t\tid: user.id,\n\t\t\t},\n\t\t\ttenantKeys: tenantKeysByUserId.get(user.id),\n\t\t})),\n\t);\n\n\tfor (const group of groups) {\n\t\tconst queueRes = await context.queue.addBatch(context, {\n\t\t\tevent: \"users:delete\",\n\t\t\tpayloads: group.payloads,\n\t\t\toptions:\n\t\t\t\tgroup.tenantKeys.length > 0\n\t\t\t\t\t? { tenantKeys: group.tenantKeys }\n\t\t\t\t\t: undefined,\n\t\t});\n\t\tif (queueRes.error) return queueRes;\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default deleteExpiredDeletedUsers;\n"],"mappings":"qNAWA,MAAM,EAAsD,KAAO,IAAY,CAC9E,IAAM,EAAQ,IAAI,EAAgB,EAAQ,GAAG,OAAQ,EAAQ,OAAO,EAAE,EAChE,EAAc,IAAI,EACvB,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EAEM,EAAW,EAAiB,EAAQ,OAAO,UAAW,cAAc,EAEpE,EAAsB,MAAM,EAAM,eAAe,CACtD,OAAQ,CAAC,IAAI,EACb,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,CAAC,EACD,GAAI,EAAoB,MAAO,OAAO,EAEtC,GAAI,EAAoB,KAAK,SAAW,EACvC,MAAO,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,EAGD,IAAM,EAAU,EAAoB,KAAK,IAAK,GAAS,EAAK,EAAE,EACxD,EAAiB,MAAM,EAAY,eAAe,CACvD,OAAQ,CAAC,UAAW,YAAY,EAChC,MAAO,CACN,CACC,IAAK,UACL,SAAU,KACV,MAAO,CACR,CACD,CACD,CAAC,EACD,GAAI,EAAe,MAAO,OAAO,EAEjC,IAAM,EAAqB,IAAI,IAC/B,IAAK,IAAM,KAAc,EAAe,MAAQ,CAAC,EAAG,CACnD,IAAM,EAAa,EAAmB,IAAI,EAAW,OAAO,GAAK,CAAC,EAClE,EAAW,KAAK,EAAW,UAAU,EACrC,EAAmB,IAAI,EAAW,QAAS,CAAU,CACtD,CAEA,IAAM,EAAS,EACd,EAAoB,KAAK,IAAK,IAAU,CACvC,QAAS,CACR,GAAI,EAAK,EACV,EACA,WAAY,EAAmB,IAAI,EAAK,EAAE,CAC3C,EAAE,CACH,EAEA,IAAK,IAAM,KAAS,EAAQ,CAC3B,IAAM,EAAW,MAAM,EAAQ,MAAM,SAAS,EAAS,CACtD,MAAO,eACP,SAAU,EAAM,SAChB,QACC,EAAM,WAAW,OAAS,EACvB,CAAE,WAAY,EAAM,UAAW,EAC/B,IAAA,EACL,CAAC,EACD,GAAI,EAAS,MAAO,OAAO,CAC5B,CAEA,MAAO,CACN,MAAO,IAAA,GACP,KAAM,IAAA,EACP,CACD"}