@strapi/core 0.0.0-experimental.e9122b401c96877b6707775c4f893660eab93ae3 → 0.0.0-experimental.f0d3b2d782e972f1dcb8acf0dce31d4090d1e420
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/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +6 -1
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +6 -1
- package/dist/ee/index.mjs.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js +6 -3
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.mjs +6 -3
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/loaders/plugins/index.d.ts.map +1 -1
- package/dist/loaders/plugins/index.js +28 -1
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs +9 -1
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +12 -9
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +66 -10
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +67 -11
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/migrations/draft-publish.d.ts +1 -1
- package/dist/migrations/draft-publish.d.ts.map +1 -1
- package/dist/migrations/draft-publish.js.map +1 -1
- package/dist/migrations/draft-publish.mjs.map +1 -1
- package/dist/migrations/i18n.d.ts +5 -0
- package/dist/migrations/i18n.d.ts.map +1 -0
- package/dist/migrations/i18n.js +54 -0
- package/dist/migrations/i18n.js.map +1 -0
- package/dist/migrations/i18n.mjs +54 -0
- package/dist/migrations/i18n.mjs.map +1 -0
- package/dist/migrations/index.d.ts +5 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +15 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +15 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/providers/admin.d.ts.map +1 -1
- package/dist/providers/admin.js.map +1 -1
- package/dist/providers/admin.mjs.map +1 -1
- package/dist/providers/registries.js +3 -3
- package/dist/providers/registries.js.map +1 -1
- package/dist/providers/registries.mjs +3 -3
- package/dist/providers/registries.mjs.map +1 -1
- package/dist/services/cron.js +9 -4
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +9 -4
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/common.d.ts +1 -1
- package/dist/services/document-service/common.d.ts.map +1 -1
- package/dist/services/document-service/common.js.map +1 -1
- package/dist/services/document-service/common.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts +2 -2
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +6 -7
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +1 -2
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/index.d.ts +2 -1
- package/dist/services/document-service/index.d.ts.map +1 -1
- package/dist/services/document-service/index.js +3 -2
- package/dist/services/document-service/index.js.map +1 -1
- package/dist/services/document-service/index.mjs +3 -2
- package/dist/services/document-service/index.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +28 -8
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +28 -8
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
- package/dist/services/document-service/transform/id-map.js +13 -4
- package/dist/services/document-service/transform/id-map.js.map +1 -1
- package/dist/services/document-service/transform/id-map.mjs +14 -5
- package/dist/services/document-service/transform/id-map.mjs.map +1 -1
- package/dist/services/document-service/utils/populate.d.ts.map +1 -1
- package/dist/services/document-service/utils/populate.js +3 -1
- package/dist/services/document-service/utils/populate.js.map +1 -1
- package/dist/services/document-service/utils/populate.mjs +3 -1
- package/dist/services/document-service/utils/populate.mjs.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.d.ts +36 -0
- package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.js +69 -0
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.mjs +69 -0
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -0
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +6 -2
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs +6 -2
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/utils/transform-content-types-to-models.d.ts +325 -21
- package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
- package/package.json +16 -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)
|
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":[],"mappings":";;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,CAAA;AAC3B,MAAI,UAAU;AAEP,SAAA;AAAA,IACL,IAAI,QAAe,IAAI;AACrB,iBAAW,kBAAkB,OAAO,KAAK,KAAK,GAAG;AACzC,cAAA,YAAY,MAAM,cAAc;AAElC,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA,WAAW,SAAS,GAAG;AAEd,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK;AACf,oBAAA;AAAA,QACD,WAAA,WAAW,UAAU,IAAI,GAAG;AAE1B,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK,SAAS;AAClC,oBAAU,UAAU;AAAA,QAAA,OACf;AACL,gBAAM,IAAI;AAAA,YACR,sCAAsC,cAAc;AAAA,UAAA;AAAA,QAExD;AAEM,cAAA,eAAe,IAAI,SAAoB,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI;AAG7D,cAAA,MAAM,IAAI,IAAI,YAAY;AAChC,kBAAU,KAAK,EAAE,KAAK,SAAS,MAAM,UAAU;AAE/C,YAAI,SAAS;AACX,cAAI,SAAS,OAAO;AAAA,QACtB;AAAA,MACF;AACO,aAAA;AAAA,IACT;AAAA,IAEA,OAAO,MAAc;AACnB,UAAI,CAAC;AAAY,cAAA,IAAI,MAAM,+CAA+C;AACpE,YAAA,oBAAoB,UAAU,OAAO,CAAC,EAAE,MAAM,eAAe,UAAU;AAC3E,YAAI,gBAAgB,MAAM;AACd,oBAAA,OAAO,OAAO,CAAC;AAClB,iBAAA;AAAA,QACT;AACO,eAAA;AAAA,MAAA,CACR;AACD,wBAAkB,QAAQ,CAAC,EAAE,IAAU,MAAA,IAAI,QAAQ;AAC5C,aAAA;AAAA,IACT;AAAA,IAEA,QAAQ;AACI,gBAAA,QAAQ,CAAC,EAAE,KAAK,QAAc,MAAA,IAAI,SAAS,OAAO,CAAC;AACnD,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,OAAO;AACL,gBAAU,QAAQ,CAAC,EAAE,IAAU,MAAA,IAAI,QAAQ;AACjC,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,UAAU;AACR,WAAK,KAAK;AACV,kBAAY,CAAA;AACL,aAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EAAA;AAEV;"}
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import type { UID, Modules } from '@strapi/types';
|
2
|
-
export type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(uid: TContentTypeUID) => Modules.Documents.ServiceInstance<TContentTypeUID>;
|
2
|
+
export type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(uid: TContentTypeUID, entityValidator: Modules.EntityValidator.EntityValidator) => Modules.Documents.ServiceInstance<TContentTypeUID>;
|
3
3
|
export declare const wrapInTransaction: (fn: (...args: any) => any) => (...args: any[]) => Promise<any>;
|
4
4
|
//# sourceMappingURL=common.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,MAAM,uBAAuB,GAAG,CAAC,eAAe,SAAS,GAAG,CAAC,WAAW,EAC5E,GAAG,EAAE,eAAe,
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,MAAM,uBAAuB,GAAG,CAAC,eAAe,SAAS,GAAG,CAAC,WAAW,EAC5E,GAAG,EAAE,eAAe,EACpB,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,eAAe,KACrD,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,iBAAiB,OAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,eACxC,GAAG,EAAE,iBACvB,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.js","sources":["../../../src/services/document-service/common.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\n\nexport type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(\n uid: TContentTypeUID\n) => Modules.Documents.ServiceInstance<TContentTypeUID>;\n\nexport const wrapInTransaction = (fn: (...args: any) => any) => {\n return (...args: any[]) => strapi.db.transaction?.(() => fn(...args));\n};\n"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"common.js","sources":["../../../src/services/document-service/common.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\n\nexport type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(\n uid: TContentTypeUID,\n entityValidator: Modules.EntityValidator.EntityValidator\n) => Modules.Documents.ServiceInstance<TContentTypeUID>;\n\nexport const wrapInTransaction = (fn: (...args: any) => any) => {\n return (...args: any[]) => strapi.db.transaction?.(() => fn(...args));\n};\n"],"names":[],"mappings":";;AAOa,MAAA,oBAAoB,CAAC,OAA8B;AACvD,SAAA,IAAI,SAAgB,OAAO,GAAG,cAAc,MAAM,GAAG,GAAG,IAAI,CAAC;AACtE;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.mjs","sources":["../../../src/services/document-service/common.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\n\nexport type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(\n uid: TContentTypeUID\n) => Modules.Documents.ServiceInstance<TContentTypeUID>;\n\nexport const wrapInTransaction = (fn: (...args: any) => any) => {\n return (...args: any[]) => strapi.db.transaction?.(() => fn(...args));\n};\n"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"common.mjs","sources":["../../../src/services/document-service/common.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\n\nexport type RepositoryFactoryMethod = <TContentTypeUID extends UID.ContentType>(\n uid: TContentTypeUID,\n entityValidator: Modules.EntityValidator.EntityValidator\n) => Modules.Documents.ServiceInstance<TContentTypeUID>;\n\nexport const wrapInTransaction = (fn: (...args: any) => any) => {\n return (...args: any[]) => strapi.db.transaction?.(() => fn(...args));\n};\n"],"names":[],"mappings":"AAOa,MAAA,oBAAoB,CAAC,OAA8B;AACvD,SAAA,IAAI,SAAgB,OAAO,GAAG,cAAc,MAAM,GAAG,GAAG,IAAI,CAAC;AACtE;"}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import type { UID } from '@strapi/types';
|
2
|
-
declare const createEntriesService: (uid: UID.ContentType) => {
|
1
|
+
import type { UID, Modules } from '@strapi/types';
|
2
|
+
declare const createEntriesService: (uid: UID.ContentType, entityValidator: Modules.EntityValidator.EntityValidator) => {
|
3
3
|
create: (params?: any) => Promise<any>;
|
4
4
|
delete: (id: number) => Promise<any>;
|
5
5
|
update: (entryToUpdate: any, params?: any) => Promise<any>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAYlD,QAAA,MAAM,oBAAoB,QACnB,IAAI,WAAW,mBACH,QAAQ,eAAe,CAAC,eAAe;;iBAmCzB,MAAM;4BAUK,GAAG;qBA4BV,GAAG;0BAaE,GAAG;CAoB5C,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
@@ -6,10 +6,9 @@ const components = require("./components.js");
|
|
6
6
|
const idTransform = require("./transform/id-transform.js");
|
7
7
|
const query = require("./transform/query.js");
|
8
8
|
const params = require("./params.js");
|
9
|
-
const index
|
9
|
+
const index = require("./attributes/index.js");
|
10
10
|
const data = require("./transform/data.js");
|
11
|
-
const
|
12
|
-
const createEntriesService = (uid) => {
|
11
|
+
const createEntriesService = (uid, entityValidator) => {
|
13
12
|
const contentType = strapi.contentType(uid);
|
14
13
|
async function createEntry(params$1 = {}) {
|
15
14
|
const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1);
|
@@ -17,7 +16,7 @@ const createEntriesService = (uid) => {
|
|
17
16
|
if (!data2) {
|
18
17
|
throw new Error("Create requires data attribute");
|
19
18
|
}
|
20
|
-
const validData = await
|
19
|
+
const validData = await entityValidator.validateEntityCreation(contentType, data2, {
|
21
20
|
// Note: publishedAt value will always be set when DP is disabled
|
22
21
|
isDraft: !params$1?.data?.publishedAt,
|
23
22
|
locale: params$1?.locale
|
@@ -28,7 +27,7 @@ const createEntriesService = (uid) => {
|
|
28
27
|
componentData,
|
29
28
|
validData
|
30
29
|
);
|
31
|
-
const entryData = index
|
30
|
+
const entryData = index.applyTransforms(contentType, dataWithComponents);
|
32
31
|
const doc = await strapi.db.query(uid).create({ ...query$1, data: entryData });
|
33
32
|
return doc;
|
34
33
|
}
|
@@ -41,7 +40,7 @@ const createEntriesService = (uid) => {
|
|
41
40
|
async function updateEntry(entryToUpdate, params$1 = {}) {
|
42
41
|
const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1);
|
43
42
|
const query$1 = query.transformParamsToQuery(uid, params.pickSelectionParams(restParams));
|
44
|
-
const validData = await
|
43
|
+
const validData = await entityValidator.validateEntityUpdate(
|
45
44
|
contentType,
|
46
45
|
data2,
|
47
46
|
{
|
@@ -57,7 +56,7 @@ const createEntriesService = (uid) => {
|
|
57
56
|
componentData,
|
58
57
|
validData
|
59
58
|
);
|
60
|
-
const entryData = index
|
59
|
+
const entryData = index.applyTransforms(contentType, dataWithComponents);
|
61
60
|
return strapi.db.query(uid).update({ ...query$1, where: { id: entryToUpdate.id }, data: entryData });
|
62
61
|
}
|
63
62
|
async function publishEntry(entry, params2 = {}) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"entries.js","sources":["../../../src/services/document-service/entries.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { assoc, omit } from 'lodash/fp';\n\nimport * as components from './components';\n\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { transformParamsToQuery } from './transform/query';\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\nimport { transformData } from './transform/data';\
|
1
|
+
{"version":3,"file":"entries.js","sources":["../../../src/services/document-service/entries.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { assoc, omit } from 'lodash/fp';\n\nimport * as components from './components';\n\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { transformParamsToQuery } from './transform/query';\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\nimport { transformData } from './transform/data';\n\nconst createEntriesService = (\n uid: UID.ContentType,\n entityValidator: Modules.EntityValidator.EntityValidator\n) => {\n const contentType = strapi.contentType(uid);\n\n async function createEntry(params = {} as any) {\n const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n // Validation\n if (!data) {\n throw new Error('Create requires data attribute');\n }\n\n const validData = await entityValidator.validateEntityCreation(contentType, data, {\n // Note: publishedAt value will always be set when DP is disabled\n isDraft: !params?.data?.publishedAt,\n locale: params?.locale,\n });\n\n // Component handling\n const componentData = await components.createComponents(uid, validData);\n const dataWithComponents = components.assignComponentData(\n contentType,\n componentData,\n validData\n );\n\n const entryData = applyTransforms(contentType, dataWithComponents);\n\n const doc = await strapi.db.query(uid).create({ ...query, data: entryData });\n\n return doc;\n }\n\n async function deleteEntry(id: number) {\n const componentsToDelete = await components.getComponents(uid, { id });\n\n const deletedEntry = await strapi.db.query(uid).delete({ where: { id } });\n\n await components.deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n return deletedEntry;\n }\n\n async function updateEntry(entryToUpdate: any, params = {} as any) {\n const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n const validData = await entityValidator.validateEntityUpdate(\n contentType,\n data,\n {\n isDraft: !params?.data?.publishedAt, // Always update the draft version\n locale: params?.locale,\n },\n entryToUpdate\n );\n // Component handling\n const componentData = await components.updateComponents(uid, entryToUpdate, validData as any);\n const dataWithComponents = components.assignComponentData(\n contentType,\n componentData,\n validData\n );\n\n const entryData = applyTransforms(contentType, dataWithComponents);\n\n return strapi.db\n .query(uid)\n .update({ ...query, where: { id: entryToUpdate.id }, data: entryData });\n }\n\n async function publishEntry(entry: any, params = {} as any) {\n return async.pipe(\n omit('id'),\n assoc('publishedAt', new Date()),\n (draft) => {\n const opts = { uid, locale: draft.locale, status: 'published', allowMissingId: true };\n return transformData(draft, opts);\n },\n // Create the published entry\n (draft) => createEntry({ ...params, data: draft, locale: draft.locale, status: 'published' })\n )(entry);\n }\n\n async function discardDraftEntry(entry: any, params = {} as any) {\n return async.pipe(\n omit('id'),\n assoc('publishedAt', null),\n (entry) => {\n const opts = { uid, locale: entry.locale, status: 'draft', allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the draft entry\n (data) => createEntry({ ...params, locale: data.locale, data, status: 'draft' })\n )(entry);\n }\n\n return {\n create: createEntry,\n delete: deleteEntry,\n update: updateEntry,\n publish: publishEntry,\n discardDraft: discardDraftEntry,\n };\n};\n\nexport { createEntriesService };\n"],"names":["params","data","transformParamsDocumentId","query","transformParamsToQuery","pickSelectionParams","components.createComponents","components.assignComponentData","applyTransforms","components.getComponents","components.deleteComponents","components.updateComponents","async","omit","assoc","transformData","entry"],"mappings":"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"}
|
@@ -6,8 +6,7 @@ import { transformParamsToQuery } from "./transform/query.mjs";
|
|
6
6
|
import { pickSelectionParams } from "./params.mjs";
|
7
7
|
import { applyTransforms } from "./attributes/index.mjs";
|
8
8
|
import { transformData } from "./transform/data.mjs";
|
9
|
-
|
10
|
-
const createEntriesService = (uid) => {
|
9
|
+
const createEntriesService = (uid, entityValidator) => {
|
11
10
|
const contentType = strapi.contentType(uid);
|
12
11
|
async function createEntry(params = {}) {
|
13
12
|
const { data, ...restParams } = await curriedTransformParamsDocumentId(uid, params);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"entries.mjs","sources":["../../../src/services/document-service/entries.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { assoc, omit } from 'lodash/fp';\n\nimport * as components from './components';\n\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { transformParamsToQuery } from './transform/query';\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\nimport { transformData } from './transform/data';\
|
1
|
+
{"version":3,"file":"entries.mjs","sources":["../../../src/services/document-service/entries.ts"],"sourcesContent":["import type { UID, Modules } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { assoc, omit } from 'lodash/fp';\n\nimport * as components from './components';\n\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { transformParamsToQuery } from './transform/query';\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\nimport { transformData } from './transform/data';\n\nconst createEntriesService = (\n uid: UID.ContentType,\n entityValidator: Modules.EntityValidator.EntityValidator\n) => {\n const contentType = strapi.contentType(uid);\n\n async function createEntry(params = {} as any) {\n const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n // Validation\n if (!data) {\n throw new Error('Create requires data attribute');\n }\n\n const validData = await entityValidator.validateEntityCreation(contentType, data, {\n // Note: publishedAt value will always be set when DP is disabled\n isDraft: !params?.data?.publishedAt,\n locale: params?.locale,\n });\n\n // Component handling\n const componentData = await components.createComponents(uid, validData);\n const dataWithComponents = components.assignComponentData(\n contentType,\n componentData,\n validData\n );\n\n const entryData = applyTransforms(contentType, dataWithComponents);\n\n const doc = await strapi.db.query(uid).create({ ...query, data: entryData });\n\n return doc;\n }\n\n async function deleteEntry(id: number) {\n const componentsToDelete = await components.getComponents(uid, { id });\n\n const deletedEntry = await strapi.db.query(uid).delete({ where: { id } });\n\n await components.deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n return deletedEntry;\n }\n\n async function updateEntry(entryToUpdate: any, params = {} as any) {\n const { data, ...restParams } = await transformParamsDocumentId(uid, params);\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n const validData = await entityValidator.validateEntityUpdate(\n contentType,\n data,\n {\n isDraft: !params?.data?.publishedAt, // Always update the draft version\n locale: params?.locale,\n },\n entryToUpdate\n );\n // Component handling\n const componentData = await components.updateComponents(uid, entryToUpdate, validData as any);\n const dataWithComponents = components.assignComponentData(\n contentType,\n componentData,\n validData\n );\n\n const entryData = applyTransforms(contentType, dataWithComponents);\n\n return strapi.db\n .query(uid)\n .update({ ...query, where: { id: entryToUpdate.id }, data: entryData });\n }\n\n async function publishEntry(entry: any, params = {} as any) {\n return async.pipe(\n omit('id'),\n assoc('publishedAt', new Date()),\n (draft) => {\n const opts = { uid, locale: draft.locale, status: 'published', allowMissingId: true };\n return transformData(draft, opts);\n },\n // Create the published entry\n (draft) => createEntry({ ...params, data: draft, locale: draft.locale, status: 'published' })\n )(entry);\n }\n\n async function discardDraftEntry(entry: any, params = {} as any) {\n return async.pipe(\n omit('id'),\n assoc('publishedAt', null),\n (entry) => {\n const opts = { uid, locale: entry.locale, status: 'draft', allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the draft entry\n (data) => createEntry({ ...params, locale: data.locale, data, status: 'draft' })\n )(entry);\n }\n\n return {\n create: createEntry,\n delete: deleteEntry,\n update: updateEntry,\n publish: publishEntry,\n discardDraft: discardDraftEntry,\n };\n};\n\nexport { createEntriesService };\n"],"names":["transformParamsDocumentId","components.createComponents","components.assignComponentData","components.getComponents","components.deleteComponents","components.updateComponents","entry"],"mappings":"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"}
|
@@ -6,6 +6,7 @@ import type { Core, Modules } from '@strapi/types';
|
|
6
6
|
* - Apply default parameters to document actions
|
7
7
|
*
|
8
8
|
* @param strapi
|
9
|
+
* @param validator - validator for database entries
|
9
10
|
* @returns DocumentService
|
10
11
|
*
|
11
12
|
* @example Access documents
|
@@ -13,5 +14,5 @@ import type { Core, Modules } from '@strapi/types';
|
|
13
14
|
* const allArticles = strapi.documents('api::article.article').findMany(params)
|
14
15
|
*
|
15
16
|
*/
|
16
|
-
export declare const createDocumentService: (strapi: Core.Strapi) => Modules.Documents.Service;
|
17
|
+
export declare const createDocumentService: (strapi: Core.Strapi, validator?: Modules.EntityValidator.EntityValidator) => Modules.Documents.Service;
|
17
18
|
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAO,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAO,MAAM,eAAe,CAAC;AAQxD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,WACxB,KAAK,MAAM,cACR,QAAQ,eAAe,CAAC,eAAe,KACjD,QAAQ,SAAS,CAAC,OAmCpB,CAAC"}
|
@@ -4,7 +4,8 @@ const errors = require("./middlewares/errors.js");
|
|
4
4
|
const middlewareManager = require("./middlewares/middleware-manager.js");
|
5
5
|
const repository = require("./repository.js");
|
6
6
|
const data = require("./transform/data.js");
|
7
|
-
const
|
7
|
+
const index = require("../entity-validator/index.js");
|
8
|
+
const createDocumentService = (strapi, validator = index) => {
|
8
9
|
const repositories = /* @__PURE__ */ new Map();
|
9
10
|
const middlewares = middlewareManager.createMiddlewareManager();
|
10
11
|
middlewares.use(errors.databaseErrorsMiddleware);
|
@@ -13,7 +14,7 @@ const createDocumentService = (strapi) => {
|
|
13
14
|
return repositories.get(uid);
|
14
15
|
}
|
15
16
|
const contentType = strapi.contentType(uid);
|
16
|
-
const repository$1 = repository.createContentTypeRepository(uid);
|
17
|
+
const repository$1 = repository.createContentTypeRepository(uid, validator);
|
17
18
|
const instance = middlewares.wrapObject(
|
18
19
|
repository$1,
|
19
20
|
{ uid, contentType },
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/services/document-service/index.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\n\nimport { createMiddlewareManager, databaseErrorsMiddleware } from './middlewares';\nimport { createContentTypeRepository } from './repository';\nimport { transformData } from './transform/data';\n\n/**\n * Repository to :\n * - Access documents via actions (findMany, findOne, create, update, delete, ...)\n * - Execute middlewares on document actions\n * - Apply default parameters to document actions\n *\n * @param strapi\n * @returns DocumentService\n *\n * @example Access documents\n * const article = strapi.documents('api::article.article').create(params)\n * const allArticles = strapi.documents('api::article.article').findMany(params)\n *\n */\nexport const createDocumentService = (strapi: Core.Strapi): Modules.Documents.Service => {\n // Cache the repositories (one per content type)\n const repositories = new Map<string, Modules.Documents.ServiceInstance>();\n\n // Manager to handle document service middlewares\n const middlewares = createMiddlewareManager();\n middlewares.use(databaseErrorsMiddleware);\n\n const factory = function factory(uid: UID.ContentType) {\n if (repositories.has(uid)) {\n return repositories.get(uid)!;\n }\n\n const contentType = strapi.contentType(uid);\n const repository = createContentTypeRepository(uid);\n\n const instance = middlewares.wrapObject(\n repository,\n { uid, contentType },\n {\n exclude: ['updateComponents', 'omitComponentData'],\n }\n );\n\n repositories.set(uid, instance);\n\n return instance;\n } as Modules.Documents.Service;\n\n return Object.assign(factory, {\n utils: {\n transformData,\n },\n use: middlewares.use.bind(middlewares),\n });\n};\n"],"names":["createMiddlewareManager","databaseErrorsMiddleware","factory","repository","createContentTypeRepository","transformData"],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/services/document-service/index.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\n\nimport { createMiddlewareManager, databaseErrorsMiddleware } from './middlewares';\nimport { createContentTypeRepository } from './repository';\nimport { transformData } from './transform/data';\n\nimport entityValidator from '../entity-validator';\n\n/**\n * Repository to :\n * - Access documents via actions (findMany, findOne, create, update, delete, ...)\n * - Execute middlewares on document actions\n * - Apply default parameters to document actions\n *\n * @param strapi\n * @param validator - validator for database entries\n * @returns DocumentService\n *\n * @example Access documents\n * const article = strapi.documents('api::article.article').create(params)\n * const allArticles = strapi.documents('api::article.article').findMany(params)\n *\n */\nexport const createDocumentService = (\n strapi: Core.Strapi,\n validator: Modules.EntityValidator.EntityValidator = entityValidator\n): Modules.Documents.Service => {\n // Cache the repositories (one per content type)\n const repositories = new Map<string, Modules.Documents.ServiceInstance>();\n\n // Manager to handle document service middlewares\n const middlewares = createMiddlewareManager();\n middlewares.use(databaseErrorsMiddleware);\n\n const factory = function factory(uid: UID.ContentType) {\n if (repositories.has(uid)) {\n return repositories.get(uid)!;\n }\n\n const contentType = strapi.contentType(uid);\n const repository = createContentTypeRepository(uid, validator);\n\n const instance = middlewares.wrapObject(\n repository,\n { uid, contentType },\n {\n exclude: ['updateComponents', 'omitComponentData'],\n }\n );\n\n repositories.set(uid, instance);\n\n return instance;\n } as Modules.Documents.Service;\n\n return Object.assign(factory, {\n utils: {\n transformData,\n },\n use: middlewares.use.bind(middlewares),\n });\n};\n"],"names":["entityValidator","createMiddlewareManager","databaseErrorsMiddleware","factory","repository","createContentTypeRepository","transformData"],"mappings":";;;;;;;AAuBO,MAAM,wBAAwB,CACnC,QACA,YAAqDA,UACvB;AAExB,QAAA,mCAAmB;AAGzB,QAAM,cAAcC,kBAAAA;AACpB,cAAY,IAAIC,OAAAA,wBAAwB;AAElC,QAAA,UAAU,SAASC,SAAQ,KAAsB;AACjD,QAAA,aAAa,IAAI,GAAG,GAAG;AAClB,aAAA,aAAa,IAAI,GAAG;AAAA,IAC7B;AAEM,UAAA,cAAc,OAAO,YAAY,GAAG;AACpC,UAAAC,eAAaC,WAAAA,4BAA4B,KAAK,SAAS;AAE7D,UAAM,WAAW,YAAY;AAAA,MAC3BD;AAAAA,MACA,EAAE,KAAK,YAAY;AAAA,MACnB;AAAA,QACE,SAAS,CAAC,oBAAoB,mBAAmB;AAAA,MACnD;AAAA,IAAA;AAGW,iBAAA,IAAI,KAAK,QAAQ;AAEvB,WAAA;AAAA,EAAA;AAGF,SAAA,OAAO,OAAO,SAAS;AAAA,IAC5B,OAAO;AAAA,MAAA,eACLE,KAAA;AAAA,IACF;AAAA,IACA,KAAK,YAAY,IAAI,KAAK,WAAW;AAAA,EAAA,CACtC;AACH;;"}
|
@@ -2,7 +2,8 @@ import { databaseErrorsMiddleware } from "./middlewares/errors.mjs";
|
|
2
2
|
import { createMiddlewareManager } from "./middlewares/middleware-manager.mjs";
|
3
3
|
import { createContentTypeRepository } from "./repository.mjs";
|
4
4
|
import { transformData } from "./transform/data.mjs";
|
5
|
-
|
5
|
+
import entityValidator from "../entity-validator/index.mjs";
|
6
|
+
const createDocumentService = (strapi, validator = entityValidator) => {
|
6
7
|
const repositories = /* @__PURE__ */ new Map();
|
7
8
|
const middlewares = createMiddlewareManager();
|
8
9
|
middlewares.use(databaseErrorsMiddleware);
|
@@ -11,7 +12,7 @@ const createDocumentService = (strapi) => {
|
|
11
12
|
return repositories.get(uid);
|
12
13
|
}
|
13
14
|
const contentType = strapi.contentType(uid);
|
14
|
-
const repository = createContentTypeRepository(uid);
|
15
|
+
const repository = createContentTypeRepository(uid, validator);
|
15
16
|
const instance = middlewares.wrapObject(
|
16
17
|
repository,
|
17
18
|
{ uid, contentType },
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/services/document-service/index.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\n\nimport { createMiddlewareManager, databaseErrorsMiddleware } from './middlewares';\nimport { createContentTypeRepository } from './repository';\nimport { transformData } from './transform/data';\n\n/**\n * Repository to :\n * - Access documents via actions (findMany, findOne, create, update, delete, ...)\n * - Execute middlewares on document actions\n * - Apply default parameters to document actions\n *\n * @param strapi\n * @returns DocumentService\n *\n * @example Access documents\n * const article = strapi.documents('api::article.article').create(params)\n * const allArticles = strapi.documents('api::article.article').findMany(params)\n *\n */\nexport const createDocumentService = (strapi: Core.Strapi): Modules.Documents.Service => {\n // Cache the repositories (one per content type)\n const repositories = new Map<string, Modules.Documents.ServiceInstance>();\n\n // Manager to handle document service middlewares\n const middlewares = createMiddlewareManager();\n middlewares.use(databaseErrorsMiddleware);\n\n const factory = function factory(uid: UID.ContentType) {\n if (repositories.has(uid)) {\n return repositories.get(uid)!;\n }\n\n const contentType = strapi.contentType(uid);\n const repository = createContentTypeRepository(uid);\n\n const instance = middlewares.wrapObject(\n repository,\n { uid, contentType },\n {\n exclude: ['updateComponents', 'omitComponentData'],\n }\n );\n\n repositories.set(uid, instance);\n\n return instance;\n } as Modules.Documents.Service;\n\n return Object.assign(factory, {\n utils: {\n transformData,\n },\n use: middlewares.use.bind(middlewares),\n });\n};\n"],"names":["factory"],"mappings":"
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/services/document-service/index.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\n\nimport { createMiddlewareManager, databaseErrorsMiddleware } from './middlewares';\nimport { createContentTypeRepository } from './repository';\nimport { transformData } from './transform/data';\n\nimport entityValidator from '../entity-validator';\n\n/**\n * Repository to :\n * - Access documents via actions (findMany, findOne, create, update, delete, ...)\n * - Execute middlewares on document actions\n * - Apply default parameters to document actions\n *\n * @param strapi\n * @param validator - validator for database entries\n * @returns DocumentService\n *\n * @example Access documents\n * const article = strapi.documents('api::article.article').create(params)\n * const allArticles = strapi.documents('api::article.article').findMany(params)\n *\n */\nexport const createDocumentService = (\n strapi: Core.Strapi,\n validator: Modules.EntityValidator.EntityValidator = entityValidator\n): Modules.Documents.Service => {\n // Cache the repositories (one per content type)\n const repositories = new Map<string, Modules.Documents.ServiceInstance>();\n\n // Manager to handle document service middlewares\n const middlewares = createMiddlewareManager();\n middlewares.use(databaseErrorsMiddleware);\n\n const factory = function factory(uid: UID.ContentType) {\n if (repositories.has(uid)) {\n return repositories.get(uid)!;\n }\n\n const contentType = strapi.contentType(uid);\n const repository = createContentTypeRepository(uid, validator);\n\n const instance = middlewares.wrapObject(\n repository,\n { uid, contentType },\n {\n exclude: ['updateComponents', 'omitComponentData'],\n }\n );\n\n repositories.set(uid, instance);\n\n return instance;\n } as Modules.Documents.Service;\n\n return Object.assign(factory, {\n utils: {\n transformData,\n },\n use: middlewares.use.bind(middlewares),\n });\n};\n"],"names":["factory"],"mappings":";;;;;AAuBO,MAAM,wBAAwB,CACnC,QACA,YAAqD,oBACvB;AAExB,QAAA,mCAAmB;AAGzB,QAAM,cAAc;AACpB,cAAY,IAAI,wBAAwB;AAElC,QAAA,UAAU,SAASA,SAAQ,KAAsB;AACjD,QAAA,aAAa,IAAI,GAAG,GAAG;AAClB,aAAA,aAAa,IAAI,GAAG;AAAA,IAC7B;AAEM,UAAA,cAAc,OAAO,YAAY,GAAG;AACpC,UAAA,aAAa,4BAA4B,KAAK,SAAS;AAE7D,UAAM,WAAW,YAAY;AAAA,MAC3B;AAAA,MACA,EAAE,KAAK,YAAY;AAAA,MACnB;AAAA,QACE,SAAS,CAAC,oBAAoB,mBAAmB;AAAA,MACnD;AAAA,IAAA;AAGW,iBAAA,IAAI,KAAK,QAAQ;AAEvB,WAAA;AAAA,EAAA;AAGF,SAAA,OAAO,OAAO,SAAS;AAAA,IAC5B,OAAO;AAAA,MACL;AAAA,IACF;AAAA,IACA,KAAK,YAAY,IAAI,KAAK,WAAW;AAAA,EAAA,CACtC;AACH;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAKA,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":"AAKA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAoB3E,eAAO,MAAM,2BAA2B,EAAE,uBA0YzC,CAAC"}
|
@@ -13,9 +13,11 @@ const populate = require("./utils/populate.js");
|
|
13
13
|
const query = require("./transform/query.js");
|
14
14
|
const idTransform = require("./transform/id-transform.js");
|
15
15
|
const events = require("./events.js");
|
16
|
+
const unidirectionalRelations = require("./utils/unidirectional-relations.js");
|
17
|
+
const index = require("../entity-validator/index.js");
|
16
18
|
const { validators } = strapiUtils.validate;
|
17
19
|
const getModel = (schema) => strapi.getModel(schema);
|
18
|
-
const createContentTypeRepository = (uid) => {
|
20
|
+
const createContentTypeRepository = (uid, validator = index) => {
|
19
21
|
const contentType = strapi.contentType(uid);
|
20
22
|
const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(contentType);
|
21
23
|
const sortValidations = ["nonAttributesOperators", "dynamicZones", "morphRelations"];
|
@@ -35,7 +37,7 @@ const createContentTypeRepository = (uid) => {
|
|
35
37
|
await validators.validatePopulate(ctx, params2.populate, populateValidations);
|
36
38
|
return params2;
|
37
39
|
};
|
38
|
-
const entries$1 = entries.createEntriesService(uid);
|
40
|
+
const entries$1 = entries.createEntriesService(uid, validator);
|
39
41
|
const eventManager = events.createEventManager(strapi, uid);
|
40
42
|
const emitEvent = fp.curry(eventManager.emitEvent);
|
41
43
|
async function findMany(params2 = {}) {
|
@@ -207,7 +209,7 @@ const createContentTypeRepository = (uid) => {
|
|
207
209
|
internationalization.defaultLocale(contentType),
|
208
210
|
internationalization.multiLocaleToLookup(contentType)
|
209
211
|
)(params2);
|
210
|
-
const [draftsToPublish,
|
212
|
+
const [draftsToPublish, oldPublishedVersions] = await Promise.all([
|
211
213
|
strapi.db.query(uid).findMany({
|
212
214
|
where: {
|
213
215
|
...queryParams?.lookup,
|
@@ -224,14 +226,23 @@ const createContentTypeRepository = (uid) => {
|
|
224
226
|
documentId,
|
225
227
|
publishedAt: { $ne: null }
|
226
228
|
},
|
227
|
-
select: ["id"]
|
229
|
+
select: ["id", "locale"]
|
228
230
|
})
|
229
231
|
]);
|
230
|
-
await
|
232
|
+
const relationsToSync = await unidirectionalRelations.load(uid, {
|
233
|
+
newVersions: draftsToPublish,
|
234
|
+
oldVersions: oldPublishedVersions
|
235
|
+
});
|
236
|
+
await strapiUtils.async.map(oldPublishedVersions, (entry) => entries$1.delete(entry.id));
|
231
237
|
const publishedEntries = await strapiUtils.async.map(
|
232
238
|
draftsToPublish,
|
233
239
|
(draft) => entries$1.publish(draft, queryParams)
|
234
240
|
);
|
241
|
+
await unidirectionalRelations.sync(
|
242
|
+
[...oldPublishedVersions, ...draftsToPublish],
|
243
|
+
publishedEntries,
|
244
|
+
relationsToSync
|
245
|
+
);
|
235
246
|
publishedEntries.forEach(emitEvent("entry.publish"));
|
236
247
|
return { documentId, entries: publishedEntries };
|
237
248
|
}
|
@@ -256,7 +267,7 @@ const createContentTypeRepository = (uid) => {
|
|
256
267
|
internationalization.defaultLocale(contentType),
|
257
268
|
internationalization.multiLocaleToLookup(contentType)
|
258
269
|
)(params2);
|
259
|
-
const [versionsToDraft,
|
270
|
+
const [versionsToDraft, oldDrafts] = await Promise.all([
|
260
271
|
strapi.db.query(uid).findMany({
|
261
272
|
where: {
|
262
273
|
...queryParams?.lookup,
|
@@ -272,14 +283,23 @@ const createContentTypeRepository = (uid) => {
|
|
272
283
|
documentId,
|
273
284
|
publishedAt: null
|
274
285
|
},
|
275
|
-
select: ["id"]
|
286
|
+
select: ["id", "locale"]
|
276
287
|
})
|
277
288
|
]);
|
278
|
-
await
|
289
|
+
const relationsToSync = await unidirectionalRelations.load(uid, {
|
290
|
+
newVersions: versionsToDraft,
|
291
|
+
oldVersions: oldDrafts
|
292
|
+
});
|
293
|
+
await strapiUtils.async.map(oldDrafts, (entry) => entries$1.delete(entry.id));
|
279
294
|
const draftEntries = await strapiUtils.async.map(
|
280
295
|
versionsToDraft,
|
281
296
|
(entry) => entries$1.discardDraft(entry, queryParams)
|
282
297
|
);
|
298
|
+
await unidirectionalRelations.sync(
|
299
|
+
[...oldDrafts, ...versionsToDraft],
|
300
|
+
draftEntries,
|
301
|
+
relationsToSync
|
302
|
+
);
|
283
303
|
draftEntries.forEach(emitEvent("entry.draft-discard"));
|
284
304
|
return { documentId, entries: draftEntries };
|
285
305
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"repository.js","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry } from 'lodash/fp';\n\nimport { async, contentTypes as contentTypesUtils, validate } from '@strapi/utils';\n\nimport { UID } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (uid) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n const validateParams = async (params: any) => {\n const ctx = { schema: contentType, getModel };\n await validators.validateFilters(ctx, params.filters, filtersValidations);\n await validators.validateSort(ctx, params.sort, sortValidations);\n await validators.validateFields(ctx, params.fields, fieldValidations);\n await validators.validatePopulate(ctx, params.populate, populateValidations);\n\n // TODO: add validate status, locale, pagination\n\n return params;\n };\n\n const entries = createEntriesService(uid);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n validateParams,\n omit('id'),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\n )\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n updatedDraft = await entries.create({\n ...queryParams,\n data: { ...queryParams.data, documentId },\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, publishedToDelete] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id'],\n }),\n ]);\n\n // Delete all published versions\n await async.map(publishedToDelete, (entry: any) => entries.delete(entry.id));\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(draftsToPublish, (draft: unknown) =>\n entries.publish(draft, queryParams)\n );\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, versionsToDelete] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id'],\n }),\n ]);\n\n // Delete all drafts\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validate","contentTypesUtils","params","entries","createEntriesService","createEventManager","curry","query","async","DP.defaultToDraft","DP.statusToLookup","i18n.defaultLocale","i18n.multiLocaleToLookup","transformParamsDocumentId","transformParamsToQuery","i18n.localeToLookup","assoc","omit","DP.filterDataPublishedAt","DP.setStatusToDraft","DP.statusToData","i18n.localeToData","doc","getDeepPopulate","createDocumentId","merge","pickSelectionParams","DP.defaultStatus","components.updateComponents","components.omitComponentData","wrapInTransaction"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"repository.js","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry } from 'lodash/fp';\n\nimport { async, contentTypes as contentTypesUtils, validate } from '@strapi/utils';\n\nimport { UID } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\nimport * as unidirectionalRelations from './utils/unidirectional-relations';\nimport entityValidator from '../entity-validator';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (\n uid,\n validator = entityValidator\n) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n const validateParams = async (params: any) => {\n const ctx = { schema: contentType, getModel };\n await validators.validateFilters(ctx, params.filters, filtersValidations);\n await validators.validateSort(ctx, params.sort, sortValidations);\n await validators.validateFields(ctx, params.fields, fieldValidations);\n await validators.validatePopulate(ctx, params.populate, populateValidations);\n\n // TODO: add validate status, locale, pagination\n\n return params;\n };\n\n const entries = createEntriesService(uid, validator);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n validateParams,\n omit('id'),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\n )\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n updatedDraft = await entries.create({\n ...queryParams,\n data: { ...queryParams.data, documentId },\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, oldPublishedVersions] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targetting the old published entries\n const relationsToSync = await unidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(draftsToPublish, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...draftsToPublish],\n publishedEntries,\n relationsToSync\n );\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, oldDrafts] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targeting the old drafts\n const relationsToSync = await unidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n // Delete old drafts\n await async.map(oldDrafts, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n // Sync unidirectional relations with the new draft entries\n await unidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n relationsToSync\n );\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validate","entityValidator","contentTypesUtils","params","entries","createEntriesService","createEventManager","curry","query","async","DP.defaultToDraft","DP.statusToLookup","i18n.defaultLocale","i18n.multiLocaleToLookup","transformParamsDocumentId","transformParamsToQuery","i18n.localeToLookup","assoc","omit","DP.filterDataPublishedAt","DP.setStatusToDraft","DP.statusToData","i18n.localeToData","doc","getDeepPopulate","createDocumentId","merge","pickSelectionParams","DP.defaultStatus","unidirectionalRelations.load","unidirectionalRelations.sync","components.updateComponents","components.omitComponentData","wrapInTransaction"],"mappings":"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"}
|
@@ -11,9 +11,11 @@ import { getDeepPopulate } from "./utils/populate.mjs";
|
|
11
11
|
import { transformParamsToQuery } from "./transform/query.mjs";
|
12
12
|
import { transformParamsDocumentId as curriedTransformParamsDocumentId } from "./transform/id-transform.mjs";
|
13
13
|
import { createEventManager } from "./events.mjs";
|
14
|
+
import { load, sync } from "./utils/unidirectional-relations.mjs";
|
15
|
+
import entityValidator from "../entity-validator/index.mjs";
|
14
16
|
const { validators } = validate;
|
15
17
|
const getModel = (schema) => strapi.getModel(schema);
|
16
|
-
const createContentTypeRepository = (uid) => {
|
18
|
+
const createContentTypeRepository = (uid, validator = entityValidator) => {
|
17
19
|
const contentType = strapi.contentType(uid);
|
18
20
|
const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);
|
19
21
|
const sortValidations = ["nonAttributesOperators", "dynamicZones", "morphRelations"];
|
@@ -33,7 +35,7 @@ const createContentTypeRepository = (uid) => {
|
|
33
35
|
await validators.validatePopulate(ctx, params.populate, populateValidations);
|
34
36
|
return params;
|
35
37
|
};
|
36
|
-
const entries = createEntriesService(uid);
|
38
|
+
const entries = createEntriesService(uid, validator);
|
37
39
|
const eventManager = createEventManager(strapi, uid);
|
38
40
|
const emitEvent = curry(eventManager.emitEvent);
|
39
41
|
async function findMany(params = {}) {
|
@@ -205,7 +207,7 @@ const createContentTypeRepository = (uid) => {
|
|
205
207
|
defaultLocaleCurry(contentType),
|
206
208
|
multiLocaleToLookupCurry(contentType)
|
207
209
|
)(params);
|
208
|
-
const [draftsToPublish,
|
210
|
+
const [draftsToPublish, oldPublishedVersions] = await Promise.all([
|
209
211
|
strapi.db.query(uid).findMany({
|
210
212
|
where: {
|
211
213
|
...queryParams?.lookup,
|
@@ -222,14 +224,23 @@ const createContentTypeRepository = (uid) => {
|
|
222
224
|
documentId,
|
223
225
|
publishedAt: { $ne: null }
|
224
226
|
},
|
225
|
-
select: ["id"]
|
227
|
+
select: ["id", "locale"]
|
226
228
|
})
|
227
229
|
]);
|
228
|
-
await
|
230
|
+
const relationsToSync = await load(uid, {
|
231
|
+
newVersions: draftsToPublish,
|
232
|
+
oldVersions: oldPublishedVersions
|
233
|
+
});
|
234
|
+
await async.map(oldPublishedVersions, (entry) => entries.delete(entry.id));
|
229
235
|
const publishedEntries = await async.map(
|
230
236
|
draftsToPublish,
|
231
237
|
(draft) => entries.publish(draft, queryParams)
|
232
238
|
);
|
239
|
+
await sync(
|
240
|
+
[...oldPublishedVersions, ...draftsToPublish],
|
241
|
+
publishedEntries,
|
242
|
+
relationsToSync
|
243
|
+
);
|
233
244
|
publishedEntries.forEach(emitEvent("entry.publish"));
|
234
245
|
return { documentId, entries: publishedEntries };
|
235
246
|
}
|
@@ -254,7 +265,7 @@ const createContentTypeRepository = (uid) => {
|
|
254
265
|
defaultLocaleCurry(contentType),
|
255
266
|
multiLocaleToLookupCurry(contentType)
|
256
267
|
)(params);
|
257
|
-
const [versionsToDraft,
|
268
|
+
const [versionsToDraft, oldDrafts] = await Promise.all([
|
258
269
|
strapi.db.query(uid).findMany({
|
259
270
|
where: {
|
260
271
|
...queryParams?.lookup,
|
@@ -270,14 +281,23 @@ const createContentTypeRepository = (uid) => {
|
|
270
281
|
documentId,
|
271
282
|
publishedAt: null
|
272
283
|
},
|
273
|
-
select: ["id"]
|
284
|
+
select: ["id", "locale"]
|
274
285
|
})
|
275
286
|
]);
|
276
|
-
await
|
287
|
+
const relationsToSync = await load(uid, {
|
288
|
+
newVersions: versionsToDraft,
|
289
|
+
oldVersions: oldDrafts
|
290
|
+
});
|
291
|
+
await async.map(oldDrafts, (entry) => entries.delete(entry.id));
|
277
292
|
const draftEntries = await async.map(
|
278
293
|
versionsToDraft,
|
279
294
|
(entry) => entries.discardDraft(entry, queryParams)
|
280
295
|
);
|
296
|
+
await sync(
|
297
|
+
[...oldDrafts, ...versionsToDraft],
|
298
|
+
draftEntries,
|
299
|
+
relationsToSync
|
300
|
+
);
|
281
301
|
draftEntries.forEach(emitEvent("entry.draft-discard"));
|
282
302
|
return { documentId, entries: draftEntries };
|
283
303
|
}
|