@strapi/core 5.36.0 → 5.37.0
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/core-api/controller/index.d.ts.map +1 -1
- package/dist/core-api/controller/index.js +17 -16
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs +17 -16
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/routes/index.js +15 -2
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +15 -2
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +5 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +10 -0
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +10 -0
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +21 -7
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +1936 -59
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +1937 -60
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +19 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +19 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/services/content-api/index.d.ts +6 -3
- package/dist/services/content-api/index.d.ts.map +1 -1
- package/dist/services/content-api/index.js +165 -3
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs +147 -4
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/cron.d.ts.map +1 -1
- package/dist/services/cron.js +3 -0
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +3 -0
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +16 -2
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +53 -0
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +53 -2
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +24 -0
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/params.js +33 -0
- package/dist/services/document-service/params.js.map +1 -1
- package/dist/services/document-service/params.mjs +31 -1
- package/dist/services/document-service/params.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +165 -4
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +167 -6
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +39 -3
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +37 -1
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/validators.d.ts.map +1 -1
- package/dist/services/entity-validator/validators.js +22 -5
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs +22 -5
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/dist/services/server/register-routes.js +3 -0
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/register-routes.mjs +3 -0
- package/dist/services/server/register-routes.mjs.map +1 -1
- package/dist/services/webhook-runner.js +2 -2
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/webhook-runner.mjs +2 -2
- package/dist/services/webhook-runner.mjs.map +1 -1
- package/dist/services/worker-queue.js +2 -2
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/services/worker-queue.mjs +2 -2
- package/dist/services/worker-queue.mjs.map +1 -1
- package/package.json +19 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":["createCronService","jobsSpecs","running","add","tasks","taskExpression","Object","keys","taskValue","fn","options","taskName","isFunction","bind","task","Error","fnWithStrapi","args","strapi","job","Job","push","name","schedule","remove","matchingJobsSpecs","filter","jobSpecName","index","splice","forEach","cancel","start","stop","destroy","jobs"],"mappings":";;;AAuBA,MAAMA,iBAAoB,GAAA,IAAA;AACxB,IAAA,IAAIC,YAAuB,EAAE;AAC7B,IAAA,IAAIC,OAAU,GAAA,KAAA;IAEd,OAAO;QACLC,GAAIC,CAAAA,CAAAA,KAAAA,GAAe,EAAE,EAAA;AACnB,YAAA,KAAK,MAAMC,cAAAA,IAAkBC,MAAOC,CAAAA,IAAI,CAACH,KAAQ,CAAA,CAAA;gBAC/C,MAAMI,SAAAA,GAAYJ,KAAK,CAACC,cAAe,CAAA;gBAEvC,IAAII,EAAAA;gBACJ,IAAIC,OAAAA;gBACJ,IAAIC,QAAAA;AACJ,gBAAA,IAAIC,WAAWJ,SAAY,CAAA,EAAA;;oBAEzBG,QAAW,GAAA,IAAA;oBACXF,EAAKD,GAAAA,SAAAA,CAAUK,IAAI,CAACT,KAAAA,CAAAA;oBACpBM,OAAUL,GAAAA,cAAAA;AACZ,iBAAA,MAAO,IAAIO,UAAAA,CAAWJ,SAAUM,CAAAA,IAAI,CAAG,EAAA;;oBAErCH,QAAWN,GAAAA,cAAAA;AACXI,oBAAAA,EAAAA,GAAKD,SAAUM,CAAAA,IAAI,CAACD,IAAI,CAACL,SAAAA,CAAAA;AACzBE,oBAAAA,OAAAA,GAAUF,UAAUE,OAAO;iBACtB,MAAA;AACL,oBAAA,MAAM,IAAIK,KACR,CAAA,CAAC,mCAAmC,EAAEV,cAAAA,CAAe,qBAAqB,CAAC,CAAA;AAE/E;AAEA,gBAAA,MAAMW,YAAe,GAAA,CAAC,GAAGC,IAAAA,GAAoBR,EAAG,CAAA;AAAES,wBAAAA;qBAAaD,EAAAA,GAAAA,IAAAA,CAAAA;;gBAG/D,MAAME,GAAAA,GAAM,IAAIC,GAAIJ,CAAAA,YAAAA,CAAAA;
|
|
1
|
+
{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n job.on('error', (error) => {\n strapi.log.error(`Cron job \"${taskName ?? taskExpression}\" failed`, error);\n });\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":["createCronService","jobsSpecs","running","add","tasks","taskExpression","Object","keys","taskValue","fn","options","taskName","isFunction","bind","task","Error","fnWithStrapi","args","strapi","job","Job","on","error","log","push","name","schedule","remove","matchingJobsSpecs","filter","jobSpecName","index","splice","forEach","cancel","start","stop","destroy","jobs"],"mappings":"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"}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
|
-
import type { Modules, Struct } from '@strapi/types';
|
|
2
|
+
import type { Modules, Struct, UID } from '@strapi/types';
|
|
3
|
+
/**
|
|
4
|
+
* Parses and sanitizes the hasPublishedVersion parameter.
|
|
5
|
+
* Returns normalized boolean value or undefined if not provided.
|
|
6
|
+
* Throws ValidationError for invalid input (400 response).
|
|
7
|
+
*/
|
|
8
|
+
declare const parseHasPublishedVersion: (value: unknown) => boolean | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Synchronous helper that returns the "has published version" condition for a given model.
|
|
11
|
+
* Returns the documentId subquery condition, or null if the model doesn't use draft & publish.
|
|
12
|
+
*
|
|
13
|
+
* This is used by the filters function in transform/query.ts so that the condition
|
|
14
|
+
* is applied to both root and nested (populate) queries.
|
|
15
|
+
*/
|
|
16
|
+
declare const getHasPublishedVersionCondition: (uid: UID.Schema, hasPublishedVersion: boolean) => Record<string, any> | null;
|
|
3
17
|
declare const setStatusToDraftCurry: import("lodash").CurriedFunction2<Struct.SingleTypeSchema | Struct.CollectionTypeSchema, Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
4
18
|
declare const defaultToDraftCurry: import("lodash").CurriedFunction1<Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
5
19
|
declare const defaultStatusCurry: import("lodash").CurriedFunction2<Struct.SingleTypeSchema | Struct.CollectionTypeSchema, Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
6
20
|
declare const filterDataPublishedAtCurry: import("lodash").CurriedFunction1<Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
7
21
|
declare const statusToLookupCurry: import("lodash").CurriedFunction2<Struct.SingleTypeSchema | Struct.CollectionTypeSchema, Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
8
22
|
declare const statusToDataCurry: import("lodash").CurriedFunction2<Struct.SingleTypeSchema | Struct.CollectionTypeSchema, Modules.Documents.Params.All, Modules.Documents.Params.All>;
|
|
9
|
-
export { setStatusToDraftCurry as setStatusToDraft, defaultToDraftCurry as defaultToDraft, defaultStatusCurry as defaultStatus, filterDataPublishedAtCurry as filterDataPublishedAt, statusToLookupCurry as statusToLookup, statusToDataCurry as statusToData, };
|
|
23
|
+
export { setStatusToDraftCurry as setStatusToDraft, defaultToDraftCurry as defaultToDraft, defaultStatusCurry as defaultStatus, filterDataPublishedAtCurry as filterDataPublishedAt, statusToLookupCurry as statusToLookup, statusToDataCurry as statusToData, parseHasPublishedVersion, getHasPublishedVersionCondition, };
|
|
10
24
|
//# sourceMappingURL=draft-and-publish.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-and-publish.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/draft-and-publish.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"draft-and-publish.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/draft-and-publish.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAwG1D;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,UAAW,OAAO,KAAG,OAAO,GAAG,SAgB5D,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,+BAA+B,QAC9B,IAAI,MAAM,uBACM,OAAO,KAC3B,OAAO,MAAM,EAAE,GAAG,CAAC,GAAG,IA2BxB,CAAC;AAEF,QAAA,MAAM,qBAAqB,sJAA0B,CAAC;AACtD,QAAA,MAAM,mBAAmB,+FAAwB,CAAC;AAClD,QAAA,MAAM,kBAAkB,sJAAuB,CAAC;AAChD,QAAA,MAAM,0BAA0B,+FAA+B,CAAC;AAChE,QAAA,MAAM,mBAAmB,sJAAwB,CAAC;AAClD,QAAA,MAAM,iBAAiB,sJAAsB,CAAC;AAE9C,OAAO,EACL,qBAAqB,IAAI,gBAAgB,EACzC,mBAAmB,IAAI,cAAc,EACrC,kBAAkB,IAAI,aAAa,EACnC,0BAA0B,IAAI,qBAAqB,EACnD,mBAAmB,IAAI,cAAc,EACrC,iBAAiB,IAAI,YAAY,EACjC,wBAAwB,EACxB,+BAA+B,GAChC,CAAC"}
|
|
@@ -93,6 +93,57 @@ 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
|
+
};
|
|
96
147
|
const setStatusToDraftCurry = fp.curry(setStatusToDraft);
|
|
97
148
|
const defaultToDraftCurry = fp.curry(defaultToDraft);
|
|
98
149
|
const defaultStatusCurry = fp.curry(defaultStatus);
|
|
@@ -103,6 +154,8 @@ const statusToDataCurry = fp.curry(statusToData);
|
|
|
103
154
|
exports.defaultStatus = defaultStatusCurry;
|
|
104
155
|
exports.defaultToDraft = defaultToDraftCurry;
|
|
105
156
|
exports.filterDataPublishedAt = filterDataPublishedAtCurry;
|
|
157
|
+
exports.getHasPublishedVersionCondition = getHasPublishedVersionCondition;
|
|
158
|
+
exports.parseHasPublishedVersion = parseHasPublishedVersion;
|
|
106
159
|
exports.setStatusToDraft = setStatusToDraftCurry;
|
|
107
160
|
exports.statusToData = statusToDataCurry;
|
|
108
161
|
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 } 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
|
+
{"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":";;;;;AAYA;;;IAIA,MAAMA,gBAA6C,GAAA,CAACC,WAAaC,EAAAA,MAAAA,GAAAA;AAC/D,IAAA,IAAI,CAACC,wBAAaC,CAAAA,kBAAkB,CAACH,WAAgBC,CAAAA,IAAAA,MAAAA,CAAOG,MAAM,EAAE;QAClE,OAAOH,MAAAA;AACT;IAEA,OAAOI,QAAAA,CAAM,UAAU,OAASJ,EAAAA,MAAAA,CAAAA;AAClC,CAAA;AAEA;;IAGA,MAAMK,iBAAkC,CAACL,MAAAA,GAAAA;;AAEvC,IAAA,IAAI,CAACA,MAAOG,CAAAA,MAAM,IAAIH,MAAOG,CAAAA,MAAM,KAAK,WAAa,EAAA;QACnD,OAAOC,QAAAA,CAAM,UAAU,OAASJ,EAAAA,MAAAA,CAAAA;AAClC;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;;IAIA,MAAMM,aAA0C,GAAA,CAACP,WAAaC,EAAAA,MAAAA,GAAAA;AAC5D,IAAA,IAAI,CAACC,wBAAAA,CAAaC,kBAAkB,CAACH,WAAc,CAAA,EAAA;QACjD,OAAOC,MAAAA;AACT;;AAGA,IAAA,IAAI,CAACA,MAAOG,CAAAA,MAAM,IAAIH,MAAOG,CAAAA,MAAM,KAAK,WAAa,EAAA;AACnD,QAAA,OAAOE,cAAeL,CAAAA,MAAAA,CAAAA;AACxB;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;IAGA,MAAMO,wBAAyC,CAACP,MAAAA,GAAAA;IAC9C,IAAIA,MAAAA,EAAQQ,MAAMC,WAAa,EAAA;AAC7B,QAAA,OAAOL,QAAM,CAAA;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAc,SAAA,EAAE,IAAMJ,EAAAA,MAAAA,CAAAA;AAC9C;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;IAGA,MAAMU,cAA2C,GAAA,CAACX,WAAaC,EAAAA,MAAAA,GAAAA;AAC7D,IAAA,IAAI,CAACC,wBAAAA,CAAaC,kBAAkB,CAACH,WAAc,CAAA,EAAA;QACjD,OAAOC,MAAAA;AACT;AAEA,IAAA,MAAMW,MAASX,GAAAA,MAAAA,CAAOW,MAAM,IAAI,EAAC;AAEjC,IAAA,OAAQX,MAAQG,EAAAA,MAAAA;QACd,KAAK,WAAA;AACH,YAAA,OAAOC,QAAM,CAAA;AAAC,gBAAA,QAAA;AAAU,gBAAA;aAAc,EAAE;gBAAEQ,QAAU,EAAA;aAAQZ,EAAAA,MAAAA,CAAAA;QAC9D,KAAK,OAAA;AACH,YAAA,OAAOI,QAAM,CAAA;AAAC,gBAAA,QAAA;AAAU,gBAAA;aAAc,EAAE;gBAAES,KAAO,EAAA;aAAQb,EAAAA,MAAAA,CAAAA;AAG7D;IAEA,OAAOI,QAAAA,CAAM,UAAUO,MAAQX,EAAAA,MAAAA,CAAAA;AACjC,CAAA;AAEA;;IAGA,MAAMc,YAAyC,GAAA,CAACf,WAAaC,EAAAA,MAAAA,GAAAA;AAC3D,IAAA,IAAI,CAACC,wBAAAA,CAAaC,kBAAkB,CAACH,WAAc,CAAA,EAAA;AACjD,QAAA,OAAOK,QAAM,CAAA;AAAC,YAAA,MAAA;AAAQ,YAAA;AAAc,SAAA,EAAE,IAAIW,IAAQf,EAAAA,EAAAA,MAAAA,CAAAA;AACpD;AAEA,IAAA,OAAQA,MAAQG,EAAAA,MAAAA;QACd,KAAK,WAAA;AACH,YAAA,OAAOC,QAAM,CAAA;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAE,IAAIW,IAAQf,EAAAA,EAAAA,MAAAA,CAAAA;QACpD,KAAK,OAAA;AACH,YAAA,OAAOI,QAAM,CAAA;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAE,IAAMJ,EAAAA,MAAAA,CAAAA;AAGhD;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;;;IAKA,MAAMgB,2BAA2B,CAACC,KAAAA,GAAAA;IAChC,IAAIA,KAAAA,KAAUC,SAAaD,IAAAA,KAAAA,KAAU,IAAM,EAAA;QACzC,OAAOC,SAAAA;AACT;IAEA,IAAID,KAAAA,KAAU,IAAQA,IAAAA,KAAAA,KAAU,MAAQ,EAAA;QACtC,OAAO,IAAA;AACT;IAEA,IAAIA,KAAAA,KAAU,KAASA,IAAAA,KAAAA,KAAU,OAAS,EAAA;QACxC,OAAO,KAAA;AACT;IAEA,MAAM,IAAIE,kBAAOC,CAAAA,eAAe,CAC9B,qFAAA,CAAA;AAEJ;AAEA;;;;;;IAOA,MAAMC,+BAAkC,GAAA,CACtCC,GACAC,EAAAA,mBAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAOC,CAAAA,QAAQ,CAACJ,GAAAA,CAAAA;;AAG9B,IAAA,IAAI,CAACE,KAAS,IAAA,CAACvB,wBAAaC,CAAAA,kBAAkB,CAACsB,KAAQ,CAAA,EAAA;QACrD,OAAO,IAAA;AACT;;AAGA,IAAA,MAAMG,OAAOF,MAAOG,CAAAA,EAAE,CAACC,QAAQ,CAACC,GAAG,CAACR,GAAAA,CAAAA;IACpC,MAAMS,SAAAA,GAAYJ,KAAKI,SAAS;AAChC,IAAA,MAAMC,cAAiBL,GAAAA,IAAAA,CAAKM,UAAU,CAACC,UAAU;AACjD,IAAA,MAAMC,eAAkBR,GAAAA,IAAAA,CAAKM,UAAU,CAACxB,WAAW;AACnD,IAAA,MAAM2B,mBACJ,YAAC,IAAgBJ,cAAkBA,IAAAA,cAAAA,CAAeK,UAAU,IAAK,aAAA;AACnE,IAAA,MAAMC,oBACJ,YAAC,IAAgBH,eAAmBA,IAAAA,eAAAA,CAAgBE,UAAU,IAAK,cAAA;;AAGrE,IAAA,MAAME,IAAOd,GAAAA,MAAAA,CAAOG,EAAE,CAACY,UAAU;AACjC,IAAA,MAAMC,WAAWF,IAAKR,CAAAA,SAAAA,CAAAA,CAAWW,QAAQ,CAACN,gBAAAA,CAAAA,CAAkBO,YAAY,CAACL,iBAAAA,CAAAA;AAEzE,IAAA,IAAIf,mBAAqB,EAAA;QACvB,OAAO;YAAEW,UAAY,EAAA;gBAAEU,GAAKH,EAAAA;AAAS;AAAE,SAAA;AACzC;IAEA,OAAO;QAAEP,UAAY,EAAA;YAAEW,MAAQJ,EAAAA;AAAS;AAAE,KAAA;AAC5C;AAEA,MAAMK,wBAAwBC,QAAMjD,CAAAA,gBAAAA;AACpC,MAAMkD,sBAAsBD,QAAM1C,CAAAA,cAAAA;AAClC,MAAM4C,qBAAqBF,QAAMzC,CAAAA,aAAAA;AACjC,MAAM4C,6BAA6BH,QAAMxC,CAAAA,qBAAAA;AACzC,MAAM4C,sBAAsBJ,QAAMrC,CAAAA,cAAAA;AAClC,MAAM0C,oBAAoBL,QAAMjC,CAAAA,YAAAA;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { curry, assoc } from 'lodash/fp';
|
|
2
|
-
import { contentTypes } from '@strapi/utils';
|
|
2
|
+
import { contentTypes, errors } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* DP enabled -> set status to draft
|
|
@@ -91,6 +91,57 @@ import { contentTypes } 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
|
+
};
|
|
94
145
|
const setStatusToDraftCurry = curry(setStatusToDraft);
|
|
95
146
|
const defaultToDraftCurry = curry(defaultToDraft);
|
|
96
147
|
const defaultStatusCurry = curry(defaultStatus);
|
|
@@ -98,5 +149,5 @@ const filterDataPublishedAtCurry = curry(filterDataPublishedAt);
|
|
|
98
149
|
const statusToLookupCurry = curry(statusToLookup);
|
|
99
150
|
const statusToDataCurry = curry(statusToData);
|
|
100
151
|
|
|
101
|
-
export { defaultStatusCurry as defaultStatus, defaultToDraftCurry as defaultToDraft, filterDataPublishedAtCurry as filterDataPublishedAt, setStatusToDraftCurry as setStatusToDraft, statusToDataCurry as statusToData, statusToLookupCurry as statusToLookup };
|
|
152
|
+
export { defaultStatusCurry as defaultStatus, defaultToDraftCurry as defaultToDraft, filterDataPublishedAtCurry as filterDataPublishedAt, getHasPublishedVersionCondition, parseHasPublishedVersion, setStatusToDraftCurry as setStatusToDraft, statusToDataCurry as statusToData, statusToLookupCurry as statusToLookup };
|
|
102
153
|
//# 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 } 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
|
+
{"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,4 +1,28 @@
|
|
|
1
1
|
import type { UID, Modules } from '@strapi/types';
|
|
2
|
+
/**
|
|
3
|
+
* Division of allowlists:
|
|
4
|
+
*
|
|
5
|
+
* - ALLOWED_DOCUMENT_PARAM_KEYS: keys that are passed through to the query builder
|
|
6
|
+
* (transformParamsToQuery → convert-query-params). Only these affect the actual query.
|
|
7
|
+
* Used by pickAllowedQueryParams() so unknown keys are stripped before the transformer.
|
|
8
|
+
*
|
|
9
|
+
* - ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: keys we accept at the document service entry when
|
|
10
|
+
* api.documents.strictParams is true (checkUnrecognizedRootParams). Must be a superset
|
|
11
|
+
* of ALLOWED_DOCUMENT_PARAM_KEYS. Can include keys we accept but do not pass to the
|
|
12
|
+
* query builder (e.g. REST-shaped keys that callers send; we allow them then strip).
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ALLOWED_DOCUMENT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "hasPublishedVersion", "withCount"];
|
|
18
|
+
/**
|
|
19
|
+
* Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:
|
|
20
|
+
* - data: create/update payload (never part of query params)
|
|
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
|
+
*/
|
|
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"];
|
|
24
|
+
/** Restrict to allowed query keys so only these reach the query-params transformer (security). */
|
|
25
|
+
export declare const pickAllowedQueryParams: (params: Record<string, unknown>) => Record<(typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number], unknown>;
|
|
2
26
|
declare const pickSelectionParams: <TUID extends UID.ContentType>(data: unknown) => Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'>;
|
|
3
27
|
export { pickSelectionParams };
|
|
4
28
|
//# sourceMappingURL=params.d.ts.map
|
|
@@ -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;
|
|
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,wJAAqD,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,mMAMnC,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"}
|
|
@@ -1,7 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Division of allowlists:
|
|
8
|
+
*
|
|
9
|
+
* - ALLOWED_DOCUMENT_PARAM_KEYS: keys that are passed through to the query builder
|
|
10
|
+
* (transformParamsToQuery → convert-query-params). Only these affect the actual query.
|
|
11
|
+
* Used by pickAllowedQueryParams() so unknown keys are stripped before the transformer.
|
|
12
|
+
*
|
|
13
|
+
* - ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: keys we accept at the document service entry when
|
|
14
|
+
* api.documents.strictParams is true (checkUnrecognizedRootParams). Must be a superset
|
|
15
|
+
* of ALLOWED_DOCUMENT_PARAM_KEYS. Can include keys we accept but do not pass to the
|
|
16
|
+
* query builder (e.g. REST-shaped keys that callers send; we allow them then strip).
|
|
17
|
+
*/ /**
|
|
18
|
+
* Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.
|
|
19
|
+
*/ const ALLOWED_DOCUMENT_PARAM_KEYS = [
|
|
20
|
+
...strapiUtils.SHARED_QUERY_PARAM_KEYS,
|
|
21
|
+
'withCount'
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:
|
|
25
|
+
* - data: create/update payload (never part of query params)
|
|
26
|
+
* - 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)
|
|
27
|
+
*/ const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS = [
|
|
28
|
+
...ALLOWED_DOCUMENT_PARAM_KEYS,
|
|
29
|
+
'data',
|
|
30
|
+
'pagination',
|
|
31
|
+
'count',
|
|
32
|
+
'ordering'
|
|
33
|
+
];
|
|
34
|
+
/** Restrict to allowed query keys so only these reach the query-params transformer (security). */ const pickAllowedQueryParams = (params)=>fp.pick(ALLOWED_DOCUMENT_PARAM_KEYS, params);
|
|
5
35
|
const pickSelectionParams = (data)=>{
|
|
6
36
|
return fp.pick([
|
|
7
37
|
'fields',
|
|
@@ -10,5 +40,8 @@ const pickSelectionParams = (data)=>{
|
|
|
10
40
|
], data);
|
|
11
41
|
};
|
|
12
42
|
|
|
43
|
+
exports.ALLOWED_DOCUMENT_PARAM_KEYS = ALLOWED_DOCUMENT_PARAM_KEYS;
|
|
44
|
+
exports.ALLOWED_DOCUMENT_ROOT_PARAM_KEYS = ALLOWED_DOCUMENT_ROOT_PARAM_KEYS;
|
|
45
|
+
exports.pickAllowedQueryParams = pickAllowedQueryParams;
|
|
13
46
|
exports.pickSelectionParams = pickSelectionParams;
|
|
14
47
|
//# sourceMappingURL=params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","sources":["../../../src/services/document-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["
|
|
1
|
+
{"version":3,"file":"params.js","sources":["../../../src/services/document-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\nimport { SHARED_QUERY_PARAM_KEYS } from '@strapi/utils';\n\n/**\n * Division of allowlists:\n *\n * - ALLOWED_DOCUMENT_PARAM_KEYS: keys that are passed through to the query builder\n * (transformParamsToQuery → convert-query-params). Only these affect the actual query.\n * Used by pickAllowedQueryParams() so unknown keys are stripped before the transformer.\n *\n * - ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: keys we accept at the document service entry when\n * api.documents.strictParams is true (checkUnrecognizedRootParams). Must be a superset\n * of ALLOWED_DOCUMENT_PARAM_KEYS. Can include keys we accept but do not pass to the\n * query builder (e.g. REST-shaped keys that callers send; we allow them then strip).\n */\n\n/**\n * Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.\n */\nexport const ALLOWED_DOCUMENT_PARAM_KEYS = [...SHARED_QUERY_PARAM_KEYS, 'withCount'] as const;\n\n/**\n * Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:\n * - data: create/update payload (never part of query params)\n * - 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)\n */\nexport const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS = [\n ...ALLOWED_DOCUMENT_PARAM_KEYS,\n 'data',\n 'pagination',\n 'count',\n 'ordering',\n] as const;\n\n/** Restrict to allowed query keys so only these reach the query-params transformer (security). */\nexport const pickAllowedQueryParams = (\n params: Record<string, unknown>\n): Record<(typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number], unknown> =>\n pick(ALLOWED_DOCUMENT_PARAM_KEYS as unknown as string[], params) as Record<\n (typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number],\n unknown\n >;\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["ALLOWED_DOCUMENT_PARAM_KEYS","SHARED_QUERY_PARAM_KEYS","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","pickAllowedQueryParams","params","pick","pickSelectionParams","data"],"mappings":";;;;;AAIA;;;;;;;;;;;;;UAgBaA,2BAA8B,GAAA;AAAIC,IAAAA,GAAAA,mCAAAA;AAAyB,IAAA;;AAExE;;;;UAKaC,gCAAmC,GAAA;AAC3CF,IAAAA,GAAAA,2BAAAA;AACH,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA;;AAGF,mGACaG,MAAAA,sBAAAA,GAAyB,CACpCC,MAEAC,GAAAA,OAAAA,CAAKL,6BAAoDI,MAGvD;AAEJ,MAAME,sBAAsB,CAC1BC,IAAAA,GAAAA;AAEA,IAAA,OAAOF,OAAK,CAAA;AAAC,QAAA,QAAA;AAAU,QAAA,UAAA;AAAY,QAAA;KAAS,EAAEE,IAAAA,CAAAA;AAChD;;;;;;;"}
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
import { pick } from 'lodash/fp';
|
|
2
|
+
import { SHARED_QUERY_PARAM_KEYS } from '@strapi/utils';
|
|
2
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Division of allowlists:
|
|
6
|
+
*
|
|
7
|
+
* - ALLOWED_DOCUMENT_PARAM_KEYS: keys that are passed through to the query builder
|
|
8
|
+
* (transformParamsToQuery → convert-query-params). Only these affect the actual query.
|
|
9
|
+
* Used by pickAllowedQueryParams() so unknown keys are stripped before the transformer.
|
|
10
|
+
*
|
|
11
|
+
* - ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: keys we accept at the document service entry when
|
|
12
|
+
* api.documents.strictParams is true (checkUnrecognizedRootParams). Must be a superset
|
|
13
|
+
* of ALLOWED_DOCUMENT_PARAM_KEYS. Can include keys we accept but do not pass to the
|
|
14
|
+
* query builder (e.g. REST-shaped keys that callers send; we allow them then strip).
|
|
15
|
+
*/ /**
|
|
16
|
+
* Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.
|
|
17
|
+
*/ const ALLOWED_DOCUMENT_PARAM_KEYS = [
|
|
18
|
+
...SHARED_QUERY_PARAM_KEYS,
|
|
19
|
+
'withCount'
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:
|
|
23
|
+
* - data: create/update payload (never part of query params)
|
|
24
|
+
* - 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)
|
|
25
|
+
*/ const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS = [
|
|
26
|
+
...ALLOWED_DOCUMENT_PARAM_KEYS,
|
|
27
|
+
'data',
|
|
28
|
+
'pagination',
|
|
29
|
+
'count',
|
|
30
|
+
'ordering'
|
|
31
|
+
];
|
|
32
|
+
/** Restrict to allowed query keys so only these reach the query-params transformer (security). */ const pickAllowedQueryParams = (params)=>pick(ALLOWED_DOCUMENT_PARAM_KEYS, params);
|
|
3
33
|
const pickSelectionParams = (data)=>{
|
|
4
34
|
return pick([
|
|
5
35
|
'fields',
|
|
@@ -8,5 +38,5 @@ const pickSelectionParams = (data)=>{
|
|
|
8
38
|
], data);
|
|
9
39
|
};
|
|
10
40
|
|
|
11
|
-
export { pickSelectionParams };
|
|
41
|
+
export { ALLOWED_DOCUMENT_PARAM_KEYS, ALLOWED_DOCUMENT_ROOT_PARAM_KEYS, pickAllowedQueryParams, pickSelectionParams };
|
|
12
42
|
//# sourceMappingURL=params.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.mjs","sources":["../../../src/services/document-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["
|
|
1
|
+
{"version":3,"file":"params.mjs","sources":["../../../src/services/document-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\nimport { SHARED_QUERY_PARAM_KEYS } from '@strapi/utils';\n\n/**\n * Division of allowlists:\n *\n * - ALLOWED_DOCUMENT_PARAM_KEYS: keys that are passed through to the query builder\n * (transformParamsToQuery → convert-query-params). Only these affect the actual query.\n * Used by pickAllowedQueryParams() so unknown keys are stripped before the transformer.\n *\n * - ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: keys we accept at the document service entry when\n * api.documents.strictParams is true (checkUnrecognizedRootParams). Must be a superset\n * of ALLOWED_DOCUMENT_PARAM_KEYS. Can include keys we accept but do not pass to the\n * query builder (e.g. REST-shaped keys that callers send; we allow them then strip).\n */\n\n/**\n * Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.\n */\nexport const ALLOWED_DOCUMENT_PARAM_KEYS = [...SHARED_QUERY_PARAM_KEYS, 'withCount'] as const;\n\n/**\n * Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:\n * - data: create/update payload (never part of query params)\n * - 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)\n */\nexport const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS = [\n ...ALLOWED_DOCUMENT_PARAM_KEYS,\n 'data',\n 'pagination',\n 'count',\n 'ordering',\n] as const;\n\n/** Restrict to allowed query keys so only these reach the query-params transformer (security). */\nexport const pickAllowedQueryParams = (\n params: Record<string, unknown>\n): Record<(typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number], unknown> =>\n pick(ALLOWED_DOCUMENT_PARAM_KEYS as unknown as string[], params) as Record<\n (typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number],\n unknown\n >;\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["ALLOWED_DOCUMENT_PARAM_KEYS","SHARED_QUERY_PARAM_KEYS","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","pickAllowedQueryParams","params","pick","pickSelectionParams","data"],"mappings":";;;AAIA;;;;;;;;;;;;;UAgBaA,2BAA8B,GAAA;AAAIC,IAAAA,GAAAA,uBAAAA;AAAyB,IAAA;;AAExE;;;;UAKaC,gCAAmC,GAAA;AAC3CF,IAAAA,GAAAA,2BAAAA;AACH,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA;;AAGF,mGACaG,MAAAA,sBAAAA,GAAyB,CACpCC,MAEAC,GAAAA,IAAAA,CAAKL,6BAAoDI,MAGvD;AAEJ,MAAME,sBAAsB,CAC1BC,IAAAA,GAAAA;AAEA,IAAA,OAAOF,IAAK,CAAA;AAAC,QAAA,QAAA;AAAU,QAAA,UAAA;AAAY,QAAA;KAAS,EAAEE,IAAAA,CAAAA;AAChD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAiC3E,eAAO,MAAM,2BAA2B,EAAE,uBAwqBzC,CAAC"}
|