UNPKG

@lucidcms/core

Version:

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

1 lines 16.4 kB
{"version":3,"file":"emails.mjs","names":["queryBuilder"],"sources":["../../../src/libs/repositories/emails.ts"],"sourcesContent":["import type { SelectQueryBuilder } from \"kysely\";\nimport z from \"zod\";\nimport {\n\temailDeliveryStatusSchema,\n\temailPrioritySchema,\n} from \"../../schemas/email.js\";\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, LucidEmails, Select } from \"../db/types.js\";\nimport StaticRepository from \"./parents/static-repository.js\";\nimport type { QueryProps } from \"./types.js\";\nexport default class EmailsRepository extends StaticRepository<\"lucid_emails\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_emails\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\tfrom_address: z.string(),\n\t\tfrom_name: z.string(),\n\t\tto_address: z.string(),\n\t\tsubject: z.string(),\n\t\tcc: z.string().nullable(),\n\t\tbcc: z.string().nullable(),\n\t\ttemplate: z.string(),\n\t\tpriority: emailPrioritySchema,\n\t\theaders: z.record(z.string(), z.string()).nullable(),\n\t\tdata: z.record(z.string(), z.unknown()).nullable(),\n\t\tstorage_strategy: z.record(z.string(), z.unknown()).nullable(),\n\t\ttype: z.string(),\n\t\tis_system: z.union([\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t]),\n\t\tcurrent_status: emailDeliveryStatusSchema,\n\t\tattempt_count: z.number(),\n\t\tlast_attempted_at: z.union([z.string(), z.date()]).nullable(),\n\t\tcreated_at: z.union([z.string(), z.date()]).nullable(),\n\t\tupdated_at: z.union([z.string(), z.date()]).nullable(),\n\t\tattachments: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\ttype: z.literal(\"url\"),\n\t\t\t\t\turl: z.string(),\n\t\t\t\t\tfilename: z.string(),\n\t\t\t\t\tcontent_type: z.string().nullable(),\n\t\t\t\t\tdisposition: z.union([z.literal(\"attachment\"), z.literal(\"inline\")]),\n\t\t\t\t\tcontent_id: z.string().nullable(),\n\t\t\t\t\torder: z.number(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t\ttransactions: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\tdelivery_status: emailDeliveryStatusSchema,\n\t\t\t\t\tmessage: z.string().nullable(),\n\t\t\t\t\tstrategy_identifier: z.string(),\n\t\t\t\t\tstrategy_data: z.record(z.string(), z.unknown()).nullable(),\n\t\t\t\t\tsimulate: z.union([\n\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t]),\n\t\t\t\t\texternal_message_id: z.string().nullable(),\n\t\t\t\t\tcreated_at: z.union([z.string(), z.date()]).nullable(),\n\t\t\t\t\tupdated_at: z.union([z.string(), z.date()]).nullable(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t\ttenants: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\ttenant_key: z.string(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\tfrom_address: this.dbAdapter.getDataType(\"text\"),\n\t\tfrom_name: this.dbAdapter.getDataType(\"text\"),\n\t\tto_address: this.dbAdapter.getDataType(\"text\"),\n\t\tsubject: this.dbAdapter.getDataType(\"text\"),\n\t\tcc: this.dbAdapter.getDataType(\"text\"),\n\t\tbcc: this.dbAdapter.getDataType(\"text\"),\n\t\ttemplate: this.dbAdapter.getDataType(\"text\"),\n\t\tpriority: this.dbAdapter.getDataType(\"text\"),\n\t\theaders: this.dbAdapter.getDataType(\"json\"),\n\t\tdata: this.dbAdapter.getDataType(\"json\"),\n\t\tstorage_strategy: this.dbAdapter.getDataType(\"json\"),\n\t\ttype: this.dbAdapter.getDataType(\"text\"),\n\t\tis_system: this.dbAdapter.getDataType(\"boolean\"),\n\t\tcurrent_status: this.dbAdapter.getDataType(\"text\"),\n\t\tattempt_count: this.dbAdapter.getDataType(\"integer\"),\n\t\tlast_attempted_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tupdated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t};\n\tqueryConfig = {\n\t\ttableKeys: {\n\t\t\tfilters: {\n\t\t\t\tfromAddress: \"from_address\",\n\t\t\t\ttoAddress: \"to_address\",\n\t\t\t\tsubject: \"subject\",\n\t\t\t\ttype: \"type\",\n\t\t\t\ttemplate: \"template\",\n\t\t\t\tpriority: \"priority\",\n\t\t\t\tcurrentStatus: \"current_status\",\n\t\t\t\tattemptCount: \"attempt_count\",\n\t\t\t\tlastAttemptedAt: \"last_attempted_at\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t},\n\t\t\tsorts: {\n\t\t\t\tattemptCount: \"attempt_count\",\n\t\t\t\tlastAttemptedAt: \"last_attempted_at\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t},\n\t\t},\n\t\toperators: {\n\t\t\tsubject: \"contains\",\n\t\t\ttemplate: \"contains\",\n\t\t},\n\t} as const;\n\n\t// ----------------------------------------\n\t// queries\n\tasync selectSingleById<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tid: number;\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_emails\")\n\t\t\t.select((eb) => [\n\t\t\t\t\"id\",\n\t\t\t\t\"from_address\",\n\t\t\t\t\"from_name\",\n\t\t\t\t\"to_address\",\n\t\t\t\t\"subject\",\n\t\t\t\t\"cc\",\n\t\t\t\t\"bcc\",\n\t\t\t\t\"template\",\n\t\t\t\t\"priority\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"data\",\n\t\t\t\t\"storage_strategy\",\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_email_attachments\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.type\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.url\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.filename\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.content_type\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.disposition\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.content_id\",\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.order\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\"lucid_email_attachments.email_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_emails.id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.orderBy(\"lucid_email_attachments.order\", \"asc\"),\n\t\t\t\t\t)\n\t\t\t\t\t.as(\"attachments\"),\n\t\t\t\t\"type\",\n\t\t\t\t\"current_status\",\n\t\t\t\t\"attempt_count\",\n\t\t\t\t\"last_attempted_at\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_email_transactions\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.delivery_status\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.message\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.strategy_identifier\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.strategy_data\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.simulate\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.external_message_id\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.created_at\",\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.updated_at\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\"lucid_email_transactions.email_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_emails.id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.orderBy(\"lucid_email_transactions.created_at\", \"desc\"),\n\t\t\t\t\t)\n\t\t\t\t\t.as(\"transactions\"),\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_email_tenants\")\n\t\t\t\t\t\t\t.select([\"lucid_email_tenants.tenant_key\"])\n\t\t\t\t\t\t\t.whereRef(\"lucid_email_tenants.email_id\", \"=\", \"lucid_emails.id\"),\n\t\t\t\t\t)\n\t\t\t\t\t.as(\"tenants\"),\n\t\t\t])\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(() => query.executeTakeFirst(), {\n\t\t\tmethod: \"selectSingleById\",\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: [\n\t\t\t\t\"id\",\n\t\t\t\t\"from_address\",\n\t\t\t\t\"from_name\",\n\t\t\t\t\"to_address\",\n\t\t\t\t\"subject\",\n\t\t\t\t\"cc\",\n\t\t\t\t\"bcc\",\n\t\t\t\t\"template\",\n\t\t\t\t\"priority\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"data\",\n\t\t\t\t\"storage_strategy\",\n\t\t\t\t\"attachments\",\n\t\t\t\t\"type\",\n\t\t\t\t\"current_status\",\n\t\t\t\t\"attempt_count\",\n\t\t\t\t\"last_attempted_at\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"transactions\",\n\t\t\t\t\"tenants\",\n\t\t\t],\n\t\t});\n\t}\n\n\tasync selectMultipleFilteredFixed<\n\t\tK extends keyof Select<LucidEmails>,\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\tincludeSystem?: boolean;\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.selectFrom(\"lucid_emails\").select(props.select);\n\t\t\t\tlet countQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_emails\")\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\t\t\t\tif (props.includeSystem !== true) {\n\t\t\t\t\tconst nonSystemValue = this.dbAdapter.getDefault(\"boolean\", \"false\");\n\t\t\t\t\tmainQuery = mainQuery.where(\"is_system\", \"=\", nonSystemValue);\n\t\t\t\t\tcountQuery = countQuery.where(\"is_system\", \"=\", nonSystemValue);\n\t\t\t\t}\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<Pick<Select<LucidEmails>, K>[]>,\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,\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// helpers\n\tprivate applyTenantScope<O>(\n\t\tquery: SelectQueryBuilder<LucidDB, \"lucid_emails\", O>,\n\t\ttenantKey?: string | null,\n\t): SelectQueryBuilder<LucidDB, \"lucid_emails\", 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_email_tenants\")\n\t\t\t\t\t\t.select(\"lucid_email_tenants.id\")\n\t\t\t\t\t\t.whereRef(\"lucid_email_tenants.email_id\", \"=\", \"lucid_emails.id\")\n\t\t\t\t\t\t.where(\"lucid_email_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_email_tenants\")\n\t\t\t\t\t\t\t.select(\"lucid_email_tenants.id\")\n\t\t\t\t\t\t\t.whereRef(\"lucid_email_tenants.email_id\", \"=\", \"lucid_emails.id\"),\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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"}