@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 11.3 kB
Source Map (JSON)
{"version":3,"file":"create-single.mjs","names":["documentBrickServices.createMultiple"],"sources":["../../../src/services/documents-versions/create-single.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type CollectionBuilder from \"../../libs/collection/builders/collection-builder/index.js\";\nimport getCurrentCollectionMigrationId from \"../../libs/collection/migration/get-current-collection-migration-id.js\";\nimport { getTableNames } from \"../../libs/collection/schema/runtime/runtime-schema-selectors.js\";\nimport executeHooks from \"../../libs/hooks/execute-hooks.js\";\nimport { DocumentVersionsRepository } from \"../../libs/repositories/index.js\";\nimport type { BrickInputSchema } from \"../../schemas/collection-bricks.js\";\nimport type { FieldInputSchema } from \"../../schemas/collection-fields.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { documentBrickServices } from \"../index.js\";\nimport rollbackVersionCreate from \"./helpers/rollback-version-create.js\";\n\n/**\n * Creates a new version. This is always for the \"latest\" version type\n */\nconst createSingle: ServiceFn<\n\t[\n\t\t{\n\t\t\tdocumentId: number;\n\t\t\tcollection: CollectionBuilder;\n\t\t\tuserId: number;\n\t\t\tbricks?: Array<BrickInputSchema>;\n\t\t\tfields?: Array<FieldInputSchema>;\n\t\t},\n\t],\n\tnumber\n> = async (context, data) => {\n\tconst tableNamesRes = await getTableNames(context, data.collection.key);\n\tif (tableNamesRes.error) return tableNamesRes;\n\n\tconst DocumentVersions = new DocumentVersionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst migrationIdRes = await getCurrentCollectionMigrationId(\n\t\tcontext,\n\t\tdata.collection.key,\n\t);\n\tif (migrationIdRes.error) return migrationIdRes;\n\n\tconst versionType = \"latest\";\n\n\tconst currentLatestRes = await DocumentVersions.selectSingle(\n\t\t{\n\t\t\tselect: [\"id\"],\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"document_id\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: data.documentId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"type\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: versionType,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t},\n\t);\n\tif (currentLatestRes.error) return currentLatestRes;\n\n\tconst previousLatestId = currentLatestRes.data?.id;\n\n\tif (previousLatestId !== undefined) {\n\t\t//* retain the current latest as a rollback point until the new version is complete\n\t\tconst stagePreviousRes = await DocumentVersions.updateSingle(\n\t\t\t{\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: \"id\",\n\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\tvalue: previousLatestId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdata: {\n\t\t\t\t\ttype: \"revision\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: tableNamesRes.data.version,\n\t\t\t},\n\t\t);\n\t\tif (stagePreviousRes.error) return stagePreviousRes;\n\t}\n\n\t// Create new latest version\n\tconst newVersionRes = await DocumentVersions.createSingle(\n\t\t{\n\t\t\tdata: {\n\t\t\t\tcollection_key: data.collection.key,\n\t\t\t\tcollection_migration_id: migrationIdRes.data,\n\t\t\t\tdocument_id: data.documentId,\n\t\t\t\ttype: versionType,\n\t\t\t\tcontent_id: randomUUID(),\n\t\t\t\tcreated_by: data.userId,\n\t\t\t\tupdated_by: data.userId,\n\t\t\t},\n\t\t\treturning: [\"id\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t},\n\t);\n\tif (newVersionRes.error) {\n\t\tawait rollbackVersionCreate(context, {\n\t\t\tcollectionKey: data.collection.key,\n\t\t\tdocumentId: data.documentId,\n\t\t\tpreviousLatestId,\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t\tversions: DocumentVersions,\n\t\t});\n\t\treturn newVersionRes;\n\t}\n\n\t// ----------------------------------------------\n\t// Fire beforeUpsert transform hooks\n\tconst hookResponse = await executeHooks(\n\t\tcontext,\n\t\t{\n\t\t\tservice: \"documents\",\n\t\t\tevent: \"beforeUpsert\",\n\t\t\tconfig: context.config,\n\t\t\tcollectionInstance: data.collection,\n\t\t},\n\t\t{\n\t\t\tmeta: {\n\t\t\t\tcollection: data.collection,\n\t\t\t\tcollectionKey: data.collection.key,\n\t\t\t\tuserId: data.userId,\n\t\t\t\tcollectionTableNames: tableNamesRes.data,\n\t\t\t\ttenantKey: context.request.tenantKey ?? null,\n\t\t\t\texecution: {\n\t\t\t\t\tmode: \"upsert\",\n\t\t\t\t\taction: \"create\",\n\t\t\t\t\twillPersist: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\tversionId: newVersionRes.data.id,\n\t\t\t\tversionType: versionType,\n\t\t\t\tbricks: data.bricks,\n\t\t\t\tfields: data.fields,\n\t\t\t},\n\t\t},\n\t);\n\tif (hookResponse.error) {\n\t\tawait rollbackVersionCreate(context, {\n\t\t\tcollectionKey: data.collection.key,\n\t\t\tdocumentId: data.documentId,\n\t\t\tnewVersionId: newVersionRes.data.id,\n\t\t\tpreviousLatestId,\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t\tversions: DocumentVersions,\n\t\t});\n\t\treturn hookResponse;\n\t}\n\n\t// Save bricks for the new version\n\tconst createMultipleBricks = await documentBrickServices.createMultiple(\n\t\tcontext,\n\t\t{\n\t\t\tversionId: newVersionRes.data.id,\n\t\t\tdocumentId: data.documentId,\n\t\t\tbricks: hookResponse.data.bricks,\n\t\t\tfields: hookResponse.data.fields,\n\t\t\tcollection: data.collection,\n\t\t},\n\t);\n\tif (createMultipleBricks.error) {\n\t\tawait rollbackVersionCreate(context, {\n\t\t\tcollectionKey: data.collection.key,\n\t\t\tdocumentId: data.documentId,\n\t\t\tnewVersionId: newVersionRes.data.id,\n\t\t\tpreviousLatestId,\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t\tversions: DocumentVersions,\n\t\t});\n\t\treturn createMultipleBricks;\n\t}\n\n\t// ----------------------------------------------\n\t// Fire afterUpsert hook\n\tconst hookAfterRes = await executeHooks(\n\t\tcontext,\n\t\t{\n\t\t\tservice: \"documents\",\n\t\t\tevent: \"afterUpsert\",\n\t\t\tconfig: context.config,\n\t\t\tcollectionInstance: data.collection,\n\t\t},\n\t\t{\n\t\t\tmeta: {\n\t\t\t\tcollection: data.collection,\n\t\t\t\tcollectionKey: data.collection.key,\n\t\t\t\tuserId: data.userId,\n\t\t\t\tcollectionTableNames: tableNamesRes.data,\n\t\t\t\ttenantKey: context.request.tenantKey ?? null,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\tversionId: newVersionRes.data.id,\n\t\t\t\tversionType: versionType,\n\t\t\t\tbricks: hookResponse.data.bricks || [],\n\t\t\t\tfields: hookResponse.data.fields || [],\n\t\t\t},\n\t\t},\n\t);\n\tif (hookAfterRes.error) {\n\t\tawait rollbackVersionCreate(context, {\n\t\t\tcollectionKey: data.collection.key,\n\t\t\tdocumentId: data.documentId,\n\t\t\tnewVersionId: newVersionRes.data.id,\n\t\t\tpreviousLatestId,\n\t\t\ttableName: tableNamesRes.data.version,\n\t\t\tversions: DocumentVersions,\n\t\t});\n\t\treturn hookAfterRes;\n\t}\n\n\tif (previousLatestId !== undefined) {\n\t\tconst finalizePreviousRes = data.collection.getData.revisions\n\t\t\t? await DocumentVersions.updateSingle(\n\t\t\t\t\t{\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: \"id\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: previousLatestId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tcollection_migration_id: migrationIdRes.data,\n\t\t\t\t\t\t\tcreated_by: data.userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttableName: tableNamesRes.data.version,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t: await DocumentVersions.deleteSingle(\n\t\t\t\t\t{\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: \"id\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: previousLatestId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttableName: tableNamesRes.data.version,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\tif (finalizePreviousRes.error) {\n\t\t\tawait rollbackVersionCreate(context, {\n\t\t\t\tcollectionKey: data.collection.key,\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\tnewVersionId: newVersionRes.data.id,\n\t\t\t\tpreviousLatestId,\n\t\t\t\ttableName: tableNamesRes.data.version,\n\t\t\t\tversions: DocumentVersions,\n\t\t\t});\n\t\t\treturn finalizePreviousRes;\n\t\t}\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: data.documentId,\n\t};\n};\n\nexport default createSingle;\n"],"mappings":"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"}