@strapi/content-manager 5.52.0 → 5.52.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Fields.js +6 -3
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +6 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +3 -2
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +3 -2
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/translations/pt-BR.json.js +5 -5
- package/dist/admin/translations/pt-BR.json.mjs +5 -5
- package/dist/server/controllers/collection-types.js +17 -2
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +17 -2
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/single-types.js +20 -3
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs +20 -3
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/history/services/history.js +22 -4
- package/dist/server/history/services/history.js.map +1 -1
- package/dist/server/history/services/history.mjs +22 -4
- package/dist/server/history/services/history.mjs.map +1 -1
- package/dist/server/mcp/schemas/data-schema.js +6 -1
- package/dist/server/mcp/schemas/data-schema.js.map +1 -1
- package/dist/server/mcp/schemas/data-schema.mjs +6 -1
- package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
- package/dist/server/mcp/utils.js +4 -2
- package/dist/server/mcp/utils.js.map +1 -1
- package/dist/server/mcp/utils.mjs +4 -2
- package/dist/server/mcp/utils.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -6
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +4 -7
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/utils/draft-relations.js +5 -0
- package/dist/server/services/utils/draft-relations.js.map +1 -1
- package/dist/server/services/utils/draft-relations.mjs +5 -1
- package/dist/server/services/utils/draft-relations.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
- package/dist/server/src/mcp/utils.d.ts +3 -1
- package/dist/server/src/mcp/utils.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\nimport { getPopulateForLocalizations } from '../services/utils/populate';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(model))\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Find the existing document\n let document = await findDocument(sanitizedQuery, model, { locale, status: 'draft' });\n\n // If document exists and user can update it, update it before publishing\n const shouldUpdate = document && permissionChecker.can.update(document);\n // If document doesn't exist and user can create it, create it before publishing\n const shouldCreate = !document && permissionChecker.can.create();\n if (shouldUpdate || shouldCreate) {\n document = await createOrUpdateDocument(ctx, { populate });\n } else if (!document) {\n // Document doesn't exist and user can't create it\n throw new errors.ForbiddenError();\n }\n\n // If document doesn't exist, throw an error\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const document = await findDocument({}, model, { locale });\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const counts = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: counts,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","shouldUpdate","can","shouldCreate","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","counts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"single-types.mjs","sources":["../../../server/src/controllers/single-types.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { setCreatorFields, async, errors } from '@strapi/utils';\n\nimport { getDocumentLocaleAndStatus } from './validation/dimensions';\nimport { getService } from '../utils';\nimport { formatDocumentWithMetadata } from './utils/metadata';\nimport { getPopulateForLocalizations } from '../services/utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from '../services/utils/draft-relations';\n\ntype OptionsWithPopulate = Modules.Documents.Params.Pick<UID.ContentType, 'populate:object'>;\n\nconst buildPopulateFromQuery = async (query: any, model: any) => {\n return getService('populate-builder')(model)\n .populateFromQuery(query)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(model))\n .build();\n};\n\nconst findDocument = async (query: any, uid: UID.SingleType, opts: any = {}) => {\n const documentManager = getService('document-manager');\n const populate = await buildPopulateFromQuery(query, uid);\n\n return (\n documentManager\n .findMany({ ...opts, populate }, uid)\n // Return the first document found\n .then((documents: any) => documents[0])\n );\n};\n\nconst createOrUpdateDocument = async (ctx: any, opts?: OptionsWithPopulate) => {\n const { user, userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Load document version to update\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n findDocument(sanitizedQuery, model, { locale, status: 'draft' }),\n // Find the first document to check if it exists\n strapi.db.query(model).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n const pickPermittedFields = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const setCreator = documentVersion\n ? setCreatorFields({ user, isEdition: true })\n : setCreatorFields({ user });\n\n const sanitizeFn = async.pipe(pickPermittedFields, setCreator as any);\n\n // If version is not found, but document exists,\n // the intent is to create a new document locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedBody = await sanitizeFn(body);\n\n if (!documentId) {\n return documentManager.create(model, {\n data: sanitizedBody,\n ...sanitizedQuery,\n locale,\n });\n }\n\n return documentManager.update(documentId, model, {\n data: sanitizedBody as any,\n populate: opts?.populate,\n locale,\n });\n};\n\nexport default {\n async find(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale, status } = await getDocumentLocaleAndStatus(query, model);\n\n const version = await findDocument(permissionQuery, model, { locale, status });\n\n // allow user with create permission to know a single type is not created\n if (!version) {\n if (permissionChecker.cannot.create()) {\n return ctx.forbidden();\n }\n // Check if document exists\n const document = await strapi.db.query(model).findOne({});\n\n if (!document) {\n return ctx.notFound();\n }\n\n // If the requested locale doesn't exist, return an empty response\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n model,\n // @ts-expect-error - fix types\n { documentId: document.documentId, locale, publishedAt: null },\n { availableLocales: true, availableStatus: false }\n );\n ctx.body = { data: {}, meta };\n return;\n }\n\n if (permissionChecker.cannot.read(version)) {\n return ctx.forbidden();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async createOrUpdate(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n const document = await createOrUpdateDocument(ctx);\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async delete(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.delete()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n const documentLocales = await documentManager.findLocales(undefined, model, {\n populate,\n locale,\n });\n\n if (documentLocales.length === 0) {\n return ctx.notFound();\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n return ctx.forbidden();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales.at(0).documentId, model, {\n locale,\n });\n\n ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n },\n\n async publish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.publish()) {\n return ctx.forbidden();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n const populate = await buildPopulateFromQuery(sanitizedQuery, model);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n // Find the existing document\n let document = await findDocument(sanitizedQuery, model, { locale, status: 'draft' });\n\n // If document exists and user can update it, update it before publishing\n const shouldUpdate = document && permissionChecker.can.update(document);\n // If document doesn't exist and user can create it, create it before publishing\n const shouldCreate = !document && permissionChecker.can.create();\n if (shouldUpdate || shouldCreate) {\n document = await createOrUpdateDocument(ctx, { populate });\n } else if (!document) {\n // Document doesn't exist and user can't create it\n throw new errors.ForbiddenError();\n }\n\n // If document doesn't exist, throw an error\n if (!document) {\n throw new errors.NotFoundError();\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, model, { locale });\n\n return publishResult.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n ctx.body = await formatDocumentWithMetadata(permissionChecker, model, sanitizedDocument);\n },\n\n async unpublish(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const {\n body: { discardDraft, ...body },\n query = {},\n } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.unpublish()) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale });\n\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n return ctx.forbidden();\n }\n\n if (discardDraft && permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n await strapi.db.transaction(async () => {\n if (discardDraft) {\n await documentManager.discardDraft(document.documentId, model, { locale });\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.unpublish(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n });\n },\n\n async discard(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { body, query = {} } = ctx.request;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.discard()) {\n return ctx.forbidden();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard(query);\n const { locale } = await getDocumentLocaleAndStatus(body, model);\n\n const document = await findDocument(sanitizedQuery, model, { locale, status: 'published' });\n\n // Can not discard a document that is not published\n if (!document) {\n return ctx.notFound();\n }\n\n if (permissionChecker.cannot.discard(document)) {\n return ctx.forbidden();\n }\n\n ctx.body = await async.pipe(\n (document) => documentManager.discardDraft(document.documentId, model, { locale }),\n permissionChecker.sanitizeOutput,\n (document) => formatDocumentWithMetadata(permissionChecker, model, document)\n )(document);\n },\n\n async countDraftRelations(ctx: any) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n const { query } = ctx.request;\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n const { locale } = await getDocumentLocaleAndStatus(query, model);\n\n const document = await findDocument(permissionQuery, model, { locale });\n\n if (!document) {\n // The single type may simply not have a version in the requested locale yet.\n // Check every existing locale/status version — findLocales returns one row\n // per locale AND per publication state — before deciding it truly doesn't exist.\n const populate = await buildPopulateFromQuery(permissionQuery, model);\n const versions = await documentManager.findLocales(undefined, model, { populate });\n\n if (versions.length === 0) {\n return ctx.notFound();\n }\n\n if (versions.every((version) => permissionChecker.cannot.read(version))) {\n return ctx.forbidden();\n }\n\n return { data: EMPTY_DRAFT_RELATION_COUNTS };\n }\n\n if (permissionChecker.cannot.read(document)) {\n return ctx.forbidden();\n }\n\n const counts = await documentManager.countDraftRelations(document.documentId, model, locale);\n\n return {\n data: counts,\n };\n },\n};\n"],"names":["buildPopulateFromQuery","query","model","getService","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","findDocument","uid","opts","documentManager","populate","findMany","then","documents","createOrUpdateDocument","ctx","user","userAbility","state","params","body","request","permissionChecker","create","cannot","update","errors","ForbiddenError","sanitizedQuery","locale","getDocumentLocaleAndStatus","documentVersion","otherDocumentVersion","Promise","all","status","strapi","db","findOne","select","documentId","pickPermittedFields","sanitizeUpdateInput","sanitizeCreateInput","setCreator","setCreatorFields","isEdition","sanitizeFn","async","pipe","sanitizedBody","data","find","read","forbidden","permissionQuery","version","document","notFound","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","sanitizedDocument","sanitizeOutput","createOrUpdate","delete","documentLocales","findLocales","undefined","length","deletedEntity","at","publish","publishedDocument","transaction","shouldUpdate","can","shouldCreate","NotFoundError","publishResult","unpublish","discardDraft","discard","countDraftRelations","versions","every","EMPTY_DRAFT_RELATION_COUNTS","counts"],"mappings":"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"}
|
|
@@ -29,9 +29,14 @@ const createHistoryService = ({ strapi })=>{
|
|
|
29
29
|
if (isLocalizedContentType) {
|
|
30
30
|
locale = params.query.locale || defaultLocale;
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
// NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory
|
|
33
|
+
// See: https://github.com/strapi/strapi/issues/27393
|
|
34
|
+
const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([
|
|
33
35
|
query.findPage({
|
|
34
36
|
...params.query,
|
|
37
|
+
select: [
|
|
38
|
+
'id'
|
|
39
|
+
],
|
|
35
40
|
where: {
|
|
36
41
|
$and: [
|
|
37
42
|
{
|
|
@@ -49,9 +54,6 @@ const createHistoryService = ({ strapi })=>{
|
|
|
49
54
|
] : []
|
|
50
55
|
]
|
|
51
56
|
},
|
|
52
|
-
populate: [
|
|
53
|
-
'createdBy'
|
|
54
|
-
],
|
|
55
57
|
orderBy: [
|
|
56
58
|
{
|
|
57
59
|
createdAt: 'desc'
|
|
@@ -60,6 +62,22 @@ const createHistoryService = ({ strapi })=>{
|
|
|
60
62
|
}),
|
|
61
63
|
serviceUtils.getLocaleDictionary()
|
|
62
64
|
]);
|
|
65
|
+
const ids = versionRows.map((version)=>version.id);
|
|
66
|
+
const versions = ids.length ? await query.findMany({
|
|
67
|
+
where: {
|
|
68
|
+
id: {
|
|
69
|
+
$in: ids
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
populate: [
|
|
73
|
+
'createdBy'
|
|
74
|
+
]
|
|
75
|
+
}) : [];
|
|
76
|
+
const versionsById = new Map(versions.map((version)=>[
|
|
77
|
+
version.id,
|
|
78
|
+
version
|
|
79
|
+
]));
|
|
80
|
+
const results = ids.map((id)=>versionsById.get(id)).filter(Boolean);
|
|
63
81
|
const populateEntry = async (entry)=>{
|
|
64
82
|
return strapiUtils.traverseEntity(async (options, utils)=>{
|
|
65
83
|
if (!options.attribute) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n const [{ results, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n populate: ['createdBy'],\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","pagination","localeDictionary","Promise","all","findPage","where","$and","documentId","relatedDocumentId","populate","orderBy","getLocaleDictionary","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","map","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","version","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.js","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
@@ -27,9 +27,14 @@ const createHistoryService = ({ strapi })=>{
|
|
|
27
27
|
if (isLocalizedContentType) {
|
|
28
28
|
locale = params.query.locale || defaultLocale;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
// NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory
|
|
31
|
+
// See: https://github.com/strapi/strapi/issues/27393
|
|
32
|
+
const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([
|
|
31
33
|
query.findPage({
|
|
32
34
|
...params.query,
|
|
35
|
+
select: [
|
|
36
|
+
'id'
|
|
37
|
+
],
|
|
33
38
|
where: {
|
|
34
39
|
$and: [
|
|
35
40
|
{
|
|
@@ -47,9 +52,6 @@ const createHistoryService = ({ strapi })=>{
|
|
|
47
52
|
] : []
|
|
48
53
|
]
|
|
49
54
|
},
|
|
50
|
-
populate: [
|
|
51
|
-
'createdBy'
|
|
52
|
-
],
|
|
53
55
|
orderBy: [
|
|
54
56
|
{
|
|
55
57
|
createdAt: 'desc'
|
|
@@ -58,6 +60,22 @@ const createHistoryService = ({ strapi })=>{
|
|
|
58
60
|
}),
|
|
59
61
|
serviceUtils.getLocaleDictionary()
|
|
60
62
|
]);
|
|
63
|
+
const ids = versionRows.map((version)=>version.id);
|
|
64
|
+
const versions = ids.length ? await query.findMany({
|
|
65
|
+
where: {
|
|
66
|
+
id: {
|
|
67
|
+
$in: ids
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
populate: [
|
|
71
|
+
'createdBy'
|
|
72
|
+
]
|
|
73
|
+
}) : [];
|
|
74
|
+
const versionsById = new Map(versions.map((version)=>[
|
|
75
|
+
version.id,
|
|
76
|
+
version
|
|
77
|
+
]));
|
|
78
|
+
const results = ids.map((id)=>versionsById.get(id)).filter(Boolean);
|
|
61
79
|
const populateEntry = async (entry)=>{
|
|
62
80
|
return traverseEntity(async (options, utils)=>{
|
|
63
81
|
if (!options.attribute) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n const [{ results, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n populate: ['createdBy'],\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","pagination","localeDictionary","Promise","all","findPage","where","$and","documentId","relatedDocumentId","populate","orderBy","getLocaleDictionary","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","map","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","version","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.mjs","sources":["../../../../server/src/history/services/history.ts"],"sourcesContent":["import type { Core, Data, Modules, Schema } from '@strapi/types';\nimport { errors, traverseEntity } from '@strapi/utils';\nimport { omit } from 'lodash/fp';\n\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\nimport type { HistoryVersions } from '../../../../shared/contracts';\nimport type {\n CreateHistoryVersion,\n HistoryVersionDataResponse,\n} from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\nimport { getService as getContentManagerService } from '../../utils';\n\n// Needed because the query engine doesn't return any types yet\ntype HistoryVersionQueryResult = Omit<HistoryVersionDataResponse, 'locale'> &\n Pick<CreateHistoryVersion, 'locale'>;\n\nconst createHistoryService = ({ strapi }: { strapi: Core.Strapi }) => {\n const query = strapi.db.query(HISTORY_VERSION_UID);\n const serviceUtils = createServiceUtils({ strapi });\n\n return {\n async createVersion(historyVersionData: HistoryVersions.CreateHistoryVersion) {\n await query.create({\n data: {\n ...historyVersionData,\n createdAt: new Date(),\n createdBy: strapi.requestContext.get()?.state?.user.id,\n },\n });\n },\n\n async findVersionsPage(params: HistoryVersions.GetHistoryVersions.Request): Promise<{\n results: HistoryVersions.HistoryVersionDataResponse[];\n pagination: HistoryVersions.Pagination;\n }> {\n const schema = strapi.getModel(params.query.contentType);\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);\n const defaultLocale = await serviceUtils.getDefaultLocale();\n\n let locale = null;\n if (isLocalizedContentType) {\n locale = params.query.locale || defaultLocale;\n }\n\n // NOTE: We get the IDs first because sorting full rows runs MySQL/MariaDB out of sort memory\n // See: https://github.com/strapi/strapi/issues/27393\n const [{ results: versionRows, pagination }, localeDictionary] = await Promise.all([\n query.findPage({\n ...params.query,\n select: ['id'],\n where: {\n $and: [\n { contentType: params.query.contentType },\n ...(params.query.documentId ? [{ relatedDocumentId: params.query.documentId }] : []),\n ...(locale ? [{ locale }] : []),\n ],\n },\n orderBy: [{ createdAt: 'desc' }],\n }),\n serviceUtils.getLocaleDictionary(),\n ]);\n\n const ids = versionRows.map((version) => version.id);\n const versions = ids.length\n ? await query.findMany({\n where: { id: { $in: ids } },\n populate: ['createdBy'],\n })\n : [];\n const versionsById = new Map(versions.map((version) => [version.id, version]));\n const results = ids.map((id) => versionsById.get(id)).filter(Boolean);\n\n const populateEntry = async (entry: HistoryVersionQueryResult) => {\n return traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n if (!options.value) return;\n\n const currentValue: any[] = Array.isArray(options.value)\n ? options.value\n : [options.value];\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (options.attribute.target === 'admin::user') {\n const adminUsers = await Promise.all(\n currentValue.map((userToPopulate) => {\n if (userToPopulate == null) {\n return null;\n }\n\n return strapi.query('admin::user').findOne({\n where: {\n ...(userToPopulate.id ? { id: userToPopulate.id } : {}),\n ...(userToPopulate.documentId\n ? { documentId: userToPopulate.documentId }\n : {}),\n },\n });\n })\n );\n\n utils.set(options.key, adminUsers as any);\n }\n\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: options.attribute.target,\n });\n\n const response = await serviceUtils.buildRelationReponse(\n currentValue,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n\n if (options.attribute.type === 'media') {\n const permissionChecker = getContentManagerService('permission-checker').create({\n userAbility: params.state.userAbility,\n model: 'plugin::upload.file',\n });\n\n const response = await serviceUtils.buildMediaResponse(currentValue);\n const sanitizedResults = await Promise.all(\n response.results.map((media) => permissionChecker.sanitizeOutput(media))\n );\n\n utils.set(options.key, {\n results: sanitizedResults,\n meta: response.meta,\n });\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n entry.data\n );\n };\n\n const formattedResults: any[] = await Promise.all(\n (results as HistoryVersionQueryResult[]).map(async (result) => {\n return {\n ...result,\n data: await populateEntry(result),\n meta: {\n unknownAttributes: serviceUtils.getSchemaAttributesDiff(\n result.schema,\n strapi.getModel(params.query.contentType).attributes\n ),\n },\n locale: result.locale ? localeDictionary[result.locale] : null,\n };\n })\n );\n\n return {\n results: formattedResults,\n pagination,\n };\n },\n\n async restoreVersion(versionId: Data.ID) {\n const version = await query.findOne({ where: { id: versionId } });\n const contentTypeSchemaAttributes = strapi.getModel(version.contentType).attributes;\n const schemaDiff = serviceUtils.getSchemaAttributesDiff(\n version.schema,\n contentTypeSchemaAttributes\n );\n\n // Set all added attribute values to null\n const dataWithoutAddedAttributes = Object.keys(schemaDiff.added).reduce(\n (currentData, addedKey) => {\n currentData[addedKey] = null;\n return currentData;\n },\n // Clone to avoid mutating the original version data\n structuredClone(version.data)\n );\n\n // Remove the schema attributes history should ignore\n const schema = structuredClone(version.schema);\n schema.attributes = omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);\n\n const dataWithoutMissingRelations = await traverseEntity(\n async (options, utils) => {\n if (!options.attribute) return;\n\n if (options.attribute.type === 'component') {\n // Ids on components throw an error when restoring\n utils.remove('id');\n\n if (options.attribute.repeatable && options.value === null) {\n // Repeatable Components should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (options.attribute.type === 'dynamiczone') {\n if (options.value === null) {\n // Dynamic zones should always be an array\n utils.set(options.key, [] as any);\n }\n }\n\n if (\n options.attribute.type === 'relation' &&\n // TODO: handle polymorphic relations\n options.attribute.relation !== 'morphToOne' &&\n options.attribute.relation !== 'morphToMany'\n ) {\n if (!options.value) return;\n\n const data = await serviceUtils.getRelationRestoreValue(\n options.value as Modules.Documents.AnyDocument,\n options.attribute as Schema.Attribute.RelationWithTarget\n );\n\n utils.set(options.key, data as Modules.Documents.AnyDocument);\n }\n\n if (options.attribute.type === 'media') {\n if (!options.value) return;\n\n const data = await serviceUtils.getMediaRestoreValue(\n options.value as Modules.Documents.AnyDocument\n );\n\n utils.set(options.key, data);\n }\n },\n {\n schema,\n getModel: strapi.getModel.bind(strapi),\n },\n dataWithoutAddedAttributes\n );\n\n const data = omit(['id', ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);\n const restoredDocument = await strapi.documents(version.contentType).update({\n documentId: version.relatedDocumentId,\n locale: version.locale,\n data,\n });\n\n if (!restoredDocument) {\n throw new errors.ApplicationError('Failed to restore version');\n }\n\n return restoredDocument;\n },\n };\n};\n\nexport { createHistoryService };\n"],"names":["createHistoryService","strapi","query","db","HISTORY_VERSION_UID","serviceUtils","createServiceUtils","createVersion","historyVersionData","create","data","createdAt","Date","createdBy","requestContext","get","state","user","id","findVersionsPage","params","schema","getModel","contentType","isLocalizedContentType","defaultLocale","getDefaultLocale","locale","results","versionRows","pagination","localeDictionary","Promise","all","findPage","select","where","$and","documentId","relatedDocumentId","orderBy","getLocaleDictionary","ids","map","version","versions","length","findMany","$in","populate","versionsById","Map","filter","Boolean","populateEntry","entry","traverseEntity","options","utils","attribute","value","currentValue","Array","isArray","type","remove","relation","target","adminUsers","userToPopulate","findOne","set","key","permissionChecker","getContentManagerService","userAbility","model","response","buildRelationReponse","sanitizedResults","media","sanitizeOutput","meta","buildMediaResponse","bind","formattedResults","result","unknownAttributes","getSchemaAttributesDiff","attributes","restoreVersion","versionId","contentTypeSchemaAttributes","schemaDiff","dataWithoutAddedAttributes","Object","keys","added","reduce","currentData","addedKey","structuredClone","omit","FIELDS_TO_IGNORE","dataWithoutMissingRelations","repeatable","getRelationRestoreValue","getMediaRestoreValue","removed","restoredDocument","documents","update","errors","ApplicationError"],"mappings":"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"}
|
|
@@ -201,7 +201,12 @@ const isCustomFieldAttribute = (attr)=>typeof attr === 'object' && attr !== null
|
|
|
201
201
|
strapiUtils.z.array(relEntry),
|
|
202
202
|
strapiUtils.z.null()
|
|
203
203
|
]).optional().describe('Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.')
|
|
204
|
-
}).strict()
|
|
204
|
+
}).strict().refine((value)=>value.set === undefined || value.connect === undefined && value.disconnect === undefined, {
|
|
205
|
+
message: 'set is mutually exclusive with connect and disconnect',
|
|
206
|
+
path: [
|
|
207
|
+
'set'
|
|
208
|
+
]
|
|
209
|
+
});
|
|
205
210
|
} else {
|
|
206
211
|
s = strapiUtils.z.union([
|
|
207
212
|
relDocumentId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-schema.js","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict();\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-schema.js","sources":["../../../../server/src/mcp/schemas/data-schema.ts"],"sourcesContent":["import { contentTypes, z } from '@strapi/utils';\nimport type { Core, Schema, Struct } from '@strapi/types';\n\nimport { buildBlocksInputSchema } from './blocks-schema';\nimport type { ContentManagerModelForMcp } from '../types';\n\ntype CustomFieldAttribute = {\n type: 'customField';\n customField: string;\n [key: string]: unknown;\n};\n\nconst isCustomFieldAttribute = (attr: unknown): attr is CustomFieldAttribute =>\n typeof attr === 'object' &&\n attr !== null &&\n (attr as Record<string, unknown>).type === 'customField' &&\n typeof (attr as Record<string, unknown>).customField === 'string';\n\n/**\n * Builds a structured Zod object schema for a Strapi component UID.\n * Declared as a regular function so it is hoisted above `attributeToInputSchema`\n * — the two functions are mutually recursive (component attrs recurse into\n * attributeToInputSchema; attributeToInputSchema calls this for 'component' cases).\n *\n * @param strapi - Strapi instance (components registry available post-load).\n * @param componentUid - e.g. \"common.seo\".\n * @param visited - cycle-guard; prevents infinite recursion on self-referencing components.\n */\nexport function buildComponentInputSchema(\n strapi: Core.Strapi,\n componentUid: string,\n visited: Set<string> = new Set()\n): z.ZodTypeAny {\n if (visited.has(componentUid) === true) {\n // Circular reference — fall back to permissive but non-empty JSON Schema\n return z.record(z.string(), z.unknown());\n }\n\n type ComponentEntry = { attributes: Record<string, Schema.Attribute.AnyAttribute> };\n const componentsMap = strapi.components as unknown as Record<string, ComponentEntry | undefined>;\n const component = componentsMap[componentUid];\n if (component === undefined) {\n return z.record(z.string(), z.unknown());\n }\n\n visited.add(componentUid);\n\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, attr] of Object.entries(component.attributes)) {\n if (key === 'id') {\n // eslint-disable-next-line no-continue\n continue;\n }\n shape[key] = attributeToInputSchema(strapi, attr, visited);\n }\n\n visited.delete(componentUid);\n\n return z.object(shape).strict();\n}\n\n/**\n * Maps a single Strapi attribute to a Zod input schema, carrying constraints\n * (min, max, minLength, maxLength, required, enum values, etc.).\n *\n * Mirrors the `mapAttributeToInputSchema` logic from\n * `packages/core/core/src/core-api/routes/validation/mappers.ts` — kept inline\n * here to avoid a cross-package import from @strapi/content-manager into\n * @strapi/core (which is not a listed dependency).\n *\n */\nexport const attributeToInputSchema = (\n strapi: Core.Strapi,\n attr: Schema.Attribute.AnyAttribute,\n visited: Set<string> = new Set()\n): z.ZodTypeAny => {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'password': {\n const { required, minLength, maxLength } = attr as Schema.Attribute.String;\n let s: z.ZodString = z.string();\n if (minLength !== undefined) s = s.min(minLength);\n if (maxLength !== undefined) s = s.max(maxLength);\n return required === true ? s : s.optional();\n }\n case 'email': {\n const { required } = attr as Schema.Attribute.Email;\n const s = z.string().email();\n return required === true ? s : s.optional();\n }\n case 'uid': {\n const { required } = attr as Schema.Attribute.UID;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'integer': {\n const { required, min, max } = attr as Schema.Attribute.Integer;\n let s = z.number().int();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'biginteger': {\n const { required } = attr as Schema.Attribute.BigInteger;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'decimal':\n case 'float': {\n const { required, min, max } = attr as Schema.Attribute.Decimal;\n let s = z.number();\n if (min !== undefined) s = s.min(min);\n if (max !== undefined) s = s.max(max);\n return required === true ? s : s.optional();\n }\n case 'boolean': {\n const { required } = attr as Schema.Attribute.Boolean;\n const s = z.boolean();\n return required === true ? s : s.optional();\n }\n case 'date':\n case 'datetime':\n case 'time':\n case 'timestamp': {\n const { required } = attr as Schema.Attribute.Date;\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'enumeration': {\n const { required, enum: values } = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(values) && values.length > 0) {\n const s = z.enum(values as [string, ...string[]]);\n return required === true ? s : s.optional();\n }\n const s = z.string();\n return required === true ? s : s.optional();\n }\n case 'json': {\n const { required } = attr as Schema.Attribute.JSON;\n const s = z.any();\n return required === true ? s : s.optional();\n }\n case 'blocks': {\n const { required } = attr as Schema.Attribute.Blocks;\n const s = buildBlocksInputSchema();\n return required === true ? s : s.optional();\n }\n case 'component': {\n // Cast to a plain record to avoid generic defaults on `repeatable` (Constants.False)\n const componentAttr = attr as unknown as {\n required?: boolean;\n repeatable?: boolean;\n component?: string;\n min?: number;\n max?: number;\n };\n const componentUid = componentAttr.component;\n const componentSchema: z.ZodTypeAny =\n componentUid !== undefined\n ? buildComponentInputSchema(strapi, componentUid, visited)\n : z.record(z.string(), z.unknown());\n\n let s: z.ZodTypeAny =\n componentAttr.repeatable === true ? z.array(componentSchema) : componentSchema;\n if (componentAttr.repeatable === true && componentAttr.min !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).min(componentAttr.min);\n }\n if (componentAttr.repeatable === true && componentAttr.max !== undefined) {\n s = (s as z.ZodArray<z.ZodTypeAny>).max(componentAttr.max);\n }\n return componentAttr.required === true ? s : s.optional();\n }\n case 'dynamiczone': {\n const dzAttr = attr as unknown as { required?: boolean; min?: number; max?: number };\n let s = z.array(z.any());\n if (dzAttr.min !== undefined) s = (s as z.ZodArray<z.ZodAny>).min(dzAttr.min);\n if (dzAttr.max !== undefined) s = (s as z.ZodArray<z.ZodAny>).max(dzAttr.max);\n return dzAttr.required === true ? s : s.optional();\n }\n case 'media': {\n const mediaAttr = attr as unknown as { required?: boolean; multiple?: boolean };\n const s = mediaAttr.multiple === true ? z.array(z.any()) : z.any();\n return mediaAttr.required === true ? s : s.optional();\n }\n case 'relation': {\n const relAttr = attr as Schema.Attribute.Relation;\n const isToMany = relAttr.relation?.endsWith('ToMany') === true;\n\n const relDocumentId = z\n .string()\n .min(1)\n .describe('Strapi document ID (e.g. \"z7v8zma53x01r6oceimv922b\").');\n\n const relLongHand = z\n .object({\n documentId: relDocumentId,\n locale: z\n .string()\n .optional()\n .describe('Target locale. Defaults to source document locale.'),\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe('Target version status. Defaults based on draftAndPublish config.'),\n })\n .strict();\n\n let s: z.ZodTypeAny;\n\n if (isToMany === true) {\n const relEntry = z.union([relDocumentId, relLongHand]);\n\n const relConnectPosition = z\n .object({\n before: z.string().optional().describe('Document ID to insert before.'),\n after: z.string().optional().describe('Document ID to insert after.'),\n start: z.boolean().optional().describe('Insert at start of list.'),\n end: z.boolean().optional().describe('Insert at end of list (default).'),\n })\n .strict();\n\n const relConnectEntry = z\n .object({\n documentId: relDocumentId,\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n position: relConnectPosition\n .optional()\n .describe('Ordering hint. Default: { end: true }.'),\n })\n .strict();\n\n s = z\n .object({\n connect: z\n .array(z.union([relDocumentId, relConnectEntry]))\n .optional()\n .describe(\n 'Add relations. Each entry: documentId string, or { documentId, locale?, status?, position? }.'\n ),\n disconnect: z\n .array(relEntry)\n .optional()\n .describe(\n 'Remove relations. Each entry: documentId string, or { documentId, locale?, status? }.'\n ),\n set: z\n .union([z.array(relEntry), z.null()])\n .optional()\n .describe(\n 'Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.'\n ),\n })\n .strict()\n .refine(\n (value) =>\n value.set === undefined ||\n (value.connect === undefined && value.disconnect === undefined),\n {\n message: 'set is mutually exclusive with connect and disconnect',\n path: ['set'],\n }\n );\n } else {\n s = z.union([\n relDocumentId,\n relLongHand,\n z.null().describe('Set to null to clear the relation.'),\n ]);\n }\n\n return relAttr.required === true ? s : s.optional();\n }\n default: {\n const unknownAttr: unknown = attr;\n if (isCustomFieldAttribute(unknownAttr)) {\n const customField = strapi.get('custom-fields').get(unknownAttr.customField);\n if (customField !== undefined) {\n return attributeToInputSchema(\n strapi,\n {\n ...unknownAttr,\n type: customField.type,\n } as unknown as Schema.Attribute.AnyAttribute,\n visited\n );\n }\n }\n return z.unknown();\n }\n }\n};\n\n/**\n * Derives a per-content-type `data` Zod schema from the model's writable attributes.\n * Uses `contentTypes.isWritableAttribute` to filter system-managed keys\n * (id, documentId, timestamps, createdBy, updatedBy, localizations, locale, etc.).\n * Unknown keys are rejected (strict mode) — invalid field names fail at the MCP boundary.\n */\nexport const buildDataSchema = (\n strapi: Core.Strapi,\n schema: Struct.ContentTypeSchema | ContentManagerModelForMcp,\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, attr] of Object.entries(attributes)) {\n const isPermitted =\n permittedFields === null ||\n permittedFields === undefined ||\n permittedFields.has(key) === true;\n\n if (\n isPermitted === true &&\n contentTypes.isWritableAttribute(schema as Struct.ContentTypeSchema, key) === true &&\n contentTypes.isPrivateAttribute(schema as Struct.ContentTypeSchema, key) !== true\n ) {\n shape[key] = attributeToInputSchema(strapi, attr);\n }\n }\n\n return z.object(shape).strict().describe('Document field values to write.');\n};\n"],"names":["isCustomFieldAttribute","attr","type","customField","buildComponentInputSchema","strapi","componentUid","visited","Set","has","z","record","string","unknown","componentsMap","components","component","undefined","add","shape","key","Object","entries","attributes","attributeToInputSchema","delete","object","strict","required","minLength","maxLength","s","min","max","optional","email","number","int","boolean","enum","values","Array","isArray","length","any","buildBlocksInputSchema","componentAttr","componentSchema","repeatable","array","dzAttr","mediaAttr","multiple","relAttr","isToMany","relation","endsWith","relDocumentId","describe","relLongHand","documentId","locale","status","relEntry","union","relConnectPosition","before","after","start","end","relConnectEntry","position","connect","disconnect","set","null","refine","value","message","path","unknownAttr","get","buildDataSchema","schema","permittedFields","isPermitted","contentTypes","isWritableAttribute","isPrivateAttribute"],"mappings":";;;;;AAYA,MAAMA,yBAAyB,CAACC,IAAAA,GAC9B,OAAOA,IAAAA,KAAS,YAChBA,IAAAA,KAAS,IAAA,IACT,IAACA,CAAiCC,IAAI,KAAK,aAAA,IAC3C,OAAO,IAACD,CAAiCE,WAAW,KAAK,QAAA;AAE3D;;;;;;;;;IAUO,SAASC,yBAAAA,CACdC,MAAmB,EACnBC,YAAoB,EACpBC,OAAAA,GAAuB,IAAIC,GAAAA,EAAK,EAAA;AAEhC,IAAA,IAAID,OAAAA,CAAQE,GAAG,CAACH,YAAAA,CAAAA,KAAkB,IAAA,EAAM;;AAEtC,QAAA,OAAOI,cAAEC,MAAM,CAACD,cAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;IAGA,MAAMC,aAAAA,GAAgBT,OAAOU,UAAU;IACvC,MAAMC,SAAAA,GAAYF,aAAa,CAACR,YAAAA,CAAa;AAC7C,IAAA,IAAIU,cAAcC,SAAAA,EAAW;AAC3B,QAAA,OAAOP,cAAEC,MAAM,CAACD,cAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;AACvC,IAAA;AAEAN,IAAAA,OAAAA,CAAQW,GAAG,CAACZ,YAAAA,CAAAA;AAEZ,IAAA,MAAMa,QAAsC,EAAC;IAC7C,KAAK,MAAM,CAACC,GAAAA,EAAKnB,IAAAA,CAAK,IAAIoB,OAAOC,OAAO,CAACN,SAAAA,CAAUO,UAAU,CAAA,CAAG;AAC9D,QAAA,IAAIH,QAAQ,IAAA,EAAM;AAEhB,YAAA;AACF,QAAA;AACAD,QAAAA,KAAK,CAACC,GAAAA,CAAI,GAAGI,sBAAAA,CAAuBnB,QAAQJ,IAAAA,EAAMM,OAAAA,CAAAA;AACpD,IAAA;AAEAA,IAAAA,OAAAA,CAAQkB,MAAM,CAACnB,YAAAA,CAAAA;AAEf,IAAA,OAAOI,aAAAA,CAAEgB,MAAM,CAACP,KAAAA,CAAAA,CAAOQ,MAAM,EAAA;AAC/B;AAEA;;;;;;;;;UAUaH,sBAAAA,GAAyB,CACpCnB,QACAJ,IAAAA,EACAM,OAAAA,GAAuB,IAAIC,GAAAA,EAAK,GAAA;AAEhC,IAAA,OAAQP,KAAKC,IAAI;QACf,KAAK,QAAA;QACL,KAAK,MAAA;QACL,KAAK,UAAA;QACL,KAAK,UAAA;AAAY,YAAA;AACf,gBAAA,MAAM,EAAE0B,QAAQ,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAG7B,IAAAA;gBAC3C,IAAI8B,CAAAA,GAAiBrB,cAAEE,MAAM,EAAA;AAC7B,gBAAA,IAAIiB,SAAAA,KAAcZ,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACH,SAAAA,CAAAA;AACvC,gBAAA,IAAIC,SAAAA,KAAcb,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACH,SAAAA,CAAAA;AACvC,gBAAA,OAAOF,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,OAAA;AAAS,YAAA;gBACZ,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;AACrB,gBAAA,MAAM8B,CAAAA,GAAIrB,aAAAA,CAAEE,MAAM,EAAA,CAAGuB,KAAK,EAAA;AAC1B,gBAAA,OAAOP,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,KAAA;AAAO,YAAA;gBACV,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;AAAW,YAAA;AACd,gBAAA,MAAM,EAAEN,QAAQ,EAAEI,GAAG,EAAEC,GAAG,EAAE,GAAGhC,IAAAA;AAC/B,gBAAA,IAAI8B,CAAAA,GAAIrB,aAAAA,CAAE0B,MAAM,EAAA,CAAGC,GAAG,EAAA;AACtB,gBAAA,IAAIL,GAAAA,KAAQf,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,IAAIC,GAAAA,KAAQhB,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,OAAOL,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,YAAA;AAAc,YAAA;gBACjB,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;QACL,KAAK,OAAA;AAAS,YAAA;AACZ,gBAAA,MAAM,EAAEN,QAAQ,EAAEI,GAAG,EAAEC,GAAG,EAAE,GAAGhC,IAAAA;gBAC/B,IAAI8B,CAAAA,GAAIrB,cAAE0B,MAAM,EAAA;AAChB,gBAAA,IAAIJ,GAAAA,KAAQf,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEC,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,IAAIC,GAAAA,KAAQhB,SAAAA,EAAWc,CAAAA,GAAIA,CAAAA,CAAEE,GAAG,CAACA,GAAAA,CAAAA;AACjC,gBAAA,OAAOL,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,SAAA;AAAW,YAAA;gBACd,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAE4B,OAAO,EAAA;AACnB,gBAAA,OAAOV,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,MAAA;QACL,KAAK,UAAA;QACL,KAAK,MAAA;QACL,KAAK,WAAA;AAAa,YAAA;gBAChB,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,aAAA;AAAe,YAAA;AAClB,gBAAA,MAAM,EAAEN,QAAQ,EAAEW,IAAAA,EAAMC,MAAM,EAAE,GAAGvC,IAAAA;AACnC,gBAAA,IAAIwC,MAAMC,OAAO,CAACF,WAAWA,MAAAA,CAAOG,MAAM,GAAG,CAAA,EAAG;oBAC9C,MAAMZ,CAAAA,GAAIrB,aAAAA,CAAE6B,IAAI,CAACC,MAAAA,CAAAA;AACjB,oBAAA,OAAOZ,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,gBAAA;gBACA,MAAMH,CAAAA,GAAIrB,cAAEE,MAAM,EAAA;AAClB,gBAAA,OAAOgB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,MAAA;AAAQ,YAAA;gBACX,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;gBACrB,MAAM8B,CAAAA,GAAIrB,cAAEkC,GAAG,EAAA;AACf,gBAAA,OAAOhB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,QAAA;AAAU,YAAA;gBACb,MAAM,EAAEN,QAAQ,EAAE,GAAG3B,IAAAA;AACrB,gBAAA,MAAM8B,CAAAA,GAAIc,mCAAAA,EAAAA;AACV,gBAAA,OAAOjB,QAAAA,KAAa,IAAA,GAAOG,CAAAA,GAAIA,CAAAA,CAAEG,QAAQ,EAAA;AAC3C,YAAA;QACA,KAAK,WAAA;AAAa,YAAA;;AAEhB,gBAAA,MAAMY,aAAAA,GAAgB7C,IAAAA;gBAOtB,MAAMK,YAAAA,GAAewC,cAAc9B,SAAS;AAC5C,gBAAA,MAAM+B,eAAAA,GACJzC,YAAAA,KAAiBW,SAAAA,GACbb,yBAAAA,CAA0BC,QAAQC,YAAAA,EAAcC,OAAAA,CAAAA,GAChDG,aAAAA,CAAEC,MAAM,CAACD,aAAAA,CAAEE,MAAM,EAAA,EAAIF,cAAEG,OAAO,EAAA,CAAA;gBAEpC,IAAIkB,CAAAA,GACFe,cAAcE,UAAU,KAAK,OAAOtC,aAAAA,CAAEuC,KAAK,CAACF,eAAAA,CAAAA,GAAmBA,eAAAA;AACjE,gBAAA,IAAID,cAAcE,UAAU,KAAK,QAAQF,aAAAA,CAAcd,GAAG,KAAKf,SAAAA,EAAW;AACxEc,oBAAAA,CAAAA,GAAI,CAACA,CAA+BC,GAAG,CAACc,cAAcd,GAAG,CAAA;AAC3D,gBAAA;AACA,gBAAA,IAAIc,cAAcE,UAAU,KAAK,QAAQF,aAAAA,CAAcb,GAAG,KAAKhB,SAAAA,EAAW;AACxEc,oBAAAA,CAAAA,GAAI,CAACA,CAA+BE,GAAG,CAACa,cAAcb,GAAG,CAAA;AAC3D,gBAAA;AACA,gBAAA,OAAOa,cAAclB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACzD,YAAA;QACA,KAAK,aAAA;AAAe,YAAA;AAClB,gBAAA,MAAMgB,MAAAA,GAASjD,IAAAA;AACf,gBAAA,IAAI8B,CAAAA,GAAIrB,aAAAA,CAAEuC,KAAK,CAACvC,cAAEkC,GAAG,EAAA,CAAA;gBACrB,IAAIM,MAAAA,CAAOlB,GAAG,KAAKf,SAAAA,EAAWc,CAAAA,GAAI,CAACA,CAA2BC,GAAG,CAACkB,MAAAA,CAAOlB,GAAG,CAAA;gBAC5E,IAAIkB,MAAAA,CAAOjB,GAAG,KAAKhB,SAAAA,EAAWc,CAAAA,GAAI,CAACA,CAA2BE,GAAG,CAACiB,MAAAA,CAAOjB,GAAG,CAAA;AAC5E,gBAAA,OAAOiB,OAAOtB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AAClD,YAAA;QACA,KAAK,OAAA;AAAS,YAAA;AACZ,gBAAA,MAAMiB,SAAAA,GAAYlD,IAAAA;AAClB,gBAAA,MAAM8B,CAAAA,GAAIoB,SAAAA,CAAUC,QAAQ,KAAK,IAAA,GAAO1C,aAAAA,CAAEuC,KAAK,CAACvC,aAAAA,CAAEkC,GAAG,EAAA,CAAA,GAAMlC,aAAAA,CAAEkC,GAAG,EAAA;AAChE,gBAAA,OAAOO,UAAUvB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACrD,YAAA;QACA,KAAK,UAAA;AAAY,YAAA;AACf,gBAAA,MAAMmB,OAAAA,GAAUpD,IAAAA;AAChB,gBAAA,MAAMqD,QAAAA,GAAWD,OAAAA,CAAQE,QAAQ,EAAEC,SAAS,QAAA,CAAA,KAAc,IAAA;gBAE1D,MAAMC,aAAAA,GAAgB/C,cACnBE,MAAM,EAAA,CACNoB,GAAG,CAAC,CAAA,CAAA,CACJ0B,QAAQ,CAAC,uDAAA,CAAA;gBAEZ,MAAMC,WAAAA,GAAcjD,aAAAA,CACjBgB,MAAM,CAAC;oBACNkC,UAAAA,EAAYH,aAAAA;AACZI,oBAAAA,MAAAA,EAAQnD,cACLE,MAAM,EAAA,CACNsB,QAAQ,EAAA,CACRwB,QAAQ,CAAC,oDAAA,CAAA;oBACZI,MAAAA,EAAQpD,aAAAA,CACL6B,IAAI,CAAC;AAAC,wBAAA,OAAA;AAAS,wBAAA;qBAAY,CAAA,CAC3BL,QAAQ,EAAA,CACRwB,QAAQ,CAAC,kEAAA;AACd,iBAAA,CAAA,CACC/B,MAAM,EAAA;gBAET,IAAII,CAAAA;AAEJ,gBAAA,IAAIuB,aAAa,IAAA,EAAM;oBACrB,MAAMS,QAAAA,GAAWrD,aAAAA,CAAEsD,KAAK,CAAC;AAACP,wBAAAA,aAAAA;AAAeE,wBAAAA;AAAY,qBAAA,CAAA;oBAErD,MAAMM,kBAAAA,GAAqBvD,aAAAA,CACxBgB,MAAM,CAAC;AACNwC,wBAAAA,MAAAA,EAAQxD,cAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,+BAAA,CAAA;AACvCS,wBAAAA,KAAAA,EAAOzD,cAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,8BAAA,CAAA;AACtCU,wBAAAA,KAAAA,EAAO1D,cAAE4B,OAAO,EAAA,CAAGJ,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,0BAAA,CAAA;AACvCW,wBAAAA,GAAAA,EAAK3D,cAAE4B,OAAO,EAAA,CAAGJ,QAAQ,EAAA,CAAGwB,QAAQ,CAAC,kCAAA;AACvC,qBAAA,CAAA,CACC/B,MAAM,EAAA;oBAET,MAAM2C,eAAAA,GAAkB5D,aAAAA,CACrBgB,MAAM,CAAC;wBACNkC,UAAAA,EAAYH,aAAAA;wBACZI,MAAAA,EAAQnD,aAAAA,CAAEE,MAAM,EAAA,CAAGsB,QAAQ,EAAA;wBAC3B4B,MAAAA,EAAQpD,aAAAA,CAAE6B,IAAI,CAAC;AAAC,4BAAA,OAAA;AAAS,4BAAA;AAAY,yBAAA,CAAA,CAAEL,QAAQ,EAAA;AAC/CqC,wBAAAA,QAAAA,EAAUN,kBAAAA,CACP/B,QAAQ,EAAA,CACRwB,QAAQ,CAAC,wCAAA;AACd,qBAAA,CAAA,CACC/B,MAAM,EAAA;oBAETI,CAAAA,GAAIrB,aAAAA,CACDgB,MAAM,CAAC;AACN8C,wBAAAA,OAAAA,EAAS9D,aAAAA,CACNuC,KAAK,CAACvC,aAAAA,CAAEsD,KAAK,CAAC;AAACP,4BAAAA,aAAAA;AAAea,4BAAAA;yBAAgB,CAAA,CAAA,CAC9CpC,QAAQ,EAAA,CACRwB,QAAQ,CACP,+FAAA,CAAA;AAEJe,wBAAAA,UAAAA,EAAY/D,cACTuC,KAAK,CAACc,UACN7B,QAAQ,EAAA,CACRwB,QAAQ,CACP,uFAAA,CAAA;wBAEJgB,GAAAA,EAAKhE,aAAAA,CACFsD,KAAK,CAAC;AAACtD,4BAAAA,aAAAA,CAAEuC,KAAK,CAACc,QAAAA,CAAAA;AAAWrD,4BAAAA,aAAAA,CAAEiE,IAAI;yBAAG,CAAA,CACnCzC,QAAQ,EAAA,CACRwB,QAAQ,CACP,8GAAA;AAEN,qBAAA,CAAA,CACC/B,MAAM,EAAA,CACNiD,MAAM,CACL,CAACC,QACCA,KAAAA,CAAMH,GAAG,KAAKzD,SAAAA,IACb4D,MAAML,OAAO,KAAKvD,aAAa4D,KAAAA,CAAMJ,UAAU,KAAKxD,SAAAA,EACvD;wBACE6D,OAAAA,EAAS,uDAAA;wBACTC,IAAAA,EAAM;AAAC,4BAAA;AAAM;AACf,qBAAA,CAAA;gBAEN,CAAA,MAAO;oBACLhD,CAAAA,GAAIrB,aAAAA,CAAEsD,KAAK,CAAC;AACVP,wBAAAA,aAAAA;AACAE,wBAAAA,WAAAA;wBACAjD,aAAAA,CAAEiE,IAAI,EAAA,CAAGjB,QAAQ,CAAC,oCAAA;AACnB,qBAAA,CAAA;AACH,gBAAA;AAEA,gBAAA,OAAOL,QAAQzB,QAAQ,KAAK,IAAA,GAAOG,CAAAA,GAAIA,EAAEG,QAAQ,EAAA;AACnD,YAAA;AACA,QAAA;AAAS,YAAA;AACP,gBAAA,MAAM8C,WAAAA,GAAuB/E,IAAAA;AAC7B,gBAAA,IAAID,uBAAuBgF,WAAAA,CAAAA,EAAc;oBACvC,MAAM7E,WAAAA,GAAcE,OAAO4E,GAAG,CAAC,iBAAiBA,GAAG,CAACD,YAAY7E,WAAW,CAAA;AAC3E,oBAAA,IAAIA,gBAAgBc,SAAAA,EAAW;AAC7B,wBAAA,OAAOO,uBACLnB,MAAAA,EACA;AACE,4BAAA,GAAG2E,WAAW;AACd9E,4BAAAA,IAAAA,EAAMC,YAAYD;yBACpB,EACAK,OAAAA,CAAAA;AAEJ,oBAAA;AACF,gBAAA;AACA,gBAAA,OAAOG,cAAEG,OAAO,EAAA;AAClB,YAAA;AACF;AACF;AAEA;;;;;AAKC,IACM,MAAMqE,eAAAA,GAAkB,CAC7B7E,MAAAA,EACA8E,QACA5D,UAAAA,EACA6D,eAAAA,GAAAA;AAEA,IAAA,MAAMjE,QAAsC,EAAC;IAE7C,KAAK,MAAM,CAACC,GAAAA,EAAKnB,IAAAA,CAAK,IAAIoB,MAAAA,CAAOC,OAAO,CAACC,UAAAA,CAAAA,CAAa;QACpD,MAAM8D,WAAAA,GACJD,oBAAoB,IAAA,IACpBA,eAAAA,KAAoBnE,aACpBmE,eAAAA,CAAgB3E,GAAG,CAACW,GAAAA,CAAAA,KAAS,IAAA;AAE/B,QAAA,IACEiE,WAAAA,KAAgB,IAAA,IAChBC,wBAAAA,CAAaC,mBAAmB,CAACJ,MAAAA,EAAoC/D,GAAAA,CAAAA,KAAS,IAAA,IAC9EkE,wBAAAA,CAAaE,kBAAkB,CAACL,MAAAA,EAAoC/D,SAAS,IAAA,EAC7E;AACAD,YAAAA,KAAK,CAACC,GAAAA,CAAI,GAAGI,sBAAAA,CAAuBnB,MAAAA,EAAQJ,IAAAA,CAAAA;AAC9C,QAAA;AACF,IAAA;AAEA,IAAA,OAAOS,cAAEgB,MAAM,CAACP,OAAOQ,MAAM,EAAA,CAAG+B,QAAQ,CAAC,iCAAA,CAAA;AAC3C;;;;;;"}
|
|
@@ -199,7 +199,12 @@ const isCustomFieldAttribute = (attr)=>typeof attr === 'object' && attr !== null
|
|
|
199
199
|
z.array(relEntry),
|
|
200
200
|
z.null()
|
|
201
201
|
]).optional().describe('Replace all relations. Array replaces existing; null clears all. Mutually exclusive with connect/disconnect.')
|
|
202
|
-
}).strict()
|
|
202
|
+
}).strict().refine((value)=>value.set === undefined || value.connect === undefined && value.disconnect === undefined, {
|
|
203
|
+
message: 'set is mutually exclusive with connect and disconnect',
|
|
204
|
+
path: [
|
|
205
|
+
'set'
|
|
206
|
+
]
|
|
207
|
+
});
|
|
203
208
|
} else {
|
|
204
209
|
s = z.union([
|
|
205
210
|
relDocumentId,
|