UNPKG

@lucidcms/core

Version:

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

1 lines 15.5 kB
{"version":3,"file":"dynamic-repository.mjs","names":["queryBuilder"],"sources":["../../../../src/libs/repositories/parents/dynamic-repository.ts"],"sourcesContent":["import queryBuilder, {\n\ttype QueryBuilderWhere,\n} from \"../../db/query-builder/index.js\";\nimport type { Insert, LucidDB, Select, Update } from \"../../db/types.js\";\nimport type { DynamicConfig, QueryProps } from \"../types.js\";\nimport BaseRepository from \"./base-repository.js\";\n\nabstract class DynamicRepository<\n\tTable extends keyof LucidDB,\n\tT extends LucidDB[Table] = LucidDB[Table],\n> extends BaseRepository<Table, T> {\n\t// ----------------------------------------\n\t// Queries\n\n\t// ----------------------------------------\n\t// selects\n\tasync selectSingle<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tselect: K[];\n\t\t\t\twhere: QueryBuilderWhere<Table>;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(dynamicConfig.tableName)\n\t\t\t// @ts-expect-error\n\t\t\t.select(props.select);\n\n\t\tquery = queryBuilder.select(query, props.where);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.executeTakeFirst() as Promise<Pick<Select<T>, K> | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"selectSingle\",\n\t\t\t\ttableName: dynamicConfig.tableName,\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\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\tasync selectMultiple<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tselect: K[];\n\t\t\t\twhere?: QueryBuilderWhere<Table>;\n\t\t\t\torderBy?: { column: K; direction: \"asc\" | \"desc\" }[];\n\t\t\t\tlimit?: number;\n\t\t\t\toffset?: number;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(dynamicConfig.tableName)\n\t\t\t// @ts-expect-error\n\t\t\t.select(props.select);\n\n\t\tif (props.where) {\n\t\t\tquery = queryBuilder.select(query, props.where);\n\t\t}\n\n\t\tif (props.orderBy) {\n\t\t\tfor (const order of props.orderBy) {\n\t\t\t\tquery = query.orderBy(order.column as string, order.direction);\n\t\t\t}\n\t\t}\n\n\t\tif (props.limit) {\n\t\t\tquery = query.limit(props.limit);\n\t\t}\n\n\t\tif (props.offset) {\n\t\t\tquery = query.offset(props.offset);\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as Promise<Pick<Select<T>, K>[]>,\n\t\t\t{\n\t\t\t\tmethod: \"selectMultiple\",\n\t\t\t\ttableName: dynamicConfig.tableName,\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\",\n\t\t\tselect: props.select as string[],\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// creates\n\tasync createSingle<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tdata: Partial<Insert<T>>;\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db.insertInto(dynamicConfig.tableName).values(\n\t\t\tthis.formatData(props.data, {\n\t\t\t\ttype: \"insert\",\n\t\t\t\tdynamicColumns: dynamicConfig.columns,\n\t\t\t}),\n\t\t);\n\n\t\tif (\n\t\t\tprops.returnAll !== true &&\n\t\t\tprops.returning &&\n\t\t\tprops.returning.length > 0\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returning(props.returning);\n\t\t}\n\n\t\tif (props.returnAll) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returningAll();\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.executeTakeFirst() as Promise<Pick<Select<T>, K> | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"createSingle\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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 as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\tasync createMultiple<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tdata: Partial<Insert<T>>[];\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db.insertInto(dynamicConfig.tableName).values(\n\t\t\tprops.data.map((d) =>\n\t\t\t\tthis.formatData(d, {\n\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\tdynamicColumns: dynamicConfig.columns,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\n\t\tif (\n\t\t\tprops.returnAll !== true &&\n\t\t\tprops.returning &&\n\t\t\tprops.returning.length > 0\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returning(props.returning);\n\t\t}\n\n\t\tif (props.returnAll) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returningAll();\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as Promise<Pick<Select<T>, K>[] | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"createMultiple\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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\tselect: props.returning as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// updates\n\tasync updateSingle<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\twhere: QueryBuilderWhere<Table>;\n\t\t\t\tdata: Partial<Update<T>>;\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.updateTable(dynamicConfig.tableName)\n\t\t\t// @ts-expect-error\n\t\t\t.set(\n\t\t\t\tthis.formatData(props.data, {\n\t\t\t\t\ttype: \"update\",\n\t\t\t\t\tdynamicColumns: dynamicConfig.columns,\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// @ts-expect-error\n\t\t\t.$if(props.returnAll ?? false, (qb) => qb.returningAll());\n\n\t\tquery = queryBuilder.update(query, props.where);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.executeTakeFirst() as Promise<Pick<Select<T>, K> | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"updateSingle\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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 as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\tasync updateMultiple<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\twhere: QueryBuilderWhere<Table>;\n\t\t\t\tdata: Partial<Update<T>>[];\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.updateTable(dynamicConfig.tableName)\n\t\t\t// @ts-expect-error\n\t\t\t.set(\n\t\t\t\tprops.data.map((data) => {\n\t\t\t\t\treturn this.formatData(data, {\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tdynamicColumns: dynamicConfig.columns,\n\t\t\t\t\t});\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// @ts-expect-error\n\t\t\t.$if(props.returnAll ?? false, (qb) => qb.returningAll());\n\n\t\tquery = queryBuilder.update(query, props.where);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as Promise<Pick<Select<T>, K>[] | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"updateMultiple\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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\tselect: props.returning as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\n\t// ----------------------------------------\n\t// deletes\n\tasync deleteSingle<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\twhere: QueryBuilderWhere<Table>;\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db.deleteFrom(dynamicConfig.tableName);\n\n\t\tif (\n\t\t\tprops.returnAll !== true &&\n\t\t\tprops.returning !== undefined &&\n\t\t\tprops.returning.length > 0\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returning(props.returning);\n\t\t}\n\n\t\tif (props.returnAll) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returningAll();\n\t\t}\n\n\t\t// @ts-expect-error\n\t\tquery = queryBuilder.delete(query, props.where);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.executeTakeFirst() as Promise<Pick<Select<T>, K> | undefined>,\n\t\t\t{\n\t\t\t\tmethod: \"deleteSingle\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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 as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n\tasync deleteMultiple<K extends keyof Select<T>, V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\twhere: QueryBuilderWhere<Table>;\n\t\t\t\treturning?: K[];\n\t\t\t\treturnAll?: true;\n\t\t\t}\n\t\t>,\n\t\tdynamicConfig: DynamicConfig<Table>,\n\t) {\n\t\tlet query = this.db.deleteFrom(dynamicConfig.tableName);\n\n\t\tif (\n\t\t\tprops.returnAll !== true &&\n\t\t\tprops.returning !== undefined &&\n\t\t\tprops.returning.length > 0\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returning(props.returning);\n\t\t}\n\n\t\tif (props.returnAll) {\n\t\t\t// @ts-expect-error\n\t\t\tquery = query.returningAll();\n\t\t}\n\n\t\t// @ts-expect-error\n\t\tquery = queryBuilder.delete(query, props.where);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as Promise<Pick<Select<T>, K>[]>,\n\t\t\t{\n\t\t\t\tmethod: \"deleteMultiple\",\n\t\t\t\ttableName: dynamicConfig.tableName,\n\t\t\t},\n\t\t);\n\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\tselect: props.returning as string[],\n\t\t\tselectAll: props.returnAll,\n\t\t\tschema: this.mergeSchema(dynamicConfig.schema),\n\t\t});\n\t}\n}\n\nexport default DynamicRepository;\n"],"mappings":"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"}