@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 16.4 kB
Source Map (JSON)
{"version":3,"file":"promote-version.mjs","names":["collectionServices.getSingleInstance","migrationStatus","documentServices.checks.checkDocumentAccess","documentBricksFormatter","documentBrickServices.insertBrickTables"],"sources":["../../../src/services/documents-versions/promote-version.ts"],"sourcesContent":["import migrationStatus from \"../../libs/collection/get-collection-migration-status.js\";\nimport getCurrentCollectionMigrationId from \"../../libs/collection/migration/get-current-collection-migration-id.js\";\nimport {\n\tgetBricksTableSchema,\n\tgetTableNames,\n} from \"../../libs/collection/schema/runtime/runtime-schema-selectors.js\";\nimport { documentBricksFormatter } from \"../../libs/formatters/index.js\";\nimport executeHooks from \"../../libs/hooks/execute-hooks.js\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport {\n\tDocumentBricksRepository,\n\tDocumentsRepository,\n\tDocumentVersionsRepository,\n} from \"../../libs/repositories/index.js\";\nimport { getBaseUrl } from \"../../utils/helpers/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport invalidateClientDocumentCache from \"../documents/helpers/invalidate-client-cache.js\";\nimport aggregateBrickTables from \"../documents-bricks/helpers/aggregate-brick-tables.js\";\nimport {\n\tcollectionServices,\n\tdocumentBrickServices,\n\tdocumentServices,\n} from \"../index.js\";\n\nconst promoteVersion: ServiceFn<\n\t[\n\t\t{\n\t\t\tfromVersionId: number;\n\t\t\ttoVersionType: \"latest\" | string;\n\t\t\tcollectionKey: string;\n\t\t\tdocumentId: number;\n\t\t\tuserId: number;\n\t\t\tskipRevisionCheck?: boolean;\n\t\t\t/** If set to false, a revision will not be created even if the collection supports revisions. */\n\t\t\tcreateRevision?: boolean;\n\t\t\trequirePublishOperationForEnvironmentTarget?: boolean;\n\t\t\ttenantKey?: string | null;\n\t\t},\n\t],\n\tundefined\n> = async (context, data) => {\n\tconst Versions = new DocumentVersionsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst Documents = new DocumentsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst DocumentBricks = new DocumentBricksRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\n\t// -------------------------------------------------------------------------------\n\t// Initial data fetch and error checking\n\tconst collectionRes = collectionServices.getSingleInstance(context, {\n\t\tkey: data.collectionKey,\n\t});\n\tif (collectionRes.error) return collectionRes;\n\n\tif (data.requirePublishOperationForEnvironmentTarget === true) {\n\t\tconst isEnvironmentTarget = collectionRes.data.getData.environments.some(\n\t\t\t(environment) => environment.key === data.toVersionType,\n\t\t);\n\n\t\tif (isEnvironmentTarget) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"basic\",\n\t\t\t\t\tname: copy(\"server:core.collections.permission.error.name\"),\n\t\t\t\t\tmessage: copy(\n\t\t\t\t\t\t\"server:core.publish.operations.required.for.environment.target\",\n\t\t\t\t\t),\n\t\t\t\t\tstatus: 403,\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\t//* check the schema status and if a migration is required\n\tconst migrationStatusRes = await migrationStatus(context, {\n\t\tcollection: collectionRes.data,\n\t});\n\tif (migrationStatusRes.error) return migrationStatusRes;\n\n\tif (migrationStatusRes.data.requiresMigration) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tname: copy(\"server:core.error.schema.migration.required.name\"),\n\t\t\t\tmessage: copy(\"server:core.error.schema.migration.required.message\"),\n\t\t\t\tstatus: 400,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst bricksTableSchemaRes = await getBricksTableSchema(\n\t\tcontext,\n\t\tdata.collectionKey,\n\t);\n\tif (bricksTableSchemaRes.error) return bricksTableSchemaRes;\n\n\tconst tableNameRes = await getTableNames(context, data.collectionKey);\n\tif (tableNameRes.error) return tableNameRes;\n\n\tconst documentAccessRes = await documentServices.checks.checkDocumentAccess(\n\t\tcontext,\n\t\t{\n\t\t\tcollectionKey: data.collectionKey,\n\t\t\tid: data.documentId,\n\t\t},\n\t);\n\tif (documentAccessRes.error) return documentAccessRes;\n\n\tconst [versionRes, bricksQueryRes] = await Promise.all([\n\t\tVersions.selectSingle(\n\t\t\t{\n\t\t\t\tselect: [\"id\", \"type\", \"document_id\", \"content_id\"],\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: data.fromVersionId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tvalidation: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tdefaultError: {\n\t\t\t\t\t\tmessage: copy(\"server:core.documents.version.not.found.message\"),\n\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: tableNameRes.data.version,\n\t\t\t},\n\t\t),\n\t\tDocumentBricks.selectMultipleByVersionId(\n\t\t\t{\n\t\t\t\tversionId: data.fromVersionId,\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\tbricksSchema: bricksTableSchemaRes.data,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: tableNameRes.data.version,\n\t\t\t},\n\t\t),\n\t]);\n\tif (versionRes.error) return versionRes;\n\tif (bricksQueryRes.error) return bricksQueryRes;\n\n\tif (bricksQueryRes.data === undefined) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\tstatus: 404,\n\t\t\t\tmessage: copy(\"server:core.documents.version.not.found.message\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t// Additional error checks\n\tif (versionRes.data.document_id !== data.documentId) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.documents.version.document.mismatch\"),\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (versionRes.data.type === data.toVersionType) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 400,\n\t\t\t\tmessage: copy(\"server:core.documents.versions.promote.same.version\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (versionRes.data.type === \"revision\" && data.skipRevisionCheck !== true) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 400,\n\t\t\t\tmessage: copy(\"server:core.documents.revisions.promote.denied\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\tif (collectionRes.data.getData.locked === true) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tname: copy(\"server:core.error.locked.collection.name\"),\n\t\t\t\tmessage: copy(\"server:core.error.locked.collection.message\"),\n\t\t\t\tstatus: 400,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst migrationIdRes = await getCurrentCollectionMigrationId(\n\t\tcontext,\n\t\tdata.collectionKey,\n\t);\n\tif (migrationIdRes.error) return migrationIdRes;\n\n\t//-------------------------------------------------------------------------------\n\t// Mutate/create revisions and update the document\n\tconst shouldCreateRevision =\n\t\tcollectionRes.data.getData.revisions && data.createRevision !== false;\n\n\tconst [, upsertDocumentRes, createVersionRes] = await Promise.all([\n\t\tshouldCreateRevision\n\t\t\t? Versions.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: \"document_id\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: data.documentId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: \"type\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: data.toVersionType,\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\ttype: \"revision\",\n\t\t\t\t\t\t\tcollection_migration_id: migrationIdRes.data,\n\t\t\t\t\t\t\tpromoted_from: data.fromVersionId,\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: tableNameRes.data.version,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t: Versions.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: \"document_id\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: data.documentId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: \"type\",\n\t\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\t\tvalue: data.toVersionType,\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: tableNameRes.data.version,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\tDocuments.upsertSingle(\n\t\t\t{\n\t\t\t\tdata: {\n\t\t\t\t\tid: data.documentId,\n\t\t\t\t\tcollection_key: data.collectionKey,\n\t\t\t\t\tcollection_migration_id: migrationIdRes.data,\n\t\t\t\t\tcreated_by: data.userId,\n\t\t\t\t\tupdated_by: data.userId,\n\t\t\t\t\tis_deleted: false,\n\t\t\t\t\tupdated_at: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t\treturning: [\"id\"],\n\t\t\t\tvalidation: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tdefaultError: {\n\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\tmessage: copy(\"server:core.documents.create.failed\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: tableNameRes.data.document,\n\t\t\t},\n\t\t),\n\t\tVersions.createSingle(\n\t\t\t{\n\t\t\t\tdata: {\n\t\t\t\t\tdocument_id: data.documentId,\n\t\t\t\t\tcollection_key: data.collectionKey,\n\t\t\t\t\tcollection_migration_id: migrationIdRes.data,\n\t\t\t\t\ttype: data.toVersionType,\n\t\t\t\t\tpromoted_from: data.fromVersionId,\n\t\t\t\t\tcontent_id: versionRes.data.content_id,\n\t\t\t\t\tcreated_by: data.userId,\n\t\t\t\t\tupdated_by: data.userId,\n\t\t\t\t},\n\t\t\t\treturning: [\"id\"],\n\t\t\t\tvalidation: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tdefaultError: {\n\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\tmessage: copy(\"server:core.documents.create.failed\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: tableNameRes.data.version,\n\t\t\t},\n\t\t),\n\t]);\n\tif (upsertDocumentRes.error) return upsertDocumentRes;\n\tif (createVersionRes.error) return createVersionRes;\n\n\t// -------------------------------------------------------------------------------\n\t// Create new brick tale rows for the new version\n\tconst baseUrl = getBaseUrl(context);\n\tconst brickTables = aggregateBrickTables({\n\t\tcollection: collectionRes.data,\n\t\tdocumentId: data.documentId,\n\t\tversionId: createVersionRes.data.id,\n\t\tlocalization: context.config.localization,\n\t\tbricks: documentBricksFormatter.formatMultiple({\n\t\t\tbricksQuery: bricksQueryRes.data,\n\t\t\tbricksSchema: bricksTableSchemaRes.data,\n\t\t\trefData: { data: {} },\n\t\t\tcollection: collectionRes.data,\n\t\t\tconfig: context.config,\n\t\t\thost: baseUrl,\n\t\t}),\n\t\tfields: documentBricksFormatter.formatDocumentFields({\n\t\t\tbricksQuery: bricksQueryRes.data,\n\t\t\tbricksSchema: bricksTableSchemaRes.data,\n\t\t\trefData: { data: {} },\n\t\t\tcollection: collectionRes.data,\n\t\t\tconfig: context.config,\n\t\t\thost: baseUrl,\n\t\t}),\n\t\ttableNameByteLimit: context.config.db.config.tableNameByteLimit,\n\t});\n\tconst sortedTables = brickTables.sort((a, b) => a.priority - b.priority);\n\n\tconst insertRes = await documentBrickServices.insertBrickTables(context, {\n\t\ttables: sortedTables,\n\t\tcollection: collectionRes.data,\n\t});\n\tif (insertRes.error) return insertRes;\n\n\t// -------------------------------------------------------------------------------\n\t// Execute hook\n\tconst hookResponse = await executeHooks(\n\t\tcontext,\n\t\t{\n\t\t\tservice: \"documents\",\n\t\t\tevent: \"versionPromote\",\n\t\t\tconfig: context.config,\n\t\t\tcollectionInstance: collectionRes.data,\n\t\t},\n\t\t{\n\t\t\tmeta: {\n\t\t\t\tcollection: collectionRes.data,\n\t\t\t\tcollectionKey: data.collectionKey,\n\t\t\t\tuserId: data.userId,\n\t\t\t\tcollectionTableNames: tableNameRes.data,\n\t\t\t\ttenantKey:\n\t\t\t\t\tdata.tenantKey !== undefined\n\t\t\t\t\t\t? data.tenantKey\n\t\t\t\t\t\t: (context.request.tenantKey ?? null),\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tdocumentId: data.documentId,\n\t\t\t\tversionId: createVersionRes.data.id,\n\t\t\t\tversionType: data.toVersionType,\n\t\t\t},\n\t\t},\n\t);\n\tif (hookResponse.error) return hookResponse;\n\n\tawait invalidateClientDocumentCache(context, data.collectionKey);\n\n\t// -------------------------------------------------------------------------------\n\t// Success\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default promoteVersion;\n"],"mappings":"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"}