@primershop/strapi-plugin-status-manager 0.0.14 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{components/StatusManager.js → HomePage-Bez9ZXv-.js} +49 -4
- package/dist/admin/{components/StatusManager.mjs → HomePage-Dx9N0awm.mjs} +49 -4
- package/dist/admin/index-BVybZ6IA.mjs +280 -0
- package/dist/admin/index-mATo7IeG.js +283 -0
- package/dist/admin/index.js +8 -45
- package/dist/admin/index.mjs +6 -47
- package/dist/server/index.js +747 -18
- package/dist/server/index.mjs +747 -18
- package/package.json +3 -3
- package/dist/admin/components/Initializer.js +0 -17
- package/dist/admin/components/Initializer.js.map +0 -1
- package/dist/admin/components/Initializer.mjs +0 -15
- package/dist/admin/components/Initializer.mjs.map +0 -1
- package/dist/admin/components/PluginIcon.js +0 -9
- package/dist/admin/components/PluginIcon.js.map +0 -1
- package/dist/admin/components/PluginIcon.mjs +0 -7
- package/dist/admin/components/PluginIcon.mjs.map +0 -1
- package/dist/admin/components/ProductStatusField.js +0 -104
- package/dist/admin/components/ProductStatusField.js.map +0 -1
- package/dist/admin/components/ProductStatusField.mjs +0 -102
- package/dist/admin/components/ProductStatusField.mjs.map +0 -1
- package/dist/admin/components/StatusManager.js.map +0 -1
- package/dist/admin/components/StatusManager.mjs.map +0 -1
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/index.mjs.map +0 -1
- package/dist/admin/listView/StatusFilter.js +0 -76
- package/dist/admin/listView/StatusFilter.js.map +0 -1
- package/dist/admin/listView/StatusFilter.mjs +0 -74
- package/dist/admin/listView/StatusFilter.mjs.map +0 -1
- package/dist/admin/listView/add-status-column-hook.js +0 -34
- package/dist/admin/listView/add-status-column-hook.js.map +0 -1
- package/dist/admin/listView/add-status-column-hook.mjs +0 -32
- package/dist/admin/listView/add-status-column-hook.mjs.map +0 -1
- package/dist/admin/listView/status-cell.js +0 -28
- package/dist/admin/listView/status-cell.js.map +0 -1
- package/dist/admin/listView/status-cell.mjs +0 -26
- package/dist/admin/listView/status-cell.mjs.map +0 -1
- package/dist/admin/pages/HomePage.js +0 -55
- package/dist/admin/pages/HomePage.js.map +0 -1
- package/dist/admin/pages/HomePage.mjs +0 -53
- package/dist/admin/pages/HomePage.mjs.map +0 -1
- package/dist/admin/permissions.js +0 -16
- package/dist/admin/permissions.js.map +0 -1
- package/dist/admin/permissions.mjs +0 -14
- package/dist/admin/permissions.mjs.map +0 -1
- package/dist/admin/pluginId.js +0 -6
- package/dist/admin/pluginId.js.map +0 -1
- package/dist/admin/pluginId.mjs +0 -4
- package/dist/admin/pluginId.mjs.map +0 -1
- package/dist/server/bootstrap.js +0 -35
- package/dist/server/bootstrap.js.map +0 -1
- package/dist/server/bootstrap.mjs +0 -33
- package/dist/server/bootstrap.mjs.map +0 -1
- package/dist/server/content-types/index.js +0 -16
- package/dist/server/content-types/index.js.map +0 -1
- package/dist/server/content-types/index.mjs +0 -14
- package/dist/server/content-types/index.mjs.map +0 -1
- package/dist/server/content-types/status-link.js +0 -43
- package/dist/server/content-types/status-link.js.map +0 -1
- package/dist/server/content-types/status-link.mjs +0 -41
- package/dist/server/content-types/status-link.mjs.map +0 -1
- package/dist/server/content-types/status.js +0 -50
- package/dist/server/content-types/status.js.map +0 -1
- package/dist/server/content-types/status.mjs +0 -48
- package/dist/server/content-types/status.mjs.map +0 -1
- package/dist/server/controllers/content.js +0 -33
- package/dist/server/controllers/content.js.map +0 -1
- package/dist/server/controllers/content.mjs +0 -31
- package/dist/server/controllers/content.mjs.map +0 -1
- package/dist/server/controllers/index.js +0 -12
- package/dist/server/controllers/index.js.map +0 -1
- package/dist/server/controllers/index.mjs +0 -10
- package/dist/server/controllers/index.mjs.map +0 -1
- package/dist/server/controllers/status.js +0 -106
- package/dist/server/controllers/status.js.map +0 -1
- package/dist/server/controllers/status.mjs +0 -104
- package/dist/server/controllers/status.mjs.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/index.mjs.map +0 -1
- package/dist/server/middlewares/add-status-field.js +0 -48
- package/dist/server/middlewares/add-status-field.js.map +0 -1
- package/dist/server/middlewares/add-status-field.mjs +0 -46
- package/dist/server/middlewares/add-status-field.mjs.map +0 -1
- package/dist/server/middlewares/filter-by-status.js +0 -42
- package/dist/server/middlewares/filter-by-status.js.map +0 -1
- package/dist/server/middlewares/filter-by-status.mjs +0 -40
- package/dist/server/middlewares/filter-by-status.mjs.map +0 -1
- package/dist/server/middlewares/filter-published.js +0 -35
- package/dist/server/middlewares/filter-published.js.map +0 -1
- package/dist/server/middlewares/filter-published.mjs +0 -33
- package/dist/server/middlewares/filter-published.mjs.map +0 -1
- package/dist/server/permissions.js +0 -51
- package/dist/server/permissions.js.map +0 -1
- package/dist/server/permissions.mjs +0 -49
- package/dist/server/permissions.mjs.map +0 -1
- package/dist/server/pluginId.js +0 -6
- package/dist/server/pluginId.js.map +0 -1
- package/dist/server/pluginId.mjs +0 -4
- package/dist/server/pluginId.mjs.map +0 -1
- package/dist/server/register.js +0 -20
- package/dist/server/register.js.map +0 -1
- package/dist/server/register.mjs +0 -18
- package/dist/server/register.mjs.map +0 -1
- package/dist/server/routes/content-management.js +0 -41
- package/dist/server/routes/content-management.js.map +0 -1
- package/dist/server/routes/content-management.mjs +0 -39
- package/dist/server/routes/content-management.mjs.map +0 -1
- package/dist/server/routes/index.js +0 -17
- package/dist/server/routes/index.js.map +0 -1
- package/dist/server/routes/index.mjs +0 -15
- package/dist/server/routes/index.mjs.map +0 -1
- package/dist/server/routes/status-management.js +0 -122
- package/dist/server/routes/status-management.js.map +0 -1
- package/dist/server/routes/status-management.mjs +0 -120
- package/dist/server/routes/status-management.mjs.map +0 -1
- package/dist/server/services/index.js +0 -12
- package/dist/server/services/index.js.map +0 -1
- package/dist/server/services/index.mjs +0 -10
- package/dist/server/services/index.mjs.map +0 -1
- package/dist/server/services/status-link.js +0 -38
- package/dist/server/services/status-link.js.map +0 -1
- package/dist/server/services/status-link.mjs +0 -36
- package/dist/server/services/status-link.mjs.map +0 -1
- package/dist/server/services/status.js +0 -110
- package/dist/server/services/status.js.map +0 -1
- package/dist/server/services/status.mjs +0 -108
- package/dist/server/services/status.mjs.map +0 -1
package/dist/server/index.js
CHANGED
|
@@ -1,23 +1,752 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
3
|
+
var utils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
var permissions = [
|
|
6
|
+
{
|
|
7
|
+
section: "plugins",
|
|
8
|
+
displayName: "Access Status Manager",
|
|
9
|
+
uid: "main",
|
|
10
|
+
pluginName: "primershop-status-manager"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
section: "plugins",
|
|
14
|
+
displayName: "Create",
|
|
15
|
+
uid: "status.create",
|
|
16
|
+
subCategory: "status",
|
|
17
|
+
pluginName: "primershop-status-manager"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
section: "plugins",
|
|
21
|
+
displayName: "Read",
|
|
22
|
+
uid: "status.read",
|
|
23
|
+
subCategory: "status",
|
|
24
|
+
pluginName: "primershop-status-manager",
|
|
25
|
+
aliases: [
|
|
26
|
+
{
|
|
27
|
+
actionId: "plugin::content-manager.explorer.read",
|
|
28
|
+
subjects: [
|
|
29
|
+
"plugin::primershop-status-manager.status"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
section: "plugins",
|
|
36
|
+
displayName: "Update",
|
|
37
|
+
uid: "status.update",
|
|
38
|
+
subCategory: "status",
|
|
39
|
+
pluginName: "primershop-status-manager"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
section: "plugins",
|
|
43
|
+
displayName: "Delete",
|
|
44
|
+
uid: "status.delete",
|
|
45
|
+
subCategory: "status",
|
|
46
|
+
pluginName: "primershop-status-manager"
|
|
47
|
+
}
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const bootstrap = async ({ strapi })=>{
|
|
51
|
+
try {
|
|
52
|
+
strapi.admin.services.permission.actionProvider.registerMany(permissions);
|
|
53
|
+
strapi.log.info(`[primershop-status-manager] Registered ${permissions.length} permission actions`);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
strapi.log.error("[primershop-status-manager] Failed to register permissions:", error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
// Register lifecycle hooks for status filtering
|
|
59
|
+
strapi.db?.lifecycles?.subscribe?.({
|
|
60
|
+
// catch all models
|
|
61
|
+
models: [
|
|
62
|
+
"*"
|
|
63
|
+
],
|
|
64
|
+
async afterDelete (event) {
|
|
65
|
+
const modelUid = event?.model?.uid;
|
|
66
|
+
const deleted = event?.result;
|
|
67
|
+
const documentId = deleted?.documentId;
|
|
68
|
+
if (!modelUid || !documentId) return;
|
|
69
|
+
await strapi.db.query("plugin::primershop-status-manager.status-link").deleteMany({
|
|
70
|
+
where: {
|
|
71
|
+
targetUid: modelUid,
|
|
72
|
+
targetDocumentId: documentId
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
var status$1 = {
|
|
80
|
+
kind: "collectionType",
|
|
81
|
+
collectionName: "status",
|
|
82
|
+
info: {
|
|
83
|
+
singularName: "status",
|
|
84
|
+
pluralName: "statuses",
|
|
85
|
+
displayName: "Status",
|
|
86
|
+
description: "Status for products"
|
|
87
|
+
},
|
|
88
|
+
options: {
|
|
89
|
+
draftAndPublish: false
|
|
90
|
+
},
|
|
91
|
+
pluginOptions: {
|
|
92
|
+
"content-manager": {
|
|
93
|
+
visible: false
|
|
94
|
+
},
|
|
95
|
+
"content-type-builder": {
|
|
96
|
+
visible: false
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
attributes: {
|
|
100
|
+
name: {
|
|
101
|
+
type: "string",
|
|
102
|
+
minLength: 1,
|
|
103
|
+
maxLength: 50,
|
|
104
|
+
required: true,
|
|
105
|
+
configurable: false
|
|
106
|
+
},
|
|
107
|
+
published: {
|
|
108
|
+
type: "boolean",
|
|
109
|
+
default: false
|
|
110
|
+
},
|
|
111
|
+
order: {
|
|
112
|
+
type: "integer",
|
|
113
|
+
default: 0
|
|
114
|
+
},
|
|
115
|
+
links: {
|
|
116
|
+
type: "relation",
|
|
117
|
+
relation: "oneToMany",
|
|
118
|
+
target: "plugin::primershop-status-manager.status-link",
|
|
119
|
+
mappedBy: "status",
|
|
120
|
+
configurable: false
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
var statusLink = {
|
|
126
|
+
kind: "collectionType",
|
|
127
|
+
collectionName: "status_links",
|
|
128
|
+
info: {
|
|
129
|
+
singularName: "status-link",
|
|
130
|
+
pluralName: "status-links",
|
|
131
|
+
displayName: "Status Link",
|
|
132
|
+
description: "Association between any content type document and a single status"
|
|
133
|
+
},
|
|
134
|
+
options: {
|
|
135
|
+
draftAndPublish: false
|
|
136
|
+
},
|
|
137
|
+
pluginOptions: {
|
|
138
|
+
"content-manager": {
|
|
139
|
+
visible: false
|
|
140
|
+
},
|
|
141
|
+
"content-type-builder": {
|
|
142
|
+
visible: false
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
attributes: {
|
|
146
|
+
targetUid: {
|
|
147
|
+
type: "string",
|
|
148
|
+
required: true
|
|
149
|
+
},
|
|
150
|
+
targetDocumentId: {
|
|
151
|
+
type: "string",
|
|
152
|
+
required: true
|
|
153
|
+
},
|
|
154
|
+
status: {
|
|
155
|
+
type: "relation",
|
|
156
|
+
relation: "manyToOne",
|
|
157
|
+
target: "plugin::primershop-status-manager.status",
|
|
158
|
+
required: false,
|
|
159
|
+
configurable: false
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
var contentTypes = {
|
|
165
|
+
status: {
|
|
166
|
+
schema: status$1
|
|
167
|
+
},
|
|
168
|
+
"status-link": {
|
|
169
|
+
schema: statusLink
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const content = ({ strapi })=>({
|
|
174
|
+
async getStatusForTarget (ctx) {
|
|
175
|
+
const requestParams = ctx.request.URL.searchParams;
|
|
176
|
+
const contentTypeUid = requestParams.get("contentTypeUid");
|
|
177
|
+
if (!strapi.getModel(contentTypeUid)) return ctx.notFound("Unknown contentTypeUid");
|
|
178
|
+
const contentDocumentId = requestParams.get("contentDocumentId");
|
|
179
|
+
const exists = await strapi.documents(contentTypeUid).findOne({
|
|
180
|
+
documentId: contentDocumentId
|
|
181
|
+
});
|
|
182
|
+
if (!exists) return ctx.notFound("Target document not found");
|
|
183
|
+
const link = await strapi.plugin("primershop-status-manager").service("statusLink").getForTarget(contentTypeUid, contentDocumentId);
|
|
184
|
+
return ctx.send({
|
|
185
|
+
status: link?.status ?? null
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
async setStatusForTarget (ctx) {
|
|
189
|
+
const { contentTypeUid, contentDocumentId, statusId } = ctx.request.body;
|
|
190
|
+
if (!strapi.getModel(contentTypeUid)) return ctx.notFound("Unknown contentTypeUid");
|
|
191
|
+
const exists = await strapi.documents(contentTypeUid).findOne({
|
|
192
|
+
documentId: contentDocumentId
|
|
193
|
+
});
|
|
194
|
+
if (!exists) return ctx.notFound("Target document not found");
|
|
195
|
+
const link = await strapi.plugin("primershop-status-manager").service("statusLink").setForTarget(contentTypeUid, contentDocumentId, statusId);
|
|
196
|
+
return ctx.send({
|
|
197
|
+
status: link.status
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const status = ({ strapi })=>({
|
|
203
|
+
async listStatuses (ctx) {
|
|
204
|
+
try {
|
|
205
|
+
const statuses = await strapi.documents("plugin::primershop-status-manager.status").findMany({
|
|
206
|
+
sort: {
|
|
207
|
+
order: "asc"
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return ctx.send(statuses);
|
|
211
|
+
} catch (err) {
|
|
212
|
+
console.error("❌ Status controller: find error:", err);
|
|
213
|
+
ctx.throw(500, err);
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
async create (ctx) {
|
|
217
|
+
try {
|
|
218
|
+
const { name, published = false } = ctx.request.body;
|
|
219
|
+
// Validate name (only Latin characters)
|
|
220
|
+
if (!/^[a-zA-Z\s]+$/.test(name)) {
|
|
221
|
+
return ctx.badRequest("Status name must contain only Latin characters.");
|
|
222
|
+
}
|
|
223
|
+
// Get the highest order value
|
|
224
|
+
const existingStatuses = await strapi.documents("plugin::primershop-status-manager.status").findMany({
|
|
225
|
+
orderBy: {
|
|
226
|
+
order: "desc"
|
|
227
|
+
},
|
|
228
|
+
limit: 1
|
|
229
|
+
});
|
|
230
|
+
const newOrder = existingStatuses.length > 0 ? existingStatuses[0].order + 1 : 0;
|
|
231
|
+
// Create status
|
|
232
|
+
const newStatus = await strapi.documents("plugin::primershop-status-manager.status").create({
|
|
233
|
+
data: {
|
|
234
|
+
name,
|
|
235
|
+
published,
|
|
236
|
+
order: newOrder
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return ctx.send(newStatus);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error("Status controller: create error:", error);
|
|
242
|
+
ctx.internalServerError(`Error adding status: ${error}`);
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
async reorder (ctx) {
|
|
246
|
+
try {
|
|
247
|
+
const { statuses } = ctx.request.body;
|
|
248
|
+
if (!Array.isArray(statuses)) {
|
|
249
|
+
return ctx.badRequest("Invalid data format");
|
|
250
|
+
}
|
|
251
|
+
// Update each status with new order
|
|
252
|
+
await Promise.all(statuses.map(({ documentId, order })=>strapi.documents("plugin::primershop-status-manager.status").update({
|
|
253
|
+
documentId,
|
|
254
|
+
data: {
|
|
255
|
+
order
|
|
256
|
+
}
|
|
257
|
+
})));
|
|
258
|
+
ctx.send({
|
|
259
|
+
message: "Order updated successfully"
|
|
260
|
+
});
|
|
261
|
+
} catch (error) {
|
|
262
|
+
console.error("Status controller: reorder error:", error);
|
|
263
|
+
ctx.internalServerError(`Error updating order: ${error}`);
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
async publish (ctx) {
|
|
267
|
+
try {
|
|
268
|
+
const { id } = ctx.params;
|
|
269
|
+
const { published } = ctx.request.body;
|
|
270
|
+
await strapi.documents("plugin::primershop-status-manager.status").update({
|
|
271
|
+
documentId: id,
|
|
272
|
+
data: {
|
|
273
|
+
published
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
ctx.send({
|
|
277
|
+
message: "Status updated successfully"
|
|
278
|
+
});
|
|
279
|
+
} catch (error) {
|
|
280
|
+
console.error("Status controller: publish error:", error);
|
|
281
|
+
ctx.internalServerError(`Error updating status: ${error}`);
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
async delete (ctx) {
|
|
285
|
+
try {
|
|
286
|
+
const { statusId } = ctx.request.body;
|
|
287
|
+
if (!statusId) {
|
|
288
|
+
return ctx.badRequest("Status ID is required.");
|
|
289
|
+
}
|
|
290
|
+
// Delete the status
|
|
291
|
+
await strapi.documents("plugin::primershop-status-manager.status").delete({
|
|
292
|
+
documentId: statusId
|
|
293
|
+
});
|
|
294
|
+
return ctx.send({
|
|
295
|
+
message: "Status deleted successfully"
|
|
296
|
+
});
|
|
297
|
+
} catch (error) {
|
|
298
|
+
console.error("Status controller: delete error:", error);
|
|
299
|
+
ctx.internalServerError(`Error deleting status: ${error}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
var controllers = {
|
|
305
|
+
status_controller: status,
|
|
306
|
+
content_controller: content
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
const PLUGIN_ID = "primershop-status-manager";
|
|
310
|
+
|
|
311
|
+
var addStatusField = (async (context, next)=>{
|
|
312
|
+
const uid = context.uid;
|
|
313
|
+
if (!uid.includes("api::")) {
|
|
314
|
+
return next();
|
|
315
|
+
}
|
|
316
|
+
const result = await next();
|
|
317
|
+
let documentIds = [];
|
|
318
|
+
if (Array.isArray(result)) {
|
|
319
|
+
documentIds = result.map((doc)=>doc.documentId).filter(Boolean);
|
|
320
|
+
} else if (result && typeof result === "object" && "documentId" in result) {
|
|
321
|
+
documentIds = [
|
|
322
|
+
result.documentId
|
|
323
|
+
].filter(Boolean);
|
|
324
|
+
}
|
|
325
|
+
if (documentIds.length === 0) {
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
const statusLinks = await strapi.db.query("plugin::primershop-status-manager.status-link").findMany({
|
|
330
|
+
populate: {
|
|
331
|
+
status: true
|
|
332
|
+
},
|
|
333
|
+
where: {
|
|
334
|
+
targetUid: uid,
|
|
335
|
+
targetDocumentId: {
|
|
336
|
+
$in: documentIds
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
if (Array.isArray(result)) {
|
|
341
|
+
result.forEach((doc)=>{
|
|
342
|
+
doc.statusField = statusLinks.find((link)=>link.targetDocumentId === doc.documentId)?.status || undefined;
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
if (result && typeof result === "object") {
|
|
346
|
+
result.statusField = statusLinks.find((link)=>link.targetDocumentId === result.documentId)?.status || undefined;
|
|
347
|
+
}
|
|
348
|
+
} catch (error) {
|
|
349
|
+
// If status enrichment fails, just return original result
|
|
350
|
+
console.error("primershop-status-manager: status enrichment error", error);
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
var filterByStatus = (async (context, next)=>{
|
|
356
|
+
const uid = context.uid;
|
|
357
|
+
if (!uid.includes("api::")) {
|
|
358
|
+
return next();
|
|
359
|
+
}
|
|
360
|
+
const paramKeys = Object.keys(context.params || {});
|
|
361
|
+
if (!paramKeys.includes("statusName")) {
|
|
362
|
+
return next();
|
|
363
|
+
}
|
|
364
|
+
const desiredStatus = context.params["statusName"];
|
|
365
|
+
if (!desiredStatus || desiredStatus === "all") return next();
|
|
366
|
+
const isValid = await strapi.plugin("primershop-status-manager").service("status").isValidStatus(desiredStatus);
|
|
367
|
+
if (!isValid) throw new utils.errors.ValidationError(`Invalid status: ${desiredStatus}`);
|
|
368
|
+
const status = await strapi.plugin("primershop-status-manager").service("status").getStatusByName(desiredStatus);
|
|
369
|
+
if (!status) {
|
|
370
|
+
throw new utils.errors.ValidationError(`Status not found: ${desiredStatus}`);
|
|
371
|
+
}
|
|
372
|
+
const statusLinks = await strapi.db.query("plugin::primershop-status-manager.status-link").findMany({
|
|
373
|
+
where: {
|
|
374
|
+
targetUid: uid,
|
|
375
|
+
status: status.id
|
|
376
|
+
},
|
|
377
|
+
select: [
|
|
378
|
+
"targetDocumentId"
|
|
379
|
+
]
|
|
380
|
+
});
|
|
381
|
+
const allowedDocumentIds = statusLinks.map((link)=>link.targetDocumentId);
|
|
382
|
+
context.params["filters"] = {
|
|
383
|
+
...context.params["filters"],
|
|
384
|
+
documentId: {
|
|
385
|
+
$in: allowedDocumentIds
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
return next();
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
var filterPublished = (async (context, next)=>{
|
|
392
|
+
const uid = context.uid;
|
|
393
|
+
if (!uid.includes("api::")) {
|
|
394
|
+
return next();
|
|
395
|
+
}
|
|
396
|
+
const params = context.params;
|
|
397
|
+
if (!params && !params["status"] || params["statusName"]) return next();
|
|
398
|
+
const unpublishedStatusLinks = await strapi.db.query("plugin::primershop-status-manager.status-link").findMany({
|
|
399
|
+
populate: {
|
|
400
|
+
status: true
|
|
401
|
+
},
|
|
402
|
+
where: {
|
|
403
|
+
targetUid: uid,
|
|
404
|
+
status: {
|
|
405
|
+
published: false
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
select: [
|
|
409
|
+
"targetDocumentId"
|
|
410
|
+
]
|
|
411
|
+
});
|
|
412
|
+
const unpublishedDocumentIds = unpublishedStatusLinks.map((link)=>link.targetDocumentId);
|
|
413
|
+
context.params["filters"] = {
|
|
414
|
+
...context.params["filters"],
|
|
415
|
+
documentId: {
|
|
416
|
+
$notIn: unpublishedDocumentIds
|
|
417
|
+
}
|
|
18
418
|
};
|
|
19
|
-
return
|
|
419
|
+
return next();
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
const register = ({ strapi })=>{
|
|
423
|
+
strapi.customFields.register({
|
|
424
|
+
name: "statusName",
|
|
425
|
+
plugin: PLUGIN_ID,
|
|
426
|
+
type: "string"
|
|
427
|
+
});
|
|
428
|
+
strapi.documents.use(filterByStatus);
|
|
429
|
+
strapi.documents.use(addStatusField);
|
|
430
|
+
strapi.documents.use(filterPublished);
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
var statusManagement = [
|
|
434
|
+
{
|
|
435
|
+
method: "GET",
|
|
436
|
+
path: "/statuses",
|
|
437
|
+
handler: "status_controller.listStatuses",
|
|
438
|
+
config: {
|
|
439
|
+
policies: [
|
|
440
|
+
{
|
|
441
|
+
name: "admin::hasPermissions",
|
|
442
|
+
config: {
|
|
443
|
+
actions: [
|
|
444
|
+
"plugin::primershop-status-manager.status.read"
|
|
445
|
+
]
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
},
|
|
450
|
+
description: "Get all statuses",
|
|
451
|
+
tag: {
|
|
452
|
+
plugin: "primershop-status-manager",
|
|
453
|
+
name: "statuses",
|
|
454
|
+
actionType: "findMany"
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
method: "POST",
|
|
459
|
+
path: "/status",
|
|
460
|
+
handler: "status_controller.create",
|
|
461
|
+
config: {
|
|
462
|
+
policies: [
|
|
463
|
+
{
|
|
464
|
+
name: "admin::hasPermissions",
|
|
465
|
+
config: {
|
|
466
|
+
actions: [
|
|
467
|
+
"plugin::primershop-status-manager.status.create"
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
]
|
|
472
|
+
},
|
|
473
|
+
description: "Create a new status",
|
|
474
|
+
tag: {
|
|
475
|
+
plugin: "primershop-status-manager",
|
|
476
|
+
name: "Status",
|
|
477
|
+
actionType: "create"
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
method: "PUT",
|
|
482
|
+
path: "/statuses/reorder",
|
|
483
|
+
handler: "status_controller.reorder",
|
|
484
|
+
config: {
|
|
485
|
+
policies: [
|
|
486
|
+
{
|
|
487
|
+
name: "admin::hasPermissions",
|
|
488
|
+
config: {
|
|
489
|
+
actions: [
|
|
490
|
+
"plugin::primershop-status-manager.status.update"
|
|
491
|
+
]
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
],
|
|
495
|
+
description: "Reorder statuses",
|
|
496
|
+
tag: {
|
|
497
|
+
plugin: "primershop-status-manager",
|
|
498
|
+
name: "Status",
|
|
499
|
+
actionType: "update"
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
method: "PUT",
|
|
505
|
+
path: "/statuses/delete",
|
|
506
|
+
handler: "status_controller.delete",
|
|
507
|
+
config: {
|
|
508
|
+
policies: [
|
|
509
|
+
{
|
|
510
|
+
name: "admin::hasPermissions",
|
|
511
|
+
config: {
|
|
512
|
+
actions: [
|
|
513
|
+
"plugin::primershop-status-manager.status.delete"
|
|
514
|
+
]
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
],
|
|
518
|
+
description: "Delete a status",
|
|
519
|
+
tag: {
|
|
520
|
+
plugin: "primershop-status-manager",
|
|
521
|
+
name: "Status",
|
|
522
|
+
actionType: "delete"
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
method: "PUT",
|
|
528
|
+
path: "/statuses/:id",
|
|
529
|
+
handler: "status_controller.publish",
|
|
530
|
+
config: {
|
|
531
|
+
policies: [
|
|
532
|
+
{
|
|
533
|
+
name: "admin::hasPermissions",
|
|
534
|
+
config: {
|
|
535
|
+
actions: [
|
|
536
|
+
"plugin::primershop-status-manager.status.update"
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
],
|
|
541
|
+
description: "Update status publish state",
|
|
542
|
+
tag: {
|
|
543
|
+
plugin: "primershop-status-manager",
|
|
544
|
+
name: "Status",
|
|
545
|
+
actionType: "update"
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
];
|
|
550
|
+
|
|
551
|
+
var contentManagement = [
|
|
552
|
+
{
|
|
553
|
+
method: "GET",
|
|
554
|
+
path: "/content-status",
|
|
555
|
+
handler: "content_controller.getStatusForTarget",
|
|
556
|
+
config: {
|
|
557
|
+
policies: [
|
|
558
|
+
{
|
|
559
|
+
name: "admin::hasPermissions",
|
|
560
|
+
config: {
|
|
561
|
+
actions: [
|
|
562
|
+
"plugin::primershop-status-manager.status.read"
|
|
563
|
+
]
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
]
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
method: "PUT",
|
|
571
|
+
path: "/content-status",
|
|
572
|
+
handler: "content_controller.setStatusForTarget",
|
|
573
|
+
config: {
|
|
574
|
+
policies: [
|
|
575
|
+
{
|
|
576
|
+
name: "admin::hasPermissions",
|
|
577
|
+
config: {
|
|
578
|
+
actions: [
|
|
579
|
+
"plugin::primershop-status-manager.status.update"
|
|
580
|
+
]
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
]
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
];
|
|
587
|
+
|
|
588
|
+
var routes = {
|
|
589
|
+
admin: {
|
|
590
|
+
type: "admin",
|
|
591
|
+
routes: [
|
|
592
|
+
...statusManagement,
|
|
593
|
+
...contentManagement
|
|
594
|
+
]
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
|
|
598
|
+
const statusService = ({ strapi })=>({
|
|
599
|
+
async isValidStatus (code) {
|
|
600
|
+
try {
|
|
601
|
+
const row = await strapi.db.query("plugin::primershop-status-manager.status").findOne({
|
|
602
|
+
where: {
|
|
603
|
+
name: code
|
|
604
|
+
},
|
|
605
|
+
select: [
|
|
606
|
+
"id"
|
|
607
|
+
]
|
|
608
|
+
});
|
|
609
|
+
return !!row;
|
|
610
|
+
} catch {
|
|
611
|
+
return false;
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
async getStatusByName (name) {
|
|
615
|
+
return strapi.db.query("plugin::primershop-status-manager.status").findOne({
|
|
616
|
+
where: {
|
|
617
|
+
name
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
},
|
|
621
|
+
isStatusEnabledFor (uid) {
|
|
622
|
+
return !!strapi.getModel(uid);
|
|
623
|
+
},
|
|
624
|
+
async find () {
|
|
625
|
+
const result = await strapi.db.query("plugin::primershop-status-manager.status").findMany({
|
|
626
|
+
orderBy: {
|
|
627
|
+
order: "asc"
|
|
628
|
+
}
|
|
629
|
+
});
|
|
630
|
+
return result;
|
|
631
|
+
},
|
|
632
|
+
async findOne (id) {
|
|
633
|
+
const result = await strapi.db.query("plugin::primershop-status-manager.status").findOne({
|
|
634
|
+
where: {
|
|
635
|
+
id
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
return result;
|
|
639
|
+
},
|
|
640
|
+
async createStatus (data) {
|
|
641
|
+
const result = await strapi.db.query("plugin::primershop-status-manager.status").create({
|
|
642
|
+
data: {
|
|
643
|
+
name: data.name,
|
|
644
|
+
published: data.published ?? false,
|
|
645
|
+
order: data.order ?? 0
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
return result;
|
|
649
|
+
},
|
|
650
|
+
async findProductsByStatus (statusId) {
|
|
651
|
+
return strapi.db.query("api::product.product").findMany({
|
|
652
|
+
where: {
|
|
653
|
+
status: statusId
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
},
|
|
657
|
+
async updateProductStatus (productId, statusId) {
|
|
658
|
+
return strapi.db.query("api::product.product").update({
|
|
659
|
+
where: {
|
|
660
|
+
id: productId
|
|
661
|
+
},
|
|
662
|
+
data: {
|
|
663
|
+
status: statusId
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
},
|
|
667
|
+
async delete (id) {
|
|
668
|
+
return strapi.db.query("plugin::primershop-status-manager.status").delete({
|
|
669
|
+
where: {
|
|
670
|
+
id
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
},
|
|
674
|
+
async deleteStatus (statusId, replacementId) {
|
|
675
|
+
// Find status by documentId
|
|
676
|
+
const status = await strapi.db.query("plugin::primershop-status-manager.status").findOne({
|
|
677
|
+
where: {
|
|
678
|
+
documentId: statusId
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
if (!status) {
|
|
682
|
+
throw new Error("Status not found");
|
|
683
|
+
}
|
|
684
|
+
if (replacementId) {
|
|
685
|
+
const replacementStatus = await strapi.db.query("plugin::primershop-status-manager.status").findOne({
|
|
686
|
+
where: {
|
|
687
|
+
documentId: replacementId
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
if (!replacementStatus) {
|
|
691
|
+
throw new Error("Replacement status not found");
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
// Delete the status
|
|
695
|
+
await strapi.db.query("plugin::primershop-status-manager.status").delete({
|
|
696
|
+
where: {
|
|
697
|
+
documentId: statusId
|
|
698
|
+
}
|
|
699
|
+
});
|
|
700
|
+
return true;
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
const statusLinkService = ({ strapi })=>({
|
|
705
|
+
async getForTarget (targetUid, targetDocumentId) {
|
|
706
|
+
const link = await strapi.db.query("plugin::primershop-status-manager.status-link").findOne({
|
|
707
|
+
where: {
|
|
708
|
+
targetUid,
|
|
709
|
+
targetDocumentId
|
|
710
|
+
},
|
|
711
|
+
populate: {
|
|
712
|
+
status: true
|
|
713
|
+
}
|
|
714
|
+
});
|
|
715
|
+
return link ?? null;
|
|
716
|
+
},
|
|
717
|
+
async setForTarget (targetUid, targetDocumentId, statusDocumentId) {
|
|
718
|
+
// Create status link
|
|
719
|
+
await strapi.db.query("plugin::primershop-status-manager.status-link").deleteMany({
|
|
720
|
+
where: {
|
|
721
|
+
targetUid,
|
|
722
|
+
targetDocumentId
|
|
723
|
+
}
|
|
724
|
+
});
|
|
725
|
+
const created = await strapi.documents("plugin::primershop-status-manager.status-link").create({
|
|
726
|
+
data: {
|
|
727
|
+
targetUid,
|
|
728
|
+
targetDocumentId,
|
|
729
|
+
status: {
|
|
730
|
+
set: statusDocumentId
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
return created;
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
var services = {
|
|
739
|
+
status: statusService,
|
|
740
|
+
statusLink: statusLinkService
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
var index = {
|
|
744
|
+
register,
|
|
745
|
+
controllers,
|
|
746
|
+
contentTypes,
|
|
747
|
+
routes,
|
|
748
|
+
services,
|
|
749
|
+
bootstrap
|
|
20
750
|
};
|
|
21
751
|
|
|
22
|
-
module.exports =
|
|
23
|
-
//# sourceMappingURL=index.js.map
|
|
752
|
+
module.exports = index;
|