@primershop/strapi-plugin-status-manager 0.0.15 → 0.0.17

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