@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 7.07 kB
Source Map (JSON)
{"version":3,"file":"fetch-refs.mjs","names":["collectionServices.getSingleInstance"],"sources":["../../../../../../src/libs/collection/custom-fields/fields/relation/fetch-refs.ts"],"sourcesContent":["import { collectionServices } from \"../../../../../services/index.js\";\nimport type {\n\tDocumentVersionType,\n\tLucidBrickTableName,\n\tLucidDocumentTableName,\n} from \"../../../../../types.js\";\nimport type { ServiceFn } from \"../../../../../utils/services/types.js\";\nimport type { BrickQueryResponse } from \"../../../../repositories/document-bricks.js\";\nimport { DocumentVersionsRepository } from \"../../../../repositories/index.js\";\nimport extractCollectionKey from \"../../../helpers/extract-collection-key.js\";\nimport primeRuntimeSchemas from \"../../../schema/runtime/prime-runtime-schemas.js\";\nimport {\n\tgetDocumentFieldsTableSchema,\n\tgetDocumentVersionTableSchema,\n} from \"../../../schema/runtime/runtime-schema-selectors.js\";\nimport type { CollectionSchemaTable } from \"../../../schema/types.js\";\nimport type {\n\tFieldRefFetchInput,\n\tFieldRefFetchOutput,\n} from \"../../utils/ref-fetch.js\";\n\ntype RelationRefFetchTarget = {\n\ttable: LucidDocumentTableName;\n\tcollectionKey: string;\n\tids: number[];\n\tversionType: Exclude<DocumentVersionType, \"revision\">;\n};\n\nconst fetchRelationRefs: ServiceFn<\n\t[FieldRefFetchInput],\n\tFieldRefFetchOutput\n> = async (context, data) => {\n\tconst DocumentVersions = new DocumentVersionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\tconst targetsByVersion = new Map<string, RelationRefFetchTarget>();\n\tfor (const relation of data.relations) {\n\t\tif (!relation.table.startsWith(\"lucid_document__\")) continue;\n\n\t\tconst table = relation.table as LucidDocumentTableName;\n\t\tconst collectionKey = extractCollectionKey(table);\n\t\tif (!collectionKey) continue;\n\n\t\tconst ids = Array.from(relation.values).filter(\n\t\t\t(value): value is number => typeof value === \"number\",\n\t\t);\n\t\tif (ids.length === 0) continue;\n\n\t\tconst versionType =\n\t\t\tdata.resolveVersionType?.({\n\t\t\t\tfieldType: \"relation\",\n\t\t\t\ttable: relation.table,\n\t\t\t\tcollectionKey,\n\t\t\t}) ?? data.versionType;\n\t\tconst mapKey = `${table}:${versionType}`;\n\t\tconst existing = targetsByVersion.get(mapKey);\n\n\t\tif (existing) {\n\t\t\texisting.ids = Array.from(new Set([...existing.ids, ...ids]));\n\t\t\tcontinue;\n\t\t}\n\n\t\ttargetsByVersion.set(mapKey, {\n\t\t\ttable,\n\t\t\tcollectionKey,\n\t\t\tids: Array.from(new Set(ids)),\n\t\t\tversionType,\n\t\t});\n\t}\n\n\tconst values = Array.from(targetsByVersion.values());\n\n\tif (values.length === 0) {\n\t\treturn {\n\t\t\tdata: {\n\t\t\t\trows: [] satisfies Array<BrickQueryResponse>,\n\t\t\t\tmeta: {\n\t\t\t\t\trelation: {\n\t\t\t\t\t\tfieldsSchemaByCollection: {},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\terror: undefined,\n\t\t};\n\t}\n\n\tconst collectionKeys = values\n\t\t.map((v) => v.collectionKey)\n\t\t.filter((c, i, self) => self.indexOf(c) === i);\n\n\tconst cacheSchemaRes = await primeRuntimeSchemas(context, {\n\t\tcollectionKeys: collectionKeys,\n\t});\n\tif (cacheSchemaRes.error) return cacheSchemaRes;\n\n\tconst unionData = values.map(async (v) => {\n\t\tconst collectionRes = collectionServices.getSingleInstance(context, {\n\t\t\tkey: v.collectionKey,\n\t\t});\n\t\tif (collectionRes.error) return null;\n\n\t\tconst [versionTableRes, documentFieldsTableRes] = await Promise.all([\n\t\t\tgetDocumentVersionTableSchema(context, v.collectionKey),\n\t\t\tgetDocumentFieldsTableSchema(context, v.collectionKey),\n\t\t]);\n\t\tif (versionTableRes.error || !versionTableRes.data) return null;\n\t\tif (documentFieldsTableRes.error || !documentFieldsTableRes.data)\n\t\t\treturn null;\n\n\t\treturn {\n\t\t\tcollectionKey: v.collectionKey,\n\t\t\ttables: {\n\t\t\t\tdocument: v.table,\n\t\t\t\tversion: versionTableRes.data.name,\n\t\t\t\tdocumentFields: documentFieldsTableRes.data.name,\n\t\t\t},\n\t\t\tdocumentFieldSchema: documentFieldsTableRes.data,\n\t\t\tids: v.ids,\n\t\t\tversionType: v.versionType,\n\t\t};\n\t});\n\tconst unionDataRes = await Promise.all(unionData).then((u) =>\n\t\tu.filter((u) => u !== null),\n\t);\n\n\tconst documentsRes = await DocumentVersions.selectMultipleUnion({\n\t\tunions: unionDataRes,\n\t\tversionType: data.versionType,\n\t\ttenantKey: context.request.tenantKey,\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (documentsRes.error) return documentsRes;\n\n\tconst documentFieldsSchemaByCollection = new Map<\n\t\tstring,\n\t\tCollectionSchemaTable<LucidBrickTableName>\n\t>();\n\tfor (const union of unionDataRes) {\n\t\tdocumentFieldsSchemaByCollection.set(\n\t\t\tunion.collectionKey,\n\t\t\tunion.documentFieldSchema,\n\t\t);\n\t}\n\tconst fieldsSchemaByCollection = Object.fromEntries(\n\t\tdocumentFieldsSchemaByCollection.entries(),\n\t);\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: {\n\t\t\trows: documentsRes.data || [],\n\t\t\tmeta: {\n\t\t\t\trelation: {\n\t\t\t\t\tfieldsSchemaByCollection,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n};\n\nexport default fetchRelationRefs;\n"],"mappings":"4YA4BA,MAAM,EAGF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAmB,IAAI,EAC5B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EAEM,EAAmB,IAAI,IAC7B,IAAK,IAAM,KAAY,EAAK,UAAW,CACtC,GAAI,CAAC,EAAS,MAAM,WAAW,kBAAkB,EAAG,SAEpD,IAAM,EAAQ,EAAS,MACjB,EAAgB,EAAqB,CAAK,EAChD,GAAI,CAAC,EAAe,SAEpB,IAAM,EAAM,MAAM,KAAK,EAAS,MAAM,CAAC,CAAC,OACtC,GAA2B,OAAO,GAAU,QAC9C,EACA,GAAI,EAAI,SAAW,EAAG,SAEtB,IAAM,EACL,EAAK,qBAAqB,CACzB,UAAW,WACX,MAAO,EAAS,MAChB,eACD,CAAC,GAAK,EAAK,YACN,EAAS,GAAG,EAAM,GAAG,IACrB,EAAW,EAAiB,IAAI,CAAM,EAE5C,GAAI,EAAU,CACb,EAAS,IAAM,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,EAAS,IAAK,GAAG,CAAG,CAAC,CAAC,EAC5D,QACD,CAEA,EAAiB,IAAI,EAAQ,CAC5B,QACA,gBACA,IAAK,MAAM,KAAK,IAAI,IAAI,CAAG,CAAC,EAC5B,aACD,CAAC,CACF,CAEA,IAAM,EAAS,MAAM,KAAK,EAAiB,OAAO,CAAC,EAEnD,GAAI,EAAO,SAAW,EACrB,MAAO,CACN,KAAM,CACL,KAAM,CAAC,EACP,KAAM,CACL,SAAU,CACT,yBAA0B,CAAC,CAC5B,CACD,CACD,EACA,MAAO,IAAA,EACR,EAOD,IAAM,EAAiB,MAAM,EAAoB,EAAS,CACzD,eALsB,EACrB,IAAK,GAAM,EAAE,aAAa,CAAC,CAC3B,QAAQ,EAAG,EAAG,IAAS,EAAK,QAAQ,CAAC,IAAM,CAGf,CAC9B,CAAC,EACD,GAAI,EAAe,MAAO,OAAO,EAEjC,IAAM,EAAY,EAAO,IAAI,KAAO,IAAM,CAIzC,GAHsBA,EAAqC,EAAS,CACnE,IAAK,EAAE,aACR,CACgB,CAAC,CAAC,MAAO,OAAO,KAEhC,GAAM,CAAC,EAAiB,GAA0B,MAAM,QAAQ,IAAI,CACnE,EAA8B,EAAS,EAAE,aAAa,EACtD,EAA6B,EAAS,EAAE,aAAa,CACtD,CAAC,EAKD,OAJI,EAAgB,OAAS,CAAC,EAAgB,MAC1C,EAAuB,OAAS,CAAC,EAAuB,KACpD,KAED,CACN,cAAe,EAAE,cACjB,OAAQ,CACP,SAAU,EAAE,MACZ,QAAS,EAAgB,KAAK,KAC9B,eAAgB,EAAuB,KAAK,IAC7C,EACA,oBAAqB,EAAuB,KAC5C,IAAK,EAAE,IACP,YAAa,EAAE,WAChB,CACD,CAAC,EACK,EAAe,MAAM,QAAQ,IAAI,CAAS,CAAC,CAAC,KAAM,GACvD,EAAE,OAAQ,GAAM,IAAM,IAAI,CAC3B,EAEM,EAAe,MAAM,EAAiB,oBAAoB,CAC/D,OAAQ,EACR,YAAa,EAAK,YAClB,UAAW,EAAQ,QAAQ,UAC3B,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,GAAI,EAAa,MAAO,OAAO,EAE/B,IAAM,EAAmC,IAAI,IAI7C,IAAK,IAAM,KAAS,EACnB,EAAiC,IAChC,EAAM,cACN,EAAM,mBACP,EAED,IAAM,EAA2B,OAAO,YACvC,EAAiC,QAAQ,CAC1C,EAEA,MAAO,CACN,MAAO,IAAA,GACP,KAAM,CACL,KAAM,EAAa,MAAQ,CAAC,EAC5B,KAAM,CACL,SAAU,CACT,0BACD,CACD,CACD,CACD,CACD"}