@strapi/core 5.46.1 → 5.47.1
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/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +12 -3
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +12 -3
- package/dist/Strapi.mjs.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +12 -5
- package/dist/compile.js.map +1 -1
- package/dist/compile.mjs +12 -5
- package/dist/compile.mjs.map +1 -1
- package/dist/core-api/routes/index.js +2 -0
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +2 -0
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +13 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +15 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +15 -2
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/middlewares/session.d.ts +2 -2
- package/dist/middlewares/session.d.ts.map +1 -1
- package/dist/middlewares/session.js +1 -1
- package/dist/middlewares/session.js.map +1 -1
- package/dist/middlewares/session.mjs +2 -2
- package/dist/middlewares/session.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +16 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +16 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +3 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/mcp.d.ts +3 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +39 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/mcp.mjs +37 -0
- package/dist/providers/mcp.mjs.map +1 -0
- package/dist/providers/session-manager.d.ts.map +1 -1
- package/dist/providers/session-manager.js +3 -0
- package/dist/providers/session-manager.js.map +1 -1
- package/dist/providers/session-manager.mjs +3 -0
- package/dist/providers/session-manager.mjs.map +1 -1
- package/dist/services/ai.d.ts.map +1 -1
- package/dist/services/ai.js +3 -0
- package/dist/services/ai.js.map +1 -1
- package/dist/services/ai.mjs +3 -0
- package/dist/services/ai.mjs.map +1 -1
- package/dist/services/cron.d.ts +1 -1
- package/dist/services/cron.d.ts.map +1 -1
- package/dist/services/cron.js +10 -2
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +10 -2
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +2 -16
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +0 -53
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +2 -53
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +2 -2
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/publication-filter.d.ts +6 -0
- package/dist/services/document-service/publication-filter.d.ts.map +1 -0
- package/dist/services/document-service/publication-filter.js +20 -0
- package/dist/services/document-service/publication-filter.js.map +1 -0
- package/dist/services/document-service/publication-filter.mjs +15 -0
- package/dist/services/document-service/publication-filter.mjs.map +1 -0
- package/dist/services/document-service/transform/query.d.ts +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +32 -19
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +33 -20
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/authentication.d.ts +23 -0
- package/dist/services/mcp/authentication.d.ts.map +1 -0
- package/dist/services/mcp/authentication.js +45 -0
- package/dist/services/mcp/authentication.js.map +1 -0
- package/dist/services/mcp/authentication.mjs +43 -0
- package/dist/services/mcp/authentication.mjs.map +1 -0
- package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
- package/dist/services/mcp/handlers/handlePost.js +59 -0
- package/dist/services/mcp/handlers/handlePost.js.map +1 -0
- package/dist/services/mcp/handlers/handlePost.mjs +57 -0
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
- package/dist/services/mcp/handlers/types.d.ts +12 -0
- package/dist/services/mcp/handlers/types.d.ts.map +1 -0
- package/dist/services/mcp/index.d.ts +6 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +101 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/index.mjs +99 -0
- package/dist/services/mcp/index.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.js +34 -0
- package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.js +71 -0
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
- package/dist/services/mcp/metrics/metrics.d.ts +29 -0
- package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/metrics.js +97 -0
- package/dist/services/mcp/metrics/metrics.js.map +1 -0
- package/dist/services/mcp/metrics/metrics.mjs +88 -0
- package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
- package/dist/services/mcp/prompt-registry.d.ts +16 -0
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
- package/dist/services/mcp/prompt-registry.js +77 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -0
- package/dist/services/mcp/prompt-registry.mjs +75 -0
- package/dist/services/mcp/prompt-registry.mjs.map +1 -0
- package/dist/services/mcp/resource-registry.d.ts +14 -0
- package/dist/services/mcp/resource-registry.d.ts.map +1 -0
- package/dist/services/mcp/resource-registry.js +67 -0
- package/dist/services/mcp/resource-registry.js.map +1 -0
- package/dist/services/mcp/resource-registry.mjs +65 -0
- package/dist/services/mcp/resource-registry.mjs.map +1 -0
- package/dist/services/mcp/routes.d.ts +11 -0
- package/dist/services/mcp/routes.d.ts.map +1 -0
- package/dist/services/mcp/routes.js +58 -0
- package/dist/services/mcp/routes.js.map +1 -0
- package/dist/services/mcp/routes.mjs +56 -0
- package/dist/services/mcp/routes.mjs.map +1 -0
- package/dist/services/mcp/tool-registry.d.ts +25 -0
- package/dist/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/services/mcp/tool-registry.js +102 -0
- package/dist/services/mcp/tool-registry.js.map +1 -0
- package/dist/services/mcp/tool-registry.mjs +99 -0
- package/dist/services/mcp/tool-registry.mjs.map +1 -0
- package/dist/services/mcp/tools/log.d.ts +87 -0
- package/dist/services/mcp/tools/log.d.ts.map +1 -0
- package/dist/services/mcp/tools/log.js +88 -0
- package/dist/services/mcp/tools/log.js.map +1 -0
- package/dist/services/mcp/tools/log.mjs +86 -0
- package/dist/services/mcp/tools/log.mjs.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
- package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
- package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
- package/dist/services/mcp/utils/withTimeout.js +23 -0
- package/dist/services/mcp/utils/withTimeout.js.map +1 -0
- package/dist/services/mcp/utils/withTimeout.mjs +21 -0
- package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +9 -6
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +9 -6
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +11 -3
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs +11 -3
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/package.json +16 -15
|
@@ -93,57 +93,6 @@ var strapiUtils = require('@strapi/utils');
|
|
|
93
93
|
}
|
|
94
94
|
return params;
|
|
95
95
|
};
|
|
96
|
-
/**
|
|
97
|
-
* Parses and sanitizes the hasPublishedVersion parameter.
|
|
98
|
-
* Returns normalized boolean value or undefined if not provided.
|
|
99
|
-
* Throws ValidationError for invalid input (400 response).
|
|
100
|
-
*/ const parseHasPublishedVersion = (value)=>{
|
|
101
|
-
if (value === undefined || value === null) {
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
if (value === true || value === 'true') {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
if (value === false || value === 'false') {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
throw new strapiUtils.errors.ValidationError("Invalid value for 'hasPublishedVersion'. Expected boolean or 'true'/'false' string.");
|
|
111
|
-
};
|
|
112
|
-
/**
|
|
113
|
-
* Synchronous helper that returns the "has published version" condition for a given model.
|
|
114
|
-
* Returns the documentId subquery condition, or null if the model doesn't use draft & publish.
|
|
115
|
-
*
|
|
116
|
-
* This is used by the filters function in transform/query.ts so that the condition
|
|
117
|
-
* is applied to both root and nested (populate) queries.
|
|
118
|
-
*/ const getHasPublishedVersionCondition = (uid, hasPublishedVersion)=>{
|
|
119
|
-
const model = strapi.getModel(uid);
|
|
120
|
-
// Ignore if target model has disabled DP or doesn't exist (e.g., components)
|
|
121
|
-
if (!model || !strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
// Get table and column names from metadata
|
|
125
|
-
const meta = strapi.db.metadata.get(uid);
|
|
126
|
-
const tableName = meta.tableName;
|
|
127
|
-
const documentIdAttr = meta.attributes.documentId;
|
|
128
|
-
const publishedAtAttr = meta.attributes.publishedAt;
|
|
129
|
-
const documentIdColumn = 'columnName' in documentIdAttr && documentIdAttr.columnName || 'document_id';
|
|
130
|
-
const publishedAtColumn = 'columnName' in publishedAtAttr && publishedAtAttr.columnName || 'published_at';
|
|
131
|
-
// Create a Knex subquery that selects document IDs with published entries
|
|
132
|
-
const knex = strapi.db.connection;
|
|
133
|
-
const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);
|
|
134
|
-
if (hasPublishedVersion) {
|
|
135
|
-
return {
|
|
136
|
-
documentId: {
|
|
137
|
-
$in: subquery
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
documentId: {
|
|
143
|
-
$notIn: subquery
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
};
|
|
147
96
|
const setStatusToDraftCurry = fp.curry(setStatusToDraft);
|
|
148
97
|
const defaultToDraftCurry = fp.curry(defaultToDraft);
|
|
149
98
|
const defaultStatusCurry = fp.curry(defaultStatus);
|
|
@@ -154,8 +103,6 @@ const statusToDataCurry = fp.curry(statusToData);
|
|
|
154
103
|
exports.defaultStatus = defaultStatusCurry;
|
|
155
104
|
exports.defaultToDraft = defaultToDraftCurry;
|
|
156
105
|
exports.filterDataPublishedAt = filterDataPublishedAtCurry;
|
|
157
|
-
exports.getHasPublishedVersionCondition = getHasPublishedVersionCondition;
|
|
158
|
-
exports.parseHasPublishedVersion = parseHasPublishedVersion;
|
|
159
106
|
exports.setStatusToDraft = setStatusToDraftCurry;
|
|
160
107
|
exports.statusToData = statusToDataCurry;
|
|
161
108
|
exports.statusToLookup = statusToLookupCurry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-and-publish.js","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct, UID } from '@strapi/types';\nimport { contentTypes, errors } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\n/**\n * Parses and sanitizes the hasPublishedVersion parameter.\n * Returns normalized boolean value or undefined if not provided.\n * Throws ValidationError for invalid input (400 response).\n */\nconst parseHasPublishedVersion = (value: unknown): boolean | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n throw new errors.ValidationError(\n \"Invalid value for 'hasPublishedVersion'. Expected boolean or 'true'/'false' string.\"\n );\n};\n\n/**\n * Synchronous helper that returns the \"has published version\" condition for a given model.\n * Returns the documentId subquery condition, or null if the model doesn't use draft & publish.\n *\n * This is used by the filters function in transform/query.ts so that the condition\n * is applied to both root and nested (populate) queries.\n */\nconst getHasPublishedVersionCondition = (\n uid: UID.Schema,\n hasPublishedVersion: boolean\n): Record<string, any> | null => {\n const model = strapi.getModel(uid);\n\n // Ignore if target model has disabled DP or doesn't exist (e.g., components)\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n // Get table and column names from metadata\n const meta = strapi.db.metadata.get(uid);\n const tableName = meta.tableName;\n const documentIdAttr = meta.attributes.documentId;\n const publishedAtAttr = meta.attributes.publishedAt;\n const documentIdColumn =\n ('columnName' in documentIdAttr && documentIdAttr.columnName) || 'document_id';\n const publishedAtColumn =\n ('columnName' in publishedAtAttr && publishedAtAttr.columnName) || 'published_at';\n\n // Create a Knex subquery that selects document IDs with published entries\n const knex = strapi.db.connection;\n const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);\n\n if (hasPublishedVersion) {\n return { documentId: { $in: subquery } };\n }\n\n return { documentId: { $notIn: subquery } };\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n parseHasPublishedVersion,\n getHasPublishedVersionCondition,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","parseHasPublishedVersion","value","undefined","errors","ValidationError","getHasPublishedVersionCondition","uid","hasPublishedVersion","model","strapi","getModel","meta","db","metadata","get","tableName","documentIdAttr","attributes","documentId","publishedAtAttr","documentIdColumn","columnName","publishedAtColumn","knex","connection","subquery","distinct","whereNotNull","$in","$notIn","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"draft-and-publish.js","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { curry, assoc } from 'lodash/fp';
|
|
2
|
-
import { contentTypes
|
|
2
|
+
import { contentTypes } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* DP enabled -> set status to draft
|
|
@@ -91,57 +91,6 @@ import { contentTypes, errors } from '@strapi/utils';
|
|
|
91
91
|
}
|
|
92
92
|
return params;
|
|
93
93
|
};
|
|
94
|
-
/**
|
|
95
|
-
* Parses and sanitizes the hasPublishedVersion parameter.
|
|
96
|
-
* Returns normalized boolean value or undefined if not provided.
|
|
97
|
-
* Throws ValidationError for invalid input (400 response).
|
|
98
|
-
*/ const parseHasPublishedVersion = (value)=>{
|
|
99
|
-
if (value === undefined || value === null) {
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
if (value === true || value === 'true') {
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
if (value === false || value === 'false') {
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
throw new errors.ValidationError("Invalid value for 'hasPublishedVersion'. Expected boolean or 'true'/'false' string.");
|
|
109
|
-
};
|
|
110
|
-
/**
|
|
111
|
-
* Synchronous helper that returns the "has published version" condition for a given model.
|
|
112
|
-
* Returns the documentId subquery condition, or null if the model doesn't use draft & publish.
|
|
113
|
-
*
|
|
114
|
-
* This is used by the filters function in transform/query.ts so that the condition
|
|
115
|
-
* is applied to both root and nested (populate) queries.
|
|
116
|
-
*/ const getHasPublishedVersionCondition = (uid, hasPublishedVersion)=>{
|
|
117
|
-
const model = strapi.getModel(uid);
|
|
118
|
-
// Ignore if target model has disabled DP or doesn't exist (e.g., components)
|
|
119
|
-
if (!model || !contentTypes.hasDraftAndPublish(model)) {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
// Get table and column names from metadata
|
|
123
|
-
const meta = strapi.db.metadata.get(uid);
|
|
124
|
-
const tableName = meta.tableName;
|
|
125
|
-
const documentIdAttr = meta.attributes.documentId;
|
|
126
|
-
const publishedAtAttr = meta.attributes.publishedAt;
|
|
127
|
-
const documentIdColumn = 'columnName' in documentIdAttr && documentIdAttr.columnName || 'document_id';
|
|
128
|
-
const publishedAtColumn = 'columnName' in publishedAtAttr && publishedAtAttr.columnName || 'published_at';
|
|
129
|
-
// Create a Knex subquery that selects document IDs with published entries
|
|
130
|
-
const knex = strapi.db.connection;
|
|
131
|
-
const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);
|
|
132
|
-
if (hasPublishedVersion) {
|
|
133
|
-
return {
|
|
134
|
-
documentId: {
|
|
135
|
-
$in: subquery
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
return {
|
|
140
|
-
documentId: {
|
|
141
|
-
$notIn: subquery
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
};
|
|
145
94
|
const setStatusToDraftCurry = curry(setStatusToDraft);
|
|
146
95
|
const defaultToDraftCurry = curry(defaultToDraft);
|
|
147
96
|
const defaultStatusCurry = curry(defaultStatus);
|
|
@@ -149,5 +98,5 @@ const filterDataPublishedAtCurry = curry(filterDataPublishedAt);
|
|
|
149
98
|
const statusToLookupCurry = curry(statusToLookup);
|
|
150
99
|
const statusToDataCurry = curry(statusToData);
|
|
151
100
|
|
|
152
|
-
export { defaultStatusCurry as defaultStatus, defaultToDraftCurry as defaultToDraft, filterDataPublishedAtCurry as filterDataPublishedAt,
|
|
101
|
+
export { defaultStatusCurry as defaultStatus, defaultToDraftCurry as defaultToDraft, filterDataPublishedAtCurry as filterDataPublishedAt, setStatusToDraftCurry as setStatusToDraft, statusToDataCurry as statusToData, statusToLookupCurry as statusToLookup };
|
|
153
102
|
//# sourceMappingURL=draft-and-publish.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct, UID } from '@strapi/types';\nimport { contentTypes, errors } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\n/**\n * Parses and sanitizes the hasPublishedVersion parameter.\n * Returns normalized boolean value or undefined if not provided.\n * Throws ValidationError for invalid input (400 response).\n */\nconst parseHasPublishedVersion = (value: unknown): boolean | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n throw new errors.ValidationError(\n \"Invalid value for 'hasPublishedVersion'. Expected boolean or 'true'/'false' string.\"\n );\n};\n\n/**\n * Synchronous helper that returns the \"has published version\" condition for a given model.\n * Returns the documentId subquery condition, or null if the model doesn't use draft & publish.\n *\n * This is used by the filters function in transform/query.ts so that the condition\n * is applied to both root and nested (populate) queries.\n */\nconst getHasPublishedVersionCondition = (\n uid: UID.Schema,\n hasPublishedVersion: boolean\n): Record<string, any> | null => {\n const model = strapi.getModel(uid);\n\n // Ignore if target model has disabled DP or doesn't exist (e.g., components)\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n // Get table and column names from metadata\n const meta = strapi.db.metadata.get(uid);\n const tableName = meta.tableName;\n const documentIdAttr = meta.attributes.documentId;\n const publishedAtAttr = meta.attributes.publishedAt;\n const documentIdColumn =\n ('columnName' in documentIdAttr && documentIdAttr.columnName) || 'document_id';\n const publishedAtColumn =\n ('columnName' in publishedAtAttr && publishedAtAttr.columnName) || 'published_at';\n\n // Create a Knex subquery that selects document IDs with published entries\n const knex = strapi.db.connection;\n const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);\n\n if (hasPublishedVersion) {\n return { documentId: { $in: subquery } };\n }\n\n return { documentId: { $notIn: subquery } };\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n parseHasPublishedVersion,\n getHasPublishedVersionCondition,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","parseHasPublishedVersion","value","undefined","errors","ValidationError","getHasPublishedVersionCondition","uid","hasPublishedVersion","model","strapi","getModel","meta","db","metadata","get","tableName","documentIdAttr","attributes","documentId","publishedAtAttr","documentIdColumn","columnName","publishedAtColumn","knex","connection","subquery","distinct","whereNotNull","$in","$notIn","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
@@ -14,13 +14,13 @@ import type { UID, Modules } from '@strapi/types';
|
|
|
14
14
|
/**
|
|
15
15
|
* Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.
|
|
16
16
|
*/
|
|
17
|
-
export declare const ALLOWED_DOCUMENT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "hasPublishedVersion", "withCount"];
|
|
17
|
+
export declare const ALLOWED_DOCUMENT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "publicationFilter", "hasPublishedVersion", "withCount"];
|
|
18
18
|
/**
|
|
19
19
|
* Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:
|
|
20
20
|
* - data: create/update payload (never part of query params)
|
|
21
21
|
* - pagination, count, ordering: REST-style keys core-api may pass; accepted then stripped (query builder uses flat page/pageSize/start/limit and does not use count/ordering at root)
|
|
22
22
|
*/
|
|
23
|
-
export declare const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "hasPublishedVersion", "withCount", "data", "pagination", "count", "ordering"];
|
|
23
|
+
export declare const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "publicationFilter", "hasPublishedVersion", "withCount", "data", "pagination", "count", "ordering"];
|
|
24
24
|
/** Restrict to allowed query keys so only these reach the query-params transformer (security). */
|
|
25
25
|
export declare const pickAllowedQueryParams: (params: Record<string, unknown>) => Record<(typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number], unknown>;
|
|
26
26
|
declare const pickSelectionParams: <TUID extends UID.ContentType>(data: unknown) => Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,6KAAqD,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,wNAMnC,CAAC;AAEX,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,WACzB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAI5D,CAAC;AAEJ,QAAA,MAAM,mBAAmB,uCACjB,OAAO,KACZ,QAAQ,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAEtE,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UID } from '@strapi/types';
|
|
2
|
+
import { parsePublicationFilter, type PublicationFilterMode } from '@strapi/utils';
|
|
3
|
+
export { parsePublicationFilter };
|
|
4
|
+
export type { PublicationFilterMode };
|
|
5
|
+
export declare const getPublicationFilterCondition: (uid: UID.Schema, mode: PublicationFilterMode, status: 'draft' | 'published') => Record<string, unknown> | null;
|
|
6
|
+
//# sourceMappingURL=publication-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/publication-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAGL,sBAAsB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,6BAA6B,QACnC,IAAI,MAAM,QACT,qBAAqB,UACnB,OAAO,GAAG,WAAW,KAC5B,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAW5B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
6
|
+
const model = strapi.getModel(uid);
|
|
7
|
+
if (!model || !strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const knex = strapi.db.connection;
|
|
11
|
+
const meta = strapi.db.metadata.get(uid);
|
|
12
|
+
return strapiUtils.buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Object.defineProperty(exports, "parsePublicationFilter", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return strapiUtils.parsePublicationFilter; }
|
|
18
|
+
});
|
|
19
|
+
exports.getPublicationFilterCondition = getPublicationFilterCondition;
|
|
20
|
+
//# sourceMappingURL=publication-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.js","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,wBAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,uCAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { contentTypes, buildPublicationFilterWhere } from '@strapi/utils';
|
|
2
|
+
export { parsePublicationFilter } from '@strapi/utils';
|
|
3
|
+
|
|
4
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
5
|
+
const model = strapi.getModel(uid);
|
|
6
|
+
if (!model || !contentTypes.hasDraftAndPublish(model)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const knex = strapi.db.connection;
|
|
10
|
+
const meta = strapi.db.metadata.get(uid);
|
|
11
|
+
return buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { getPublicationFilterCondition };
|
|
15
|
+
//# sourceMappingURL=publication-filter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.mjs","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,YAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,2BAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
2
|
import type { UID } from '@strapi/types';
|
|
3
|
-
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, any
|
|
3
|
+
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, Partial<any>>;
|
|
4
4
|
export { transformParamsToQuery };
|
|
5
5
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAazC,QAAA,MAAM,sBAAsB,kEAmE1B,CAAC;AAEH,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -1,21 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
|
-
var
|
|
4
|
+
var strapiUtils = require('@strapi/utils');
|
|
5
|
+
var publicationFilter = require('../publication-filter.js');
|
|
5
6
|
var params = require('../params.js');
|
|
6
7
|
|
|
7
8
|
const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
8
|
-
const
|
|
9
|
+
const rawParams = params$1 ?? {};
|
|
10
|
+
const allowlisted = params.pickAllowedQueryParams(rawParams);
|
|
9
11
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const explicitPublicationFilter = strapiUtils.parsePublicationFilter(allowlisted.publicationFilter);
|
|
13
|
+
const legacyHasPublishedVersion = strapiUtils.parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
14
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
15
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
16
|
+
effectivePublicationFilter = strapiUtils.hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
17
|
+
}
|
|
18
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
19
|
+
const baseWhere = {
|
|
20
|
+
...params$1?.lookup,
|
|
21
|
+
...query.where
|
|
22
|
+
};
|
|
23
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
24
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
25
|
+
const stripPublicationParamsFromQuery = fp.omit([
|
|
26
|
+
'publicationFilter',
|
|
27
|
+
'hasPublishedVersion'
|
|
28
|
+
]);
|
|
29
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
30
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
31
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
32
|
+
if (effectivePublicationFilter !== undefined) {
|
|
16
33
|
const existingFilters = query.filters;
|
|
17
|
-
|
|
18
|
-
// Get the existing filters result (from status param)
|
|
34
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
19
35
|
let existingResult = {};
|
|
20
36
|
if (typeof existingFilters === 'function') {
|
|
21
37
|
existingResult = existingFilters({
|
|
@@ -25,13 +41,11 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
25
41
|
} else if (existingFilters) {
|
|
26
42
|
existingResult = existingFilters;
|
|
27
43
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// Merge both conditions
|
|
31
|
-
if (hasPublishedCondition) {
|
|
44
|
+
const publicationCondition = publicationFilter.getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
45
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
32
46
|
const conditions = [
|
|
33
47
|
existingResult,
|
|
34
|
-
|
|
48
|
+
publicationCondition
|
|
35
49
|
].filter((c)=>Object.keys(c).length);
|
|
36
50
|
return {
|
|
37
51
|
$and: conditions
|
|
@@ -39,11 +53,10 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
39
53
|
}
|
|
40
54
|
return existingResult;
|
|
41
55
|
};
|
|
56
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
57
|
+
return fp.assoc('where', baseWhere, fp.assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
42
58
|
}
|
|
43
|
-
return fp.assoc('where',
|
|
44
|
-
...params$1?.lookup,
|
|
45
|
-
...query.where
|
|
46
|
-
}, query);
|
|
59
|
+
return fp.assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
47
60
|
});
|
|
48
61
|
|
|
49
62
|
exports.transformParamsToQuery = transformParamsToQuery;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;;;AAaA,MAAMA,sBAAAA,GAAyBC,QAAAA,CAAM,CAACC,GAAAA,EAAiBC,QAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,YAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,6BAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,kCAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,8CAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,6DAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,UAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,OAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,+CAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,QAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,QAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,QAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -1,19 +1,35 @@
|
|
|
1
|
-
import { curry, assoc } from 'lodash/fp';
|
|
2
|
-
import {
|
|
1
|
+
import { curry, omit, assoc } from 'lodash/fp';
|
|
2
|
+
import { parsePublicationFilter, parseHasPublishedVersionQueryParam, hasPublishedVersionBooleanToPublicationFilterMode } from '@strapi/utils';
|
|
3
|
+
import { getPublicationFilterCondition } from '../publication-filter.mjs';
|
|
3
4
|
import { pickAllowedQueryParams } from '../params.mjs';
|
|
4
5
|
|
|
5
6
|
const transformParamsToQuery = curry((uid, params)=>{
|
|
6
|
-
const
|
|
7
|
+
const rawParams = params ?? {};
|
|
8
|
+
const allowlisted = pickAllowedQueryParams(rawParams);
|
|
7
9
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);
|
|
11
|
+
const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
12
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
13
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
14
|
+
effectivePublicationFilter = hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
15
|
+
}
|
|
16
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
17
|
+
const baseWhere = {
|
|
18
|
+
...params?.lookup,
|
|
19
|
+
...query.where
|
|
20
|
+
};
|
|
21
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
22
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
23
|
+
const stripPublicationParamsFromQuery = omit([
|
|
24
|
+
'publicationFilter',
|
|
25
|
+
'hasPublishedVersion'
|
|
26
|
+
]);
|
|
27
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
28
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
29
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
30
|
+
if (effectivePublicationFilter !== undefined) {
|
|
14
31
|
const existingFilters = query.filters;
|
|
15
|
-
|
|
16
|
-
// Get the existing filters result (from status param)
|
|
32
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
17
33
|
let existingResult = {};
|
|
18
34
|
if (typeof existingFilters === 'function') {
|
|
19
35
|
existingResult = existingFilters({
|
|
@@ -23,13 +39,11 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
23
39
|
} else if (existingFilters) {
|
|
24
40
|
existingResult = existingFilters;
|
|
25
41
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Merge both conditions
|
|
29
|
-
if (hasPublishedCondition) {
|
|
42
|
+
const publicationCondition = getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
43
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
30
44
|
const conditions = [
|
|
31
45
|
existingResult,
|
|
32
|
-
|
|
46
|
+
publicationCondition
|
|
33
47
|
].filter((c)=>Object.keys(c).length);
|
|
34
48
|
return {
|
|
35
49
|
$and: conditions
|
|
@@ -37,11 +51,10 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
37
51
|
}
|
|
38
52
|
return existingResult;
|
|
39
53
|
};
|
|
54
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
55
|
+
return assoc('where', baseWhere, assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
40
56
|
}
|
|
41
|
-
return assoc('where',
|
|
42
|
-
...params?.lookup,
|
|
43
|
-
...query.where
|
|
44
|
-
}, query);
|
|
57
|
+
return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
45
58
|
});
|
|
46
59
|
|
|
47
60
|
export { transformParamsToQuery };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;AAaA,MAAMA,sBAAAA,GAAyBC,KAAAA,CAAM,CAACC,GAAAA,EAAiBC,MAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,UAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,sBAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,sBAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,kCAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,iDAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,QAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,IAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,6BAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,KAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,KAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,KAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -74,7 +74,7 @@ const codeBlockValidator = strapiUtils.yup.object().shape({
|
|
|
74
74
|
type: strapiUtils.yup.string().equals([
|
|
75
75
|
'code'
|
|
76
76
|
]).required(),
|
|
77
|
-
|
|
77
|
+
language: strapiUtils.yup.string().nullable(),
|
|
78
78
|
children: strapiUtils.yup.array().of(textNodeValidator).min(1, 'Quote node children must have at least one Text or Link node').required()
|
|
79
79
|
});
|
|
80
80
|
const listItemNode = strapiUtils.yup.object().shape({
|