@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 7.27 kB
Source Map (JSON)
{"version":3,"file":"options.mjs","names":[],"sources":["../../../src/libs/repositories/options.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport z from \"zod\";\nimport { optionsNameSchema } from \"../../schemas/options.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport type { Insert, KyselyDB, LucidOptions, Select } from \"../db/types.js\";\nimport StaticRepository from \"./parents/static-repository.js\";\nimport type { QueryProps } from \"./types.js\";\n\nexport default class OptionsRepository extends StaticRepository<\"lucid_options\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_options\");\n\t}\n\ttableSchema = z.object({\n\t\tname: optionsNameSchema,\n\t\tvalue_int: z.number().nullable(),\n\t\tvalue_text: z.string().nullable(),\n\t\tvalue_bool: z\n\t\t\t.union([\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t])\n\t\t\t.nullable(),\n\t});\n\tcolumnFormats = {\n\t\tname: this.dbAdapter.getDataType(\"text\"),\n\t\tvalue_int: this.dbAdapter.getDataType(\"integer\"),\n\t\tvalue_text: this.dbAdapter.getDataType(\"text\"),\n\t\tvalue_bool: this.dbAdapter.getDataType(\"boolean\"),\n\t};\n\tqueryConfig = undefined;\n\n\t// ----------------------------------------\n\t// upserts\n\tasync upsertSingle<\n\t\tK extends keyof Select<LucidOptions>,\n\t\tV extends boolean = false,\n\t>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tdata: Partial<Insert<LucidOptions>>;\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.insertInto(\"lucid_options\")\n\t\t\t.values(\n\t\t\t\tthis.formatData(props.data, {\n\t\t\t\t\ttype: \"insert\",\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.onConflict((oc) =>\n\t\t\t\toc.column(\"name\").doUpdateSet((eb) => ({\n\t\t\t\t\tvalue_int: eb.ref(\"excluded.value_int\"),\n\t\t\t\t\tvalue_text: eb.ref(\"excluded.value_text\"),\n\t\t\t\t\tvalue_bool: eb.ref(\"excluded.value_bool\"),\n\t\t\t\t})),\n\t\t\t)\n\t\t\t.$if(\n\t\t\t\tprops.returnAll !== true &&\n\t\t\t\t\tprops.returning !== undefined &&\n\t\t\t\t\tprops.returning.length > 0,\n\t\t\t\t// @ts-expect-error\n\t\t\t\t(qb) => qb.returning(props.returning),\n\t\t\t)\n\t\t\t.$if(props.returnAll ?? false, (qb) => qb.returningAll());\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<LucidOptions>, K> | undefined\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"upsertSingle\",\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.returning,\n\t\t\tselectAll: props.returnAll,\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// queries\n\tasync selectMediaStorageUsageOptions() {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_options\")\n\t\t\t.select([\"name\", \"value_int\"]);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() =>\n\t\t\t\tquery.execute() as Promise<\n\t\t\t\t\t{ name: Select<LucidOptions>[\"name\"]; value_int: number | null }[]\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"selectMediaStorageUsageOptions\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\tconst filteredExec = {\n\t\t\t...exec,\n\t\t\tresponse: {\n\t\t\t\t...exec.response,\n\t\t\t\tdata: exec.response.data.filter(\n\t\t\t\t\t(option) =>\n\t\t\t\t\t\toption.name === \"media_storage_used\" ||\n\t\t\t\t\t\toption.name.startsWith(\"media_storage_used:t:\"),\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\n\t\treturn this.validateResponse(filteredExec, {\n\t\t\tenabled: true,\n\t\t\tmode: \"multiple\",\n\t\t\tselect: [\"name\", \"value_int\"],\n\t\t});\n\t}\n\n\tasync adjustInt<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\tname: Select<LucidOptions>[\"name\"];\n\t\t\t\t\tdelta: number;\n\t\t\t\t\tmax?: number;\n\t\t\t\t\tmin?: number;\n\t\t\t\t};\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst min = props.data.min ?? 0;\n\n\t\tlet query = this.db\n\t\t\t.updateTable(\"lucid_options\")\n\t\t\t.set({\n\t\t\t\tvalue_int: sql<number>`CASE\n\t\t\t\t\tWHEN COALESCE(value_int, 0) + ${props.data.delta} < ${min} THEN ${min}\n\t\t\t\t\tELSE COALESCE(value_int, 0) + ${props.data.delta}\n\t\t\t\tEND`,\n\t\t\t})\n\t\t\t.where(\"name\", \"=\", props.data.name);\n\n\t\tif (props.data.max !== undefined && props.data.delta > 0) {\n\t\t\tquery = query.where(\n\t\t\t\tsql<number>`COALESCE(value_int, 0) + ${props.data.delta}`,\n\t\t\t\t\"<=\",\n\t\t\t\tprops.data.max,\n\t\t\t);\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\tasync () => {\n\t\t\t\tconst updateRes = await query.executeTakeFirst();\n\t\t\t\treturn {\n\t\t\t\t\tcount: Number(updateRes.numUpdatedRows ?? 0n),\n\t\t\t\t};\n\t\t\t},\n\t\t\t{\n\t\t\t\tmethod: \"adjustInt\",\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: \"count\",\n\t\t});\n\t}\n}\n"],"mappings":"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"}