UNPKG

@lucidcms/core

Version:

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

1 lines 13.2 kB
{"version":3,"file":"queue-jobs.mjs","names":["queryBuilder"],"sources":["../../../src/libs/repositories/queue-jobs.ts"],"sourcesContent":["import type { SelectQueryBuilder } from \"kysely\";\nimport z from \"zod\";\nimport type { QueryParams } from \"../../types/query-params.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport queryBuilder from \"../db/query-builder/index.js\";\nimport type { KyselyDB, LucidDB, LucidQueueJobs, Select } from \"../db/types.js\";\nimport StaticRepository from \"./parents/static-repository.js\";\nimport type { QueryProps } from \"./types.js\";\n\nexport default class QueueJobsRepository extends StaticRepository<\"lucid_queue_jobs\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_queue_jobs\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.union([z.string(), z.number()]),\n\t\tjob_id: z.string(),\n\t\tevent_type: z.string(),\n\t\tevent_data: z.record(z.string(), z.unknown()).nullable(),\n\t\tstatus: z.enum([\n\t\t\t\"pending\",\n\t\t\t\"processing\",\n\t\t\t\"completed\",\n\t\t\t\"failed\",\n\t\t\t\"cancelled\",\n\t\t]),\n\t\tqueue_adapter_key: z.string(),\n\t\tpriority: z.number().nullable(),\n\t\tattempts: z.number(),\n\t\tmax_attempts: z.number(),\n\t\terror_message: z.string().nullable(),\n\t\tcreated_at: z.union([z.string(), z.date()]).nullable(),\n\t\tscheduled_for: z.union([z.string(), z.date()]).nullable(),\n\t\tstarted_at: z.union([z.string(), z.date()]).nullable(),\n\t\tcompleted_at: z.union([z.string(), z.date()]).nullable(),\n\t\tfailed_at: z.union([z.string(), z.date()]).nullable(),\n\t\tnext_retry_at: z.union([z.string(), z.date()]).nullable(),\n\t\tcreated_by_user_id: z.union([z.string(), z.number()]).nullable(),\n\t\tupdated_at: z.union([z.string(), z.date()]).nullable(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\tjob_id: this.dbAdapter.getDataType(\"text\"),\n\t\tevent_type: this.dbAdapter.getDataType(\"text\"),\n\t\tevent_data: this.dbAdapter.getDataType(\"json\"),\n\t\tstatus: this.dbAdapter.getDataType(\"text\"),\n\t\tqueue_adapter_key: this.dbAdapter.getDataType(\"text\"),\n\t\tpriority: this.dbAdapter.getDataType(\"integer\"),\n\t\tattempts: this.dbAdapter.getDataType(\"integer\"),\n\t\tmax_attempts: this.dbAdapter.getDataType(\"integer\"),\n\t\terror_message: this.dbAdapter.getDataType(\"text\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tscheduled_for: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tstarted_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tcompleted_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tfailed_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tnext_retry_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tcreated_by_user_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tupdated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t};\n\tqueryConfig = {\n\t\ttableKeys: {\n\t\t\tfilters: {\n\t\t\t\tjobId: \"job_id\",\n\t\t\t\teventType: \"event_type\",\n\t\t\t\tstatus: \"status\",\n\t\t\t\tqueueAdapterKey: \"queue_adapter_key\",\n\t\t\t\tpriority: \"priority\",\n\t\t\t\tattempts: \"attempts\",\n\t\t\t\tmaxAttempts: \"max_attempts\",\n\t\t\t\terrorMessage: \"error_message\",\n\t\t\t\tcreatedByUserId: \"created_by_user_id\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tscheduledFor: \"scheduled_for\",\n\t\t\t\tstartedAt: \"started_at\",\n\t\t\t\tcompletedAt: \"completed_at\",\n\t\t\t\tfailedAt: \"failed_at\",\n\t\t\t\tnextRetryAt: \"next_retry_at\",\n\t\t\t},\n\t\t\tsorts: {\n\t\t\t\tjobId: \"job_id\",\n\t\t\t\teventType: \"event_type\",\n\t\t\t\tstatus: \"status\",\n\t\t\t\tqueueAdapterKey: \"queue_adapter_key\",\n\t\t\t\tpriority: \"priority\",\n\t\t\t\tattempts: \"attempts\",\n\t\t\t\tmaxAttempts: \"max_attempts\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tscheduledFor: \"scheduled_for\",\n\t\t\t\tstartedAt: \"started_at\",\n\t\t\t\tcompletedAt: \"completed_at\",\n\t\t\t\tfailedAt: \"failed_at\",\n\t\t\t\tnextRetryAt: \"next_retry_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t},\n\t\t},\n\t\toperators: {\n\t\t\teventType: \"contains\",\n\t\t\tqueueAdapterKey: \"contains\",\n\t\t\terrorMessage: \"contains\",\n\t\t},\n\t} as const;\n\n\t// ----------------------------------------\n\t// queries\n\tasync selectSingleById<\n\t\tK extends keyof Select<LucidQueueJobs>,\n\t\tV extends boolean = false,\n\t>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\tselect: K[];\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"lucid_queue_jobs\")\n\t\t\t.select(props.select)\n\t\t\t.where(\"id\", \"=\", props.id);\n\n\t\tquery = this.applyTenantScope(query, props.tenantKey);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() =>\n\t\t\t\tquery.executeTakeFirst() as Promise<\n\t\t\t\t\tPick<Select<LucidQueueJobs>, K> | undefined\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"selectSingleById\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"single\",\n\t\t\tselect: props.select as string[],\n\t\t});\n\t}\n\n\tasync selectMultipleFilteredFixed<\n\t\tK extends keyof Select<LucidQueueJobs>,\n\t\tV extends boolean = false,\n\t>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tselect: K[];\n\t\t\t\tqueryParams: Partial<QueryParams>;\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst exec = await this.executeQuery(\n\t\t\tasync () => {\n\t\t\t\tlet mainQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_queue_jobs\")\n\t\t\t\t\t.select(props.select);\n\t\t\t\tlet countQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_queue_jobs\")\n\t\t\t\t\t.select((eb) => eb.fn.countAll().as(\"count\"));\n\n\t\t\t\tmainQuery = this.applyTenantScope(mainQuery, props.tenantKey);\n\t\t\t\tcountQuery = this.applyTenantScope(countQuery, props.tenantKey);\n\n\t\t\t\tconst { main, count } = queryBuilder.main(\n\t\t\t\t\t{\n\t\t\t\t\t\tmain: mainQuery,\n\t\t\t\t\t\tcount: countQuery,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tqueryParams: props.queryParams,\n\t\t\t\t\t\tdatabase: this.dbAdapter.config,\n\t\t\t\t\t\tmeta: this.queryConfig,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst [mainResult, countResult] = await Promise.all([\n\t\t\t\t\tmain.execute() as unknown as Promise<\n\t\t\t\t\t\tPick<Select<LucidQueueJobs>, K>[]\n\t\t\t\t\t>,\n\t\t\t\t\tcount?.executeTakeFirst() as Promise<{ count: string } | undefined>,\n\t\t\t\t]);\n\n\t\t\t\treturn [mainResult, countResult] as const;\n\t\t\t},\n\t\t\t{\n\t\t\t\tmethod: \"selectMultipleFilteredFixed\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"multiple-count\",\n\t\t\tselect: props.select as string[],\n\t\t});\n\t}\n\n\tasync selectJobsForProcessing<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tdata: {\n\t\t\t\t\tlimit: number;\n\t\t\t\t\tcurrentTime: Date;\n\t\t\t\t};\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_queue_jobs\")\n\t\t\t.selectAll()\n\t\t\t.where((eb) =>\n\t\t\t\teb.and([\n\t\t\t\t\teb(\"status\", \"=\", \"pending\"),\n\t\t\t\t\teb.or([\n\t\t\t\t\t\teb(\"next_retry_at\", \"is\", null),\n\t\t\t\t\t\teb(\"next_retry_at\", \"<=\", props.data.currentTime.toISOString()),\n\t\t\t\t\t]),\n\t\t\t\t\teb.or([\n\t\t\t\t\t\teb(\"scheduled_for\", \"is\", null),\n\t\t\t\t\t\teb(\"scheduled_for\", \"<=\", props.data.currentTime.toISOString()),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.orderBy(\"priority\", \"desc\")\n\t\t\t.orderBy(\"created_at\", \"asc\")\n\t\t\t.limit(props.data.limit);\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"selectJobsForProcessing\",\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"multiple\",\n\t\t\tselectAll: true,\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// helpers\n\tprivate applyTenantScope<O>(\n\t\tquery: SelectQueryBuilder<LucidDB, \"lucid_queue_jobs\", O>,\n\t\ttenantKey?: string | null,\n\t): SelectQueryBuilder<LucidDB, \"lucid_queue_jobs\", O> {\n\t\tif (tenantKey == null) return query;\n\n\t\treturn query.where((eb) =>\n\t\t\teb.or([\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"lucid_queue_job_tenants\")\n\t\t\t\t\t\t.select(\"lucid_queue_job_tenants.id\")\n\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\"lucid_queue_job_tenants.queue_job_id\",\n\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\"lucid_queue_jobs.id\",\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.where(\"lucid_queue_job_tenants.tenant_key\", \"=\", tenantKey),\n\t\t\t\t),\n\t\t\t\teb.not(\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_queue_job_tenants\")\n\t\t\t\t\t\t\t.select(\"lucid_queue_job_tenants.id\")\n\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\"lucid_queue_job_tenants.queue_job_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_queue_jobs.id\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t]),\n\t\t);\n\t}\n}\n"],"mappings":"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"}