@strapi/core 5.50.0 → 5.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-api/routes/validation/component.js +3 -3
- package/dist/core-api/routes/validation/component.js.map +1 -1
- package/dist/core-api/routes/validation/component.mjs +3 -3
- package/dist/core-api/routes/validation/component.mjs.map +1 -1
- package/dist/package.json.js +14 -14
- package/dist/package.json.mjs +14 -14
- package/dist/services/core-store.js +1 -1
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs +1 -1
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/document-service/components.js +7 -7
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs +7 -7
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +12 -8
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +12 -8
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/utils/self-referential-relations.d.ts +6 -1
- package/dist/services/document-service/utils/self-referential-relations.d.ts.map +1 -1
- package/dist/services/document-service/utils/self-referential-relations.js +120 -7
- package/dist/services/document-service/utils/self-referential-relations.js.map +1 -1
- package/dist/services/document-service/utils/self-referential-relations.mjs +120 -7
- package/dist/services/document-service/utils/self-referential-relations.mjs.map +1 -1
- package/dist/services/entity-service/index.d.ts.map +1 -1
- package/dist/services/entity-service/index.js +1 -1
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-service/index.mjs +1 -1
- package/dist/services/entity-service/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.d.ts.map +1 -1
- package/dist/services/entity-validator/validators.js +4 -2
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs +4 -2
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/package.json +14 -14
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { keyBy, omit } from 'lodash/fp';
|
|
2
2
|
|
|
3
|
+
const entryKey = (entry)=>`${String(entry.document_id)}:${String(entry.locale)}`;
|
|
4
|
+
const getCounterparts = async (trx, tableName, idsToResolve, status)=>{
|
|
5
|
+
const ids = [
|
|
6
|
+
...new Set(idsToResolve.map((id)=>String(id)))
|
|
7
|
+
];
|
|
8
|
+
if (ids.length === 0) {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
const drafts = await strapi.db.getConnection().select('id', 'document_id', 'locale').from(tableName).whereIn('id', ids).transacting(trx);
|
|
12
|
+
if (drafts.length === 0) {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
const documentIds = [
|
|
16
|
+
...new Set(drafts.map((entry)=>entry.document_id))
|
|
17
|
+
];
|
|
18
|
+
const counterpartsQuery = strapi.db.getConnection().select('id', 'document_id', 'locale').from(tableName).whereIn('document_id', documentIds).transacting(trx);
|
|
19
|
+
const counterparts = status === 'published' ? await counterpartsQuery.whereNotNull('published_at') : await counterpartsQuery.whereNull('published_at');
|
|
20
|
+
const counterpartByDocument = keyBy(entryKey, counterparts);
|
|
21
|
+
return drafts.reduce((acc, draft)=>{
|
|
22
|
+
const counterpart = counterpartByDocument[entryKey(draft)];
|
|
23
|
+
if (counterpart) {
|
|
24
|
+
acc[String(draft.id)] = counterpart.id;
|
|
25
|
+
}
|
|
26
|
+
return acc;
|
|
27
|
+
}, {});
|
|
28
|
+
};
|
|
3
29
|
/**
|
|
4
30
|
* Preserves self-referential relations during publish/discard operations.
|
|
5
31
|
*
|
|
@@ -17,7 +43,7 @@ import { keyBy, omit } from 'lodash/fp';
|
|
|
17
43
|
* 3. Inserts the remapped relations
|
|
18
44
|
*/ /**
|
|
19
45
|
* Loads self-referential relations from source entries before they are deleted/recreated.
|
|
20
|
-
*/ const load = async (uid, sourceEntries)=>{
|
|
46
|
+
*/ const load = async (uid, sourceEntries, targetStatus)=>{
|
|
21
47
|
const updates = [];
|
|
22
48
|
const dbModel = strapi.db.metadata.get(uid);
|
|
23
49
|
await strapi.db.transaction(async ({ trx })=>{
|
|
@@ -44,9 +70,72 @@ import { keyBy, omit } from 'lodash/fp';
|
|
|
44
70
|
if (selfRelations.length > 0) {
|
|
45
71
|
updates.push({
|
|
46
72
|
joinTable,
|
|
47
|
-
relations: selfRelations
|
|
73
|
+
relations: selfRelations,
|
|
74
|
+
remap: {
|
|
75
|
+
source: true,
|
|
76
|
+
target: true
|
|
77
|
+
}
|
|
48
78
|
});
|
|
49
79
|
}
|
|
80
|
+
// Use rows from the state being copied as the source of truth for one-sided
|
|
81
|
+
// self-relations. Publishing maps untouched targets to published counterparts and drops
|
|
82
|
+
// draft-only targets; discarding maps untouched targets to draft counterparts. This avoids
|
|
83
|
+
// restoring stale old rows that were removed from the copied state.
|
|
84
|
+
const [sourceDraftRelations, targetDraftRelations] = await Promise.all([
|
|
85
|
+
strapi.db.getConnection().select('*').from(joinTable.name).whereIn(sourceColumnName, sourceIds).whereNotIn(targetColumnName, sourceIds).transacting(trx),
|
|
86
|
+
strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, sourceIds).whereNotIn(sourceColumnName, sourceIds).transacting(trx)
|
|
87
|
+
]);
|
|
88
|
+
const [targetCounterparts, sourceCounterparts] = await Promise.all([
|
|
89
|
+
getCounterparts(trx, dbModel.tableName, sourceDraftRelations.map((relation)=>relation[targetColumnName]), targetStatus),
|
|
90
|
+
getCounterparts(trx, dbModel.tableName, targetDraftRelations.map((relation)=>relation[sourceColumnName]), targetStatus)
|
|
91
|
+
]);
|
|
92
|
+
if (sourceDraftRelations.length > 0) {
|
|
93
|
+
const relations = sourceDraftRelations.map((relation)=>{
|
|
94
|
+
const targetCounterpart = targetCounterparts[String(relation[targetColumnName])];
|
|
95
|
+
if (targetCounterpart == null) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
...relation,
|
|
100
|
+
[targetColumnName]: targetCounterpart
|
|
101
|
+
};
|
|
102
|
+
}).filter(Boolean);
|
|
103
|
+
if (relations.length > 0) {
|
|
104
|
+
updates.push({
|
|
105
|
+
joinTable,
|
|
106
|
+
relations,
|
|
107
|
+
remap: {
|
|
108
|
+
source: true,
|
|
109
|
+
target: false
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (targetDraftRelations.length > 0) {
|
|
115
|
+
const relations = targetDraftRelations.map((relation)=>{
|
|
116
|
+
const sourceCounterpart = sourceCounterparts[String(relation[sourceColumnName])];
|
|
117
|
+
if (sourceCounterpart == null) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
...relation,
|
|
122
|
+
[sourceColumnName]: sourceCounterpart
|
|
123
|
+
};
|
|
124
|
+
}).filter(Boolean);
|
|
125
|
+
if (relations.length > 0) {
|
|
126
|
+
updates.push({
|
|
127
|
+
joinTable,
|
|
128
|
+
relations,
|
|
129
|
+
remap: {
|
|
130
|
+
source: false,
|
|
131
|
+
target: true
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// One-sided rows from the replaced state are intentionally not restored here. The rows
|
|
137
|
+
// captured above represent the current logical relation set; restoring stale old rows can
|
|
138
|
+
// resurrect relations that were removed before publishing or discarding.
|
|
50
139
|
}
|
|
51
140
|
});
|
|
52
141
|
return updates;
|
|
@@ -66,16 +155,19 @@ import { keyBy, omit } from 'lodash/fp';
|
|
|
66
155
|
}, {});
|
|
67
156
|
const batchSize = strapi.db.dialect.getBatchInsertSize();
|
|
68
157
|
await strapi.db.transaction(async ({ trx })=>{
|
|
69
|
-
for (const { joinTable, relations
|
|
158
|
+
for (const { joinTable, relations, remap = {
|
|
159
|
+
source: true,
|
|
160
|
+
target: true
|
|
161
|
+
} } of relationData){
|
|
70
162
|
const sourceColumn = joinTable.joinColumn.name;
|
|
71
163
|
const targetColumn = joinTable.inverseJoinColumn.name;
|
|
72
164
|
const newRelations = relations.map((relation)=>{
|
|
73
165
|
const oldSourceId = String(relation[sourceColumn]);
|
|
74
166
|
const oldTargetId = String(relation[targetColumn]);
|
|
75
|
-
const newSourceId = idMapping[oldSourceId];
|
|
76
|
-
const newTargetId = idMapping[oldTargetId];
|
|
77
|
-
//
|
|
78
|
-
if (
|
|
167
|
+
const newSourceId = remap.source ? idMapping[oldSourceId] : relation[sourceColumn];
|
|
168
|
+
const newTargetId = remap.target ? idMapping[oldTargetId] : relation[targetColumn];
|
|
169
|
+
// Any side being remapped must resolve to a new entry.
|
|
170
|
+
if (newSourceId == null || newTargetId == null) return null;
|
|
79
171
|
return {
|
|
80
172
|
...omit(strapi.db.metadata.identifiers.ID_COLUMN, relation),
|
|
81
173
|
[sourceColumn]: newSourceId,
|
|
@@ -91,12 +183,33 @@ import { keyBy, omit } from 'lodash/fp';
|
|
|
91
183
|
return true;
|
|
92
184
|
});
|
|
93
185
|
if (deduped.length === 0) continue;
|
|
186
|
+
// Relation writes may have already recreated the remapped pair. In that case restore
|
|
187
|
+
// the saved join-row metadata (notably order columns) instead of inserting a duplicate.
|
|
94
188
|
const newSourceIds = [
|
|
95
189
|
...new Set(deduped.map((r)=>String(r[sourceColumn])))
|
|
96
190
|
];
|
|
97
191
|
const existingRows = await trx(joinTable.name).whereIn(sourceColumn, newSourceIds).select(sourceColumn, targetColumn);
|
|
98
192
|
const existingSet = new Set(existingRows.map((r)=>pairKey(r)));
|
|
193
|
+
const toUpdate = deduped.filter((r)=>existingSet.has(pairKey(r)));
|
|
99
194
|
const toInsert = deduped.filter((r)=>!existingSet.has(pairKey(r)));
|
|
195
|
+
await Promise.all(toUpdate.map((relation)=>{
|
|
196
|
+
const sourceId = relation[sourceColumn];
|
|
197
|
+
const targetId = relation[targetColumn];
|
|
198
|
+
const dataToRestore = Object.fromEntries([
|
|
199
|
+
joinTable.orderColumnName,
|
|
200
|
+
joinTable.inverseOrderColumnName
|
|
201
|
+
].filter((columnName)=>columnName != null).filter((columnName)=>columnName in relation).map((columnName)=>[
|
|
202
|
+
columnName,
|
|
203
|
+
relation[columnName]
|
|
204
|
+
]));
|
|
205
|
+
if (Object.keys(dataToRestore).length === 0) {
|
|
206
|
+
return Promise.resolve();
|
|
207
|
+
}
|
|
208
|
+
return trx(joinTable.name).where({
|
|
209
|
+
[sourceColumn]: sourceId,
|
|
210
|
+
[targetColumn]: targetId
|
|
211
|
+
}).update(dataToRestore);
|
|
212
|
+
}));
|
|
100
213
|
if (toInsert.length > 0) {
|
|
101
214
|
await trx.batchInsert(joinTable.name, toInsert, batchSize);
|
|
102
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-referential-relations.mjs","sources":["../../../../src/services/document-service/utils/self-referential-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\nimport type { Data, UID } from '@strapi/types';\nimport type { JoinTable } from '@strapi/database';\n\ninterface VersionEntry {\n id: Data.ID;\n locale: string;\n}\n\ninterface RelationData {\n joinTable: JoinTable;\n relations: Record<string, unknown>[];\n}\n\n/**\n * Preserves self-referential relations during publish/discard operations.\n *\n * When publishing or discarding a draft, self-referential relations (where both sides\n * of the relation belong to the same content type) are lost because:\n *\n * 1. The old entry is deleted\n * 2. A new entry is created with relations resolved via documentId → entity ID mapping\n * 3. At mapping time, the old entity is already deleted and the new one doesn't exist yet\n * 4. The relation is silently dropped\n *\n * This utility:\n * 1. Captures self-referential join table rows before deletion\n * 2. Remaps old entity IDs to new entity IDs after creation\n * 3. Inserts the remapped relations\n */\n\n/**\n * Loads self-referential relations from source entries before they are deleted/recreated.\n */\nconst load = async (\n uid: UID.ContentType,\n sourceEntries: VersionEntry[]\n): Promise<RelationData[]> => {\n const updates: RelationData[] = [];\n const dbModel = strapi.db.metadata.get(uid);\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const attribute of Object.values(dbModel.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n // Bidirectional inverse side (e.g. `children` mappedBy `parent`) shares the same physical\n // join table as the owning attribute; processing both would duplicate rows and inserts.\n if (attribute.mappedBy) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n const sourceIds = sourceEntries.map((entry) => String(entry.id));\n\n // Load relations where both source and target are among the entries being processed.\n // These are the self-referential relations that would be lost during the\n // delete-and-recreate cycle.\n const selfRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(sourceColumnName, sourceIds)\n .whereIn(targetColumnName, sourceIds)\n .transacting(trx);\n\n if (selfRelations.length > 0) {\n updates.push({ joinTable, relations: selfRelations });\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Syncs self-referential relations by remapping old entry IDs to new entry IDs\n * and inserting the remapped relations into the join table.\n */\nconst sync = async (\n sourceEntries: VersionEntry[],\n targetEntries: VersionEntry[],\n relationData: RelationData[]\n) => {\n if (relationData.length === 0) return;\n\n const targetEntriesByLocale = keyBy('locale', targetEntries);\n\n // Keys stringified for object lookup; values keep the original DB type so PostgreSQL integer columns receive integers, not strings\n const idMapping = sourceEntries.reduce(\n (acc, sourceEntry) => {\n const targetEntry = targetEntriesByLocale[sourceEntry.locale];\n if (!targetEntry) return acc;\n acc[String(sourceEntry.id)] = targetEntry.id;\n return acc;\n },\n {} as Record<string, Data.ID>\n );\n\n const batchSize = strapi.db.dialect.getBatchInsertSize();\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const { joinTable, relations } of relationData) {\n const sourceColumn = joinTable.joinColumn.name;\n const targetColumn = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations\n .map((relation) => {\n const oldSourceId = String(relation[sourceColumn]);\n const oldTargetId = String(relation[targetColumn]);\n const newSourceId = idMapping[oldSourceId];\n const newTargetId = idMapping[oldTargetId];\n\n // Both sides must map to new entries\n if (!newSourceId || !newTargetId) return null;\n\n return {\n ...omit(strapi.db.metadata.identifiers.ID_COLUMN, relation),\n [sourceColumn]: newSourceId,\n [targetColumn]: newTargetId,\n };\n })\n .filter(Boolean) as Record<string, unknown>[];\n\n const pairKey = (r: Record<string, unknown>) =>\n `${String(r[sourceColumn])}:${String(r[targetColumn])}`;\n const seenPairs = new Set<string>();\n const deduped = newRelations.filter((r) => {\n const key = pairKey(r);\n if (seenPairs.has(key)) return false;\n seenPairs.add(key);\n return true;\n });\n\n if (deduped.length === 0) continue;\n\n const newSourceIds = [...new Set(deduped.map((r) => String(r[sourceColumn])))];\n const existingRows = await trx(joinTable.name)\n .whereIn(sourceColumn, newSourceIds)\n .select(sourceColumn, targetColumn);\n\n const existingSet = new Set(existingRows.map((r: Record<string, unknown>) => pairKey(r)));\n const toInsert = deduped.filter((r) => !existingSet.has(pairKey(r)));\n\n if (toInsert.length > 0) {\n await trx.batchInsert(joinTable.name, toInsert as any[], batchSize);\n }\n }\n });\n};\n\nexport { load, sync };\n"],"names":["load","uid","sourceEntries","updates","dbModel","strapi","db","metadata","get","transaction","trx","attribute","Object","values","attributes","type","target","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","sourceIds","map","entry","String","id","selfRelations","getConnection","select","from","whereIn","transacting","length","push","relations","sync","targetEntries","relationData","targetEntriesByLocale","keyBy","idMapping","reduce","acc","sourceEntry","targetEntry","locale","batchSize","dialect","getBatchInsertSize","sourceColumn","targetColumn","newRelations","relation","oldSourceId","oldTargetId","newSourceId","newTargetId","omit","identifiers","ID_COLUMN","filter","Boolean","pairKey","r","seenPairs","Set","deduped","key","has","add","newSourceIds","existingRows","existingSet","toInsert","batchInsert"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"self-referential-relations.mjs","sources":["../../../../src/services/document-service/utils/self-referential-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\nimport type { Data, UID } from '@strapi/types';\nimport type { Database, JoinTable } from '@strapi/database';\n\ninterface VersionEntry {\n id: Data.ID;\n locale: string;\n}\n\ninterface RelationData {\n joinTable: JoinTable;\n relations: Record<string, unknown>[];\n remap?: {\n source: boolean;\n target: boolean;\n };\n}\n\ntype TargetStatus = 'draft' | 'published';\ntype DatabaseQueryBuilder = ReturnType<Database['getConnection']>;\ntype DatabaseTransaction = Parameters<DatabaseQueryBuilder['transacting']>[0];\n\nconst entryKey = (entry: { document_id: unknown; locale: unknown }) =>\n `${String(entry.document_id)}:${String(entry.locale)}`;\n\nconst getCounterparts = async (\n trx: DatabaseTransaction,\n tableName: string,\n idsToResolve: unknown[],\n status: TargetStatus\n): Promise<Record<string, Data.ID>> => {\n const ids = [...new Set(idsToResolve.map((id) => String(id)))];\n\n if (ids.length === 0) {\n return {};\n }\n\n const drafts = await strapi.db\n .getConnection()\n .select('id', 'document_id', 'locale')\n .from(tableName)\n .whereIn('id', ids)\n .transacting(trx);\n\n if (drafts.length === 0) {\n return {};\n }\n\n const documentIds = [\n ...new Set(drafts.map((entry: { document_id: Data.ID }) => entry.document_id)),\n ];\n\n const counterpartsQuery = strapi.db\n .getConnection()\n .select('id', 'document_id', 'locale')\n .from(tableName)\n .whereIn('document_id', documentIds)\n .transacting(trx);\n\n const counterparts =\n status === 'published'\n ? await counterpartsQuery.whereNotNull('published_at')\n : await counterpartsQuery.whereNull('published_at');\n\n const counterpartByDocument = keyBy(entryKey, counterparts);\n\n return drafts.reduce(\n (\n acc: Record<string, Data.ID>,\n draft: { id: Data.ID; document_id: unknown; locale: unknown }\n ) => {\n const counterpart = counterpartByDocument[entryKey(draft)];\n\n if (counterpart) {\n acc[String(draft.id)] = counterpart.id;\n }\n\n return acc;\n },\n {}\n );\n};\n\n/**\n * Preserves self-referential relations during publish/discard operations.\n *\n * When publishing or discarding a draft, self-referential relations (where both sides\n * of the relation belong to the same content type) are lost because:\n *\n * 1. The old entry is deleted\n * 2. A new entry is created with relations resolved via documentId → entity ID mapping\n * 3. At mapping time, the old entity is already deleted and the new one doesn't exist yet\n * 4. The relation is silently dropped\n *\n * This utility:\n * 1. Captures self-referential join table rows before deletion\n * 2. Remaps old entity IDs to new entity IDs after creation\n * 3. Inserts the remapped relations\n */\n\n/**\n * Loads self-referential relations from source entries before they are deleted/recreated.\n */\nconst load = async (\n uid: UID.ContentType,\n sourceEntries: VersionEntry[],\n targetStatus: TargetStatus\n): Promise<RelationData[]> => {\n const updates: RelationData[] = [];\n const dbModel = strapi.db.metadata.get(uid);\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const attribute of Object.values(dbModel.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n // Bidirectional inverse side (e.g. `children` mappedBy `parent`) shares the same physical\n // join table as the owning attribute; processing both would duplicate rows and inserts.\n if (attribute.mappedBy) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n const sourceIds = sourceEntries.map((entry) => String(entry.id));\n\n // Load relations where both source and target are among the entries being processed.\n // These are the self-referential relations that would be lost during the\n // delete-and-recreate cycle.\n const selfRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(sourceColumnName, sourceIds)\n .whereIn(targetColumnName, sourceIds)\n .transacting(trx);\n\n if (selfRelations.length > 0) {\n updates.push({\n joinTable,\n relations: selfRelations,\n remap: { source: true, target: true },\n });\n }\n\n // Use rows from the state being copied as the source of truth for one-sided\n // self-relations. Publishing maps untouched targets to published counterparts and drops\n // draft-only targets; discarding maps untouched targets to draft counterparts. This avoids\n // restoring stale old rows that were removed from the copied state.\n const [sourceDraftRelations, targetDraftRelations] = await Promise.all([\n strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(sourceColumnName, sourceIds)\n .whereNotIn(targetColumnName, sourceIds)\n .transacting(trx),\n strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, sourceIds)\n .whereNotIn(sourceColumnName, sourceIds)\n .transacting(trx),\n ]);\n\n const [targetCounterparts, sourceCounterparts] = await Promise.all([\n getCounterparts(\n trx,\n dbModel.tableName,\n sourceDraftRelations.map((relation) => relation[targetColumnName]),\n targetStatus\n ),\n getCounterparts(\n trx,\n dbModel.tableName,\n targetDraftRelations.map((relation) => relation[sourceColumnName]),\n targetStatus\n ),\n ]);\n\n if (sourceDraftRelations.length > 0) {\n const relations = sourceDraftRelations\n .map((relation) => {\n const targetCounterpart = targetCounterparts[String(relation[targetColumnName])];\n\n if (targetCounterpart == null) {\n return null;\n }\n\n return { ...relation, [targetColumnName]: targetCounterpart };\n })\n .filter(Boolean) as Record<string, unknown>[];\n\n if (relations.length > 0) {\n updates.push({\n joinTable,\n relations,\n remap: { source: true, target: false },\n });\n }\n }\n\n if (targetDraftRelations.length > 0) {\n const relations = targetDraftRelations\n .map((relation) => {\n const sourceCounterpart = sourceCounterparts[String(relation[sourceColumnName])];\n\n if (sourceCounterpart == null) {\n return null;\n }\n\n return { ...relation, [sourceColumnName]: sourceCounterpart };\n })\n .filter(Boolean) as Record<string, unknown>[];\n\n if (relations.length > 0) {\n updates.push({\n joinTable,\n relations,\n remap: { source: false, target: true },\n });\n }\n }\n\n // One-sided rows from the replaced state are intentionally not restored here. The rows\n // captured above represent the current logical relation set; restoring stale old rows can\n // resurrect relations that were removed before publishing or discarding.\n }\n });\n\n return updates;\n};\n\n/**\n * Syncs self-referential relations by remapping old entry IDs to new entry IDs\n * and inserting the remapped relations into the join table.\n */\nconst sync = async (\n sourceEntries: VersionEntry[],\n targetEntries: VersionEntry[],\n relationData: RelationData[]\n) => {\n if (relationData.length === 0) return;\n\n const targetEntriesByLocale = keyBy('locale', targetEntries);\n\n // Keys stringified for object lookup; values keep the original DB type so PostgreSQL integer columns receive integers, not strings\n const idMapping = sourceEntries.reduce(\n (acc, sourceEntry) => {\n const targetEntry = targetEntriesByLocale[sourceEntry.locale];\n if (!targetEntry) return acc;\n acc[String(sourceEntry.id)] = targetEntry.id;\n return acc;\n },\n {} as Record<string, Data.ID>\n );\n\n const batchSize = strapi.db.dialect.getBatchInsertSize();\n\n await strapi.db.transaction(async ({ trx }) => {\n for (const { joinTable, relations, remap = { source: true, target: true } } of relationData) {\n const sourceColumn = joinTable.joinColumn.name;\n const targetColumn = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations\n .map((relation) => {\n const oldSourceId = String(relation[sourceColumn]);\n const oldTargetId = String(relation[targetColumn]);\n const newSourceId = remap.source ? idMapping[oldSourceId] : relation[sourceColumn];\n const newTargetId = remap.target ? idMapping[oldTargetId] : relation[targetColumn];\n\n // Any side being remapped must resolve to a new entry.\n if (newSourceId == null || newTargetId == null) return null;\n\n return {\n ...omit(strapi.db.metadata.identifiers.ID_COLUMN, relation),\n [sourceColumn]: newSourceId,\n [targetColumn]: newTargetId,\n };\n })\n .filter(Boolean) as Record<string, unknown>[];\n\n const pairKey = (r: Record<string, unknown>) =>\n `${String(r[sourceColumn])}:${String(r[targetColumn])}`;\n const seenPairs = new Set<string>();\n const deduped = newRelations.filter((r) => {\n const key = pairKey(r);\n if (seenPairs.has(key)) return false;\n seenPairs.add(key);\n return true;\n });\n\n if (deduped.length === 0) continue;\n\n // Relation writes may have already recreated the remapped pair. In that case restore\n // the saved join-row metadata (notably order columns) instead of inserting a duplicate.\n const newSourceIds = [...new Set(deduped.map((r) => String(r[sourceColumn])))];\n const existingRows = await trx(joinTable.name)\n .whereIn(sourceColumn, newSourceIds)\n .select(sourceColumn, targetColumn);\n\n const existingSet = new Set(existingRows.map((r: Record<string, unknown>) => pairKey(r)));\n const toUpdate = deduped.filter((r) => existingSet.has(pairKey(r)));\n const toInsert = deduped.filter((r) => !existingSet.has(pairKey(r)));\n\n await Promise.all(\n toUpdate.map((relation) => {\n const sourceId = relation[sourceColumn];\n const targetId = relation[targetColumn];\n const dataToRestore = Object.fromEntries(\n [joinTable.orderColumnName, joinTable.inverseOrderColumnName]\n .filter((columnName): columnName is string => columnName != null)\n .filter((columnName) => columnName in relation)\n .map((columnName) => [columnName, relation[columnName]])\n );\n\n if (Object.keys(dataToRestore).length === 0) {\n return Promise.resolve();\n }\n\n return trx(joinTable.name)\n .where({ [sourceColumn]: sourceId, [targetColumn]: targetId })\n .update(dataToRestore);\n })\n );\n\n if (toInsert.length > 0) {\n await trx.batchInsert(joinTable.name, toInsert as any[], batchSize);\n }\n }\n });\n};\n\nexport { load, sync };\n"],"names":["entryKey","entry","String","document_id","locale","getCounterparts","trx","tableName","idsToResolve","status","ids","Set","map","id","length","drafts","strapi","db","getConnection","select","from","whereIn","transacting","documentIds","counterpartsQuery","counterparts","whereNotNull","whereNull","counterpartByDocument","keyBy","reduce","acc","draft","counterpart","load","uid","sourceEntries","targetStatus","updates","dbModel","metadata","get","transaction","attribute","Object","values","attributes","type","target","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","sourceIds","selfRelations","push","relations","remap","source","sourceDraftRelations","targetDraftRelations","Promise","all","whereNotIn","targetCounterparts","sourceCounterparts","relation","targetCounterpart","filter","Boolean","sourceCounterpart","sync","targetEntries","relationData","targetEntriesByLocale","idMapping","sourceEntry","targetEntry","batchSize","dialect","getBatchInsertSize","sourceColumn","targetColumn","newRelations","oldSourceId","oldTargetId","newSourceId","newTargetId","omit","identifiers","ID_COLUMN","pairKey","r","seenPairs","deduped","key","has","add","newSourceIds","existingRows","existingSet","toUpdate","toInsert","sourceId","targetId","dataToRestore","fromEntries","orderColumnName","inverseOrderColumnName","columnName","keys","resolve","where","update","batchInsert"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAS,MAAM,eAAe,CAAC;AAE1D,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;IACxB,QAAQ,CACN,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,aAAa,GAAG;QAC7F,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GACA,IAAI,CAAC;CACT,CAAC;yBAuLc,KAAK;IACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,EAAE,EAAE,QAAQ,CAAC;CACd,KAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC;AAHpD,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAS,MAAM,eAAe,CAAC;AAE1D,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;IACxB,QAAQ,CACN,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,aAAa,GAAG;QAC7F,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GACA,IAAI,CAAC;CACT,CAAC;yBAuLc,KAAK;IACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,EAAE,EAAE,QAAQ,CAAC;CACd,KAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC;AAHpD,wBAuDE"}
|
|
@@ -221,7 +221,7 @@ var createEntityService = ((ctx)=>{
|
|
|
221
221
|
Object.keys(service.implementation).forEach((key)=>delegator.method(key));
|
|
222
222
|
// wrap methods to handle Database Errors
|
|
223
223
|
service.decorate((oldService)=>{
|
|
224
|
-
const newService = ___default.default.mapValues(oldService, (method, methodName)=>async function(...args) {
|
|
224
|
+
const newService = ___default.default.mapValues(oldService, (method, methodName)=>async function transformDatabaseErrors(...args) {
|
|
225
225
|
try {
|
|
226
226
|
return await oldService[methodName].call(this, ...args);
|
|
227
227
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function transformDatabaseErrors(\n this: Modules.EntityService.EntityService,\n ...args: []\n ) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","transformDatabaseErrors","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
@@ -214,7 +214,7 @@ var createEntityService = ((ctx)=>{
|
|
|
214
214
|
Object.keys(service.implementation).forEach((key)=>delegator.method(key));
|
|
215
215
|
// wrap methods to handle Database Errors
|
|
216
216
|
service.decorate((oldService)=>{
|
|
217
|
-
const newService = _.mapValues(oldService, (method, methodName)=>async function(...args) {
|
|
217
|
+
const newService = _.mapValues(oldService, (method, methodName)=>async function transformDatabaseErrors(...args) {
|
|
218
218
|
try {
|
|
219
219
|
return await oldService[methodName].call(this, ...args);
|
|
220
220
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne({\n ...wrappedParams,\n documentId: res.documentId,\n });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n documentId: entityToUpdate.documentId,\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete({\n ...wrappedParams,\n documentId: entityToDelete.documentId,\n });\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function transformDatabaseErrors(\n this: Modules.EntityService.EntityService,\n ...args: []\n ) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["transformLoadParamsToQuery","uid","field","params","pagination","query","strapi","get","transform","populate","res","databaseErrorsToTransform","databaseErrors","InvalidTimeError","InvalidDateTimeError","InvalidDateError","InvalidRelationError","createDefaultImplementation","db","wrapParams","options","wrapResult","result","findMany","opts","kind","getModel","wrappedParams","action","entity","documents","findFirst","entities","findPage","findOne","entityId","where","id","documentId","count","create","data","Error","shouldPublish","contentTypesUtils","isDraft","status","update","entityToUpdate","delete","entityToDelete","load","_","isString","loadedEntity","loadPages","attributes","attribute","relationUtils","isAnyToMany","loadedPage","results","ctx","implementation","service","decorate","decorator","delegator","delegate","Object","keys","forEach","key","method","oldService","newService","mapValues","methodName","transformDatabaseErrors","args","call","error","some","errorToTransform","errors","ValidationError","message"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/validators.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,GAAG,CAAC;AAE1C,MAAM,WAAW,cAAc,CAC7B,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAChF,MAAM,SAAS,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;IAEtF,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;IACrB,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;CACzC;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAidD,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAC7C,SAAS,gBAAgB,4FAa1B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAC3C,SAAS,gBAAgB,4FAa1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAA;CAAE,4FAIpF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAC7E,SAAS,gBAAgB,kFAS1B,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EACxE,SAAS,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/validators.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,GAAG,CAAC;AAE1C,MAAM,WAAW,cAAc,CAC7B,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAChF,MAAM,SAAS,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;IAEtF,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;IACrB,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;CACzC;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAidD,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAC7C,SAAS,gBAAgB,4FAa1B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAC3C,SAAS,gBAAgB,4FAa1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAA;CAAE,4FAIpF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAC7E,SAAS,gBAAgB,kFAS1B,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EACxE,SAAS,gBAAgB,kFAc1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAClD,SAAS,gBAAgB,uEAe1B,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAC7B,EACD,SAAS,gBAAgB,uEAI1B,CAAC;AAEF,eAAO,MAAM,UAAU;oBA3Hd,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,MAAM,GACvB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,KAAK,GACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CACvB,WACQ,gBAAgB;kBARlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,MAAM,GACvB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,KAAK,GACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CACvB,WACQ,gBAAgB;sBARlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,MAAM,GACvB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,KAAK,GACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CACvB,WACQ,gBAAgB;sBARlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,MAAM,GACvB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,KAAK,GACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CACvB,WACQ,gBAAgB;mBAalB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,WACpC,gBAAgB;4BAgCoB;QAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAA;KAAE;;iBAhB5E,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,WAClC,gBAAgB;;qBAsBlB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WACpE,gBAAgB;wBA8BlB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WACzC,gBAAgB;mBAnBlB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,WAC/D,gBAAgB;qBADlB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,WAC/D,gBAAgB;kBAoClB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAC7B,WACQ,gBAAgB;kBANlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAC7B,WACQ,gBAAgB;sBANlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAC7B,WACQ,gBAAgB;uBANlB,cAAc,CACjB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,GACzB,MAAM,CAAC,SAAS,CAAC,IAAI,GACrB,MAAM,CAAC,SAAS,CAAC,SAAS,CAC7B,WACQ,gBAAgB;;CAyB1B,CAAC"}
|
|
@@ -321,14 +321,16 @@ const integerValidator = (metas, options)=>{
|
|
|
321
321
|
return schema;
|
|
322
322
|
};
|
|
323
323
|
const floatValidator = (metas, options)=>{
|
|
324
|
-
let schema = strapiUtils.yup.number().test('is-finite-number',
|
|
324
|
+
let schema = strapiUtils.yup.number().test('is-finite-number', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolates validation path placeholders.
|
|
325
|
+
'${path} must be a finite number', (value)=>value == null || isValidFiniteNumber(value));
|
|
325
326
|
schema = addMinFloatValidator(schema, metas, options);
|
|
326
327
|
schema = addMaxFloatValidator(schema, metas);
|
|
327
328
|
schema = addUniqueValidator(schema, metas, options);
|
|
328
329
|
return schema;
|
|
329
330
|
};
|
|
330
331
|
const bigintegerValidator = (metas, options)=>{
|
|
331
|
-
const schema = strapiUtils.yup.mixed().transform((value, originalValue)=>toBigIntegerString(originalValue) ?? value)
|
|
332
|
+
const schema = strapiUtils.yup.mixed().transform((value, originalValue)=>toBigIntegerString(originalValue) ?? value)// eslint-disable-next-line no-template-curly-in-string -- Yup interpolates validation path placeholders.
|
|
333
|
+
.test('is-biginteger', '${path} must be a valid integer', (value)=>{
|
|
332
334
|
if (value == null) {
|
|
333
335
|
return true;
|
|
334
336
|
}
|