{"version":3,"file":"document-bricks.mjs","names":[],"sources":["../../../src/libs/repositories/document-bricks.ts"],"sourcesContent":["import z from \"zod\";\nimport type { CollectionSchemaColumn } from \"../collection/schema/types.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport type {\n\tKyselyDB,\n\tLucidBricksTable,\n\tLucidBrickTableName,\n\tLucidVersionTable,\n\tLucidVersionTableName,\n\tSelect,\n} from \"../db/types.js\";\nimport DynamicRepository from \"./parents/dynamic-repository.js\";\nimport type { DynamicConfig } from \"./types.js\";\n\nexport interface BrickQueryResponse extends Select<LucidVersionTable> {\n\t[key: LucidBrickTableName]: Select<LucidBricksTable>[];\n}\n\nexport default class DocumentBricksRepository extends DynamicRepository<LucidBrickTableName> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_document__collection-key__fld\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\tcollection_key: z.string(),\n\t\tdocument_id: z.number(),\n\t\tdocument_version_id: z.number(),\n\t\tlocale: z.string(),\n\t\tposition: z.number().optional(),\n\t\tis_open: 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\t// brick specific\n\t\tbrick_type: z.union([z.literal(\"fixed\"), z.literal(\"builder\")]).optional(),\n\t\tbrick_instance_id: z.string().optional(),\n\t\t// brick and document-field specific\n\t\tbrick_id_ref: z.number().optional(),\n\t\t// repeater specific\n\t\tbrick_id: z.number().optional(),\n\t\tparent_id: z.number().optional(),\n\t\tparent_id_ref: z.number().optional(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\tcollection_key: this.dbAdapter.getDataType(\"text\"),\n\t\tdocument_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tdocument_version_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tlocale: this.dbAdapter.getDataType(\"text\"),\n\t\tposition: this.dbAdapter.getDataType(\"integer\"),\n\t\tis_open: this.dbAdapter.getDataType(\"boolean\"),\n\t\t// brick specific\n\t\tbrick_type: this.dbAdapter.getDataType(\"text\"),\n\t\tbrick_instance_id: this.dbAdapter.getDataType(\"text\"),\n\t\t// brick and document-field specific\n\t\tbrick_id_ref: this.dbAdapter.getDataType(\"integer\"),\n\t\t// repeater specific\n\t\tbrick_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tparent_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tparent_id_ref: this.dbAdapter.getDataType(\"integer\"),\n\t};\n\tqueryConfig = undefined;\n\n\t/**\n\t * Fetches all brick rows for a given document version ID\n\t */\n\tasync selectMultipleByVersionId(\n\t\tprops: {\n\t\t\tversionId: number;\n\t\t\tdocumentId?: number;\n\t\t\tbricksSchema: Array<{\n\t\t\t\tname: LucidBrickTableName;\n\t\t\t\tcolumns: Array<CollectionSchemaColumn>;\n\t\t\t}>;\n\t\t},\n\t\tdynamicConfig: DynamicConfig<LucidVersionTableName>,\n\t) {\n\t\tconst { table, ref } = this.db.dynamic;\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(table(dynamicConfig.tableName).as(\"v\"))\n\t\t\t.where(ref(\"v.id\"), \"=\", props.versionId)\n\t\t\t.selectAll(\"v\");\n\n\t\tif (props.documentId) {\n\t\t\tquery = query.where(ref(\"v.document_id\"), \"=\", props.documentId);\n\t\t}\n\n\t\tfor (const brick of props.bricksSchema) {\n\t\t\tquery = query.select(() =>\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t.selectFrom(table(brick.name).as(\"b\"))\n\t\t\t\t\t\t\t.where(ref(\"b.document_version_id\"), \"=\", props.versionId)\n\t\t\t\t\t\t\t.select(brick.columns.map((c) => ref(`b.${c.name}`))),\n\t\t\t\t\t)\n\t\t\t\t\t.as(brick.name),\n\t\t\t);\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.executeTakeFirst() as unknown as Promise<BrickQueryResponse>,\n\t\t\t{\n\t\t\t\tmethod: \"selectMultipleByVersionId\",\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\tenabled: false,\n\t\t\tmode: \"single\",\n\t\t});\n\t}\n\n\t/**\n\t * Nullifies references to a deleted document in a single brick table\n\t */\n\tasync nullifyDocumentReferences(\n\t\tprops: {\n\t\t\tcolumns: Array<keyof LucidBricksTable>;\n\t\t\tdocumentId: number;\n\t\t},\n\t\tdynamicConfig: DynamicConfig<LucidBrickTableName>,\n\t) {\n\t\tif (props.columns.length === 0) {\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\n\t\tconst { table, ref } = this.db.dynamic;\n\n\t\tlet query = this.db.updateTable(table(dynamicConfig.tableName).as(\"t\"));\n\n\t\tconst updateObj: Record<string, null> = {};\n\t\tfor (const col of props.columns) {\n\t\t\tupdateObj[col] = null;\n\t\t}\n\t\tquery = query.set(updateObj);\n\n\t\tquery = query.where((eb) => {\n\t\t\tconst conditions = [];\n\n\t\t\tfor (const column of props.columns) {\n\t\t\t\tconditions.push(eb(ref(`t.${String(column)}`), \"=\", props.documentId));\n\t\t\t}\n\t\t\treturn eb.or(conditions);\n\t\t});\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"nullifyDocumentReferences\",\n\t\t\ttableName: dynamicConfig.tableName,\n\t\t});\n\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\tenabled: false,\n\t\t\tmode: \"single\",\n\t\t});\n\t}\n}\n"],"mappings":"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"}