@primershop/strapi-plugin-product-actions 0.0.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.
Files changed (83) hide show
  1. package/README.md +38 -0
  2. package/dist/admin/components/Initializer/index.js +17 -0
  3. package/dist/admin/components/Initializer/index.js.map +1 -0
  4. package/dist/admin/components/Initializer/index.mjs +15 -0
  5. package/dist/admin/components/Initializer/index.mjs.map +1 -0
  6. package/dist/admin/components/SeriesProductActions/index.js +229 -0
  7. package/dist/admin/components/SeriesProductActions/index.js.map +1 -0
  8. package/dist/admin/components/SeriesProductActions/index.mjs +227 -0
  9. package/dist/admin/components/SeriesProductActions/index.mjs.map +1 -0
  10. package/dist/admin/index.js +28 -0
  11. package/dist/admin/index.js.map +1 -0
  12. package/dist/admin/index.mjs +26 -0
  13. package/dist/admin/index.mjs.map +1 -0
  14. package/dist/admin/pluginId.js +6 -0
  15. package/dist/admin/pluginId.js.map +1 -0
  16. package/dist/admin/pluginId.mjs +4 -0
  17. package/dist/admin/pluginId.mjs.map +1 -0
  18. package/dist/admin/src/components/Initializer/index.js +13 -0
  19. package/dist/admin/src/components/SeriesProductActions/index.js +84 -0
  20. package/dist/admin/src/index.js +22 -0
  21. package/dist/admin/src/pluginId.js +1 -0
  22. package/dist/admin/src/translations/en.js +21 -0
  23. package/dist/admin/src/translations/index.js +1 -0
  24. package/dist/admin/translations/en.js +25 -0
  25. package/dist/admin/translations/en.js.map +1 -0
  26. package/dist/admin/translations/en.mjs +23 -0
  27. package/dist/admin/translations/en.mjs.map +1 -0
  28. package/dist/server/bootstrap.js +15 -0
  29. package/dist/server/bootstrap.js.map +1 -0
  30. package/dist/server/bootstrap.mjs +13 -0
  31. package/dist/server/bootstrap.mjs.map +1 -0
  32. package/dist/server/controllers/index.js +10 -0
  33. package/dist/server/controllers/index.js.map +1 -0
  34. package/dist/server/controllers/index.mjs +8 -0
  35. package/dist/server/controllers/index.mjs.map +1 -0
  36. package/dist/server/controllers/product-series.js +29 -0
  37. package/dist/server/controllers/product-series.js.map +1 -0
  38. package/dist/server/controllers/product-series.mjs +27 -0
  39. package/dist/server/controllers/product-series.mjs.map +1 -0
  40. package/dist/server/index.js +24 -0
  41. package/dist/server/index.js.map +1 -0
  42. package/dist/server/index.mjs +19 -0
  43. package/dist/server/index.mjs.map +1 -0
  44. package/dist/server/permissions.js +46 -0
  45. package/dist/server/permissions.js.map +1 -0
  46. package/dist/server/permissions.mjs +44 -0
  47. package/dist/server/permissions.mjs.map +1 -0
  48. package/dist/server/pluginId.js +6 -0
  49. package/dist/server/pluginId.js.map +1 -0
  50. package/dist/server/pluginId.mjs +4 -0
  51. package/dist/server/pluginId.mjs.map +1 -0
  52. package/dist/server/register.js +16 -0
  53. package/dist/server/register.js.map +1 -0
  54. package/dist/server/register.mjs +14 -0
  55. package/dist/server/register.mjs.map +1 -0
  56. package/dist/server/routes/admin.js +44 -0
  57. package/dist/server/routes/admin.js.map +1 -0
  58. package/dist/server/routes/admin.mjs +42 -0
  59. package/dist/server/routes/admin.mjs.map +1 -0
  60. package/dist/server/routes/index.js +10 -0
  61. package/dist/server/routes/index.js.map +1 -0
  62. package/dist/server/routes/index.mjs +8 -0
  63. package/dist/server/routes/index.mjs.map +1 -0
  64. package/dist/server/services/index.js +10 -0
  65. package/dist/server/services/index.js.map +1 -0
  66. package/dist/server/services/index.mjs +8 -0
  67. package/dist/server/services/index.mjs.map +1 -0
  68. package/dist/server/services/product-series.js +113 -0
  69. package/dist/server/services/product-series.js.map +1 -0
  70. package/dist/server/services/product-series.mjs +111 -0
  71. package/dist/server/services/product-series.mjs.map +1 -0
  72. package/dist/server/src/bootstrap.js +16 -0
  73. package/dist/server/src/controllers/index.js +10 -0
  74. package/dist/server/src/controllers/product-series.js +31 -0
  75. package/dist/server/src/index.js +20 -0
  76. package/dist/server/src/permissions.js +42 -0
  77. package/dist/server/src/pluginId.js +4 -0
  78. package/dist/server/src/register.js +14 -0
  79. package/dist/server/src/routes/admin.js +37 -0
  80. package/dist/server/src/routes/index.js +9 -0
  81. package/dist/server/src/services/index.js +7 -0
  82. package/dist/server/src/services/product-series.js +116 -0
  83. package/package.json +100 -0
@@ -0,0 +1,14 @@
1
+ import { PLUGIN_ID } from './pluginId.mjs';
2
+
3
+ const register = ({ strapi })=>{
4
+ // Register permissions
5
+ strapi.admin.services.permission.actionProvider.register({
6
+ section: "plugins",
7
+ displayName: "Product Actions",
8
+ uid: PLUGIN_ID,
9
+ pluginName: PLUGIN_ID
10
+ });
11
+ };
12
+
13
+ export { register };
14
+ //# sourceMappingURL=register.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { PLUGIN_ID } from \"./pluginId\";\r\nimport type { Core } from \"@strapi/strapi\";\r\n\r\nexport const register = ({ strapi }: { strapi: Core.Strapi }): void => {\r\n // Register permissions\r\n strapi.admin.services.permission.actionProvider.register({\r\n section: \"plugins\",\r\n displayName: \"Product Actions\",\r\n uid: PLUGIN_ID,\r\n pluginName: PLUGIN_ID,\r\n });\r\n};\r\n"],"names":["register","strapi","admin","services","permission","actionProvider","section","displayName","uid","PLUGIN_ID","pluginName"],"mappings":";;AAGO,MAAMA,QAAAA,GAAW,CAAC,EAAEC,MAAM,EAA2B,GAAA;;IAE1DA,MAAAA,CAAOC,KAAK,CAACC,QAAQ,CAACC,UAAU,CAACC,cAAc,CAACL,QAAQ,CAAC;QACvDM,OAAAA,EAAS,SAAA;QACTC,WAAAA,EAAa,iBAAA;QACbC,GAAAA,EAAKC,SAAAA;QACLC,UAAAA,EAAYD;AACd,KAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ var admin = {
4
+ type: "admin",
5
+ routes: [
6
+ {
7
+ method: "POST",
8
+ path: "/create-products",
9
+ handler: "productSeries.createProducts",
10
+ config: {
11
+ policies: [
12
+ {
13
+ name: "admin::hasPermissions",
14
+ config: {
15
+ actions: [
16
+ "plugin::primershop-product-actions.product-series.create"
17
+ ]
18
+ }
19
+ }
20
+ ]
21
+ }
22
+ },
23
+ {
24
+ method: "PUT",
25
+ path: "/update-products",
26
+ handler: "productSeries.updateProducts",
27
+ config: {
28
+ policies: [
29
+ {
30
+ name: "admin::hasPermissions",
31
+ config: {
32
+ actions: [
33
+ "plugin::primershop-product-actions.product-series.update"
34
+ ]
35
+ }
36
+ }
37
+ ]
38
+ }
39
+ }
40
+ ]
41
+ };
42
+
43
+ module.exports = admin;
44
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\r\n type: \"admin\",\r\n routes: [\r\n {\r\n method: \"POST\",\r\n path: \"/create-products\",\r\n handler: \"productSeries.createProducts\",\r\n config: {\r\n policies: [\r\n {\r\n name: \"admin::hasPermissions\",\r\n config: {\r\n actions: [\r\n \"plugin::primershop-product-actions.product-series.create\",\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n method: \"PUT\",\r\n path: \"/update-products\",\r\n handler: \"productSeries.updateProducts\",\r\n config: {\r\n policies: [\r\n {\r\n name: \"admin::hasPermissions\",\r\n config: {\r\n actions: [\r\n \"plugin::primershop-product-actions.product-series.update\",\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n ],\r\n};\r\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":";;AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,kBAAA;YACNC,OAAAA,EAAS,8BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA;wBACEC,IAAAA,EAAM,uBAAA;wBACNF,MAAAA,EAAQ;4BACNG,OAAAA,EAAS;AACP,gCAAA;AACD;AACH;AACF;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,kBAAA;YACNC,OAAAA,EAAS,8BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA;wBACEC,IAAAA,EAAM,uBAAA;wBACNF,MAAAA,EAAQ;4BACNG,OAAAA,EAAS;AACP,gCAAA;AACD;AACH;AACF;AACD;AACH;AACF;AACD;AACH,CAAA;;;;"}
@@ -0,0 +1,42 @@
1
+ var admin = {
2
+ type: "admin",
3
+ routes: [
4
+ {
5
+ method: "POST",
6
+ path: "/create-products",
7
+ handler: "productSeries.createProducts",
8
+ config: {
9
+ policies: [
10
+ {
11
+ name: "admin::hasPermissions",
12
+ config: {
13
+ actions: [
14
+ "plugin::primershop-product-actions.product-series.create"
15
+ ]
16
+ }
17
+ }
18
+ ]
19
+ }
20
+ },
21
+ {
22
+ method: "PUT",
23
+ path: "/update-products",
24
+ handler: "productSeries.updateProducts",
25
+ config: {
26
+ policies: [
27
+ {
28
+ name: "admin::hasPermissions",
29
+ config: {
30
+ actions: [
31
+ "plugin::primershop-product-actions.product-series.update"
32
+ ]
33
+ }
34
+ }
35
+ ]
36
+ }
37
+ }
38
+ ]
39
+ };
40
+
41
+ export { admin as default };
42
+ //# sourceMappingURL=admin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\r\n type: \"admin\",\r\n routes: [\r\n {\r\n method: \"POST\",\r\n path: \"/create-products\",\r\n handler: \"productSeries.createProducts\",\r\n config: {\r\n policies: [\r\n {\r\n name: \"admin::hasPermissions\",\r\n config: {\r\n actions: [\r\n \"plugin::primershop-product-actions.product-series.create\",\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n method: \"PUT\",\r\n path: \"/update-products\",\r\n handler: \"productSeries.updateProducts\",\r\n config: {\r\n policies: [\r\n {\r\n name: \"admin::hasPermissions\",\r\n config: {\r\n actions: [\r\n \"plugin::primershop-product-actions.product-series.update\",\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n ],\r\n};\r\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,kBAAA;YACNC,OAAAA,EAAS,8BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA;wBACEC,IAAAA,EAAM,uBAAA;wBACNF,MAAAA,EAAQ;4BACNG,OAAAA,EAAS;AACP,gCAAA;AACD;AACH;AACF;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,kBAAA;YACNC,OAAAA,EAAS,8BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA;wBACEC,IAAAA,EAAM,uBAAA;wBACNF,MAAAA,EAAQ;4BACNG,OAAAA,EAAS;AACP,gCAAA;AACD;AACH;AACF;AACD;AACH;AACF;AACD;AACH,CAAA;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var admin = require('./admin.js');
4
+
5
+ const routes = {
6
+ admin
7
+ };
8
+
9
+ exports.routes = routes;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from \"./admin\";\r\n\r\nconst routes = { admin };\r\n\r\nexport { routes };\r\n"],"names":["routes","admin"],"mappings":";;;;AAEA,MAAMA,MAAAA,GAAS;AAAEC,IAAAA;AAAM;;;;"}
@@ -0,0 +1,8 @@
1
+ import admin from './admin.mjs';
2
+
3
+ const routes = {
4
+ admin
5
+ };
6
+
7
+ export { routes };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from \"./admin\";\r\n\r\nconst routes = { admin };\r\n\r\nexport { routes };\r\n"],"names":["routes","admin"],"mappings":";;AAEA,MAAMA,MAAAA,GAAS;AAAEC,IAAAA;AAAM;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var productSeries = require('./product-series.js');
4
+
5
+ const services = {
6
+ productSeries: productSeries.productSeriesService
7
+ };
8
+
9
+ exports.services = services;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import { productSeriesService } from \"./product-series\";\r\n\r\nexport const services = {\r\n productSeries: productSeriesService,\r\n};\r\n"],"names":["services","productSeries","productSeriesService"],"mappings":";;;;MAEaA,QAAAA,GAAW;IACtBC,aAAAA,EAAeC;AACjB;;;;"}
@@ -0,0 +1,8 @@
1
+ import { productSeriesService } from './product-series.mjs';
2
+
3
+ const services = {
4
+ productSeries: productSeriesService
5
+ };
6
+
7
+ export { services };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import { productSeriesService } from \"./product-series\";\r\n\r\nexport const services = {\r\n productSeries: productSeriesService,\r\n};\r\n"],"names":["services","productSeries","productSeriesService"],"mappings":";;MAEaA,QAAAA,GAAW;IACtBC,aAAAA,EAAeC;AACjB;;;;"}
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ const productSeriesService = ({ strapi })=>({
4
+ async createProductsFromSeries (seriesId, count = 1) {
5
+ const series = await getSeries(strapi, seriesId);
6
+ const products = [];
7
+ const startIndex = series.products?.length || 0;
8
+ for(let i = 0; i < count; i++){
9
+ const index = startIndex + i;
10
+ // Create product with series data
11
+ const product = await strapi.documents("api::product.product").create({
12
+ data: {
13
+ name: `${series.name} #${index + 1}`,
14
+ slug: `${series.slug}-${index + 1}`,
15
+ series: {
16
+ set: seriesId
17
+ },
18
+ seriesIndex: index,
19
+ category: series.category ? {
20
+ set: series.category.documentId
21
+ } : null,
22
+ creator: series.creator ? {
23
+ set: series.creator?.documentId
24
+ } : null,
25
+ publishedAt: undefined,
26
+ // Copy all required fields from series
27
+ description: series.description,
28
+ shortDescription: series.shortDescription,
29
+ media: series.media,
30
+ coverImage: series.coverImage,
31
+ seo: series.seo,
32
+ totalCost: series.totalCost,
33
+ wholesalePrice: series.wholesalePrice,
34
+ retailPrice: series.retailPrice
35
+ }
36
+ });
37
+ products.push(product);
38
+ }
39
+ return products;
40
+ },
41
+ async updateSeriesProducts (seriesId, fieldsToUpdate) {
42
+ const series = await getSeries(strapi, seriesId);
43
+ const dataToUpdate = {};
44
+ if (fieldsToUpdate.includes("description")) {
45
+ dataToUpdate.description = series.description;
46
+ }
47
+ if (fieldsToUpdate.includes("shortDescription")) {
48
+ dataToUpdate.shortDescription = series.shortDescription;
49
+ }
50
+ if (fieldsToUpdate.includes("media")) {
51
+ dataToUpdate.media = series.media;
52
+ }
53
+ if (fieldsToUpdate.includes("coverImage")) {
54
+ dataToUpdate.coverImage = series.coverImage;
55
+ }
56
+ if (fieldsToUpdate.includes("seo")) {
57
+ dataToUpdate.seo = series.seo;
58
+ }
59
+ if (fieldsToUpdate.includes("totalCost")) {
60
+ dataToUpdate.totalCost = series.totalCost;
61
+ }
62
+ if (fieldsToUpdate.includes("wholesalePrice")) {
63
+ dataToUpdate.wholesalePrice = series.wholesalePrice;
64
+ }
65
+ if (fieldsToUpdate.includes("retailPrice")) {
66
+ dataToUpdate.retailPrice = series.retailPrice;
67
+ }
68
+ if (fieldsToUpdate.includes("category")) {
69
+ dataToUpdate.category = {
70
+ set: [
71
+ series.category?.documentId
72
+ ]
73
+ };
74
+ }
75
+ if (fieldsToUpdate.includes("creator")) {
76
+ dataToUpdate.creator = {
77
+ set: [
78
+ series.creator?.documentId
79
+ ]
80
+ };
81
+ }
82
+ const updatePromises = series.products?.map((product)=>strapi.documents("api::product.product").update({
83
+ documentId: product.documentId,
84
+ data: {
85
+ ...dataToUpdate
86
+ }
87
+ }));
88
+ if (updatePromises) {
89
+ await Promise.all(updatePromises);
90
+ }
91
+ return true;
92
+ }
93
+ });
94
+ async function getSeries(strapi, seriesId) {
95
+ const series = await strapi.documents("api::product-series.product-series").findOne({
96
+ documentId: seriesId,
97
+ populate: [
98
+ "products",
99
+ "category",
100
+ "creator",
101
+ "media",
102
+ "coverImage",
103
+ "seo"
104
+ ]
105
+ });
106
+ if (!series) {
107
+ throw new Error("Series not found");
108
+ }
109
+ return series;
110
+ }
111
+
112
+ exports.productSeriesService = productSeriesService;
113
+ //# sourceMappingURL=product-series.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-series.js","sources":["../../../server/src/services/product-series.ts"],"sourcesContent":["import type { Core } from \"@strapi/strapi\";\r\n\r\ninterface Series {\r\n name: string;\r\n slug: string;\r\n products?: Array<{ documentId: string }>;\r\n category?: { documentId: string };\r\n creator?: { documentId: string };\r\n description: unknown;\r\n shortDescription: string;\r\n media: unknown;\r\n coverImage: unknown;\r\n seo: unknown;\r\n totalCost: number;\r\n wholesalePrice: number;\r\n retailPrice: number;\r\n}\r\n\r\ninterface ProductData {\r\n name: string;\r\n slug: string;\r\n series: { set: string };\r\n seriesIndex: number;\r\n category: { set: string };\r\n creator: { set: string };\r\n publishedAt: undefined;\r\n description: unknown;\r\n shortDescription: string;\r\n media: unknown;\r\n coverImage: unknown;\r\n seo: unknown;\r\n totalCost: number;\r\n wholesalePrice: number;\r\n retailPrice: number;\r\n}\r\n\r\nexport const productSeriesService = ({ strapi }: { strapi: Core.Strapi }) => ({\r\n async createProductsFromSeries(seriesId: string, count = 1) {\r\n const series = await getSeries(strapi, seriesId);\r\n\r\n const products: unknown[] = [];\r\n const startIndex = series.products?.length || 0;\r\n\r\n for (let i = 0; i < count; i++) {\r\n const index = startIndex + i;\r\n\r\n // Create product with series data\r\n const product = await strapi.documents(\"api::product.product\").create({\r\n data: {\r\n name: `${series.name} #${index + 1}`,\r\n slug: `${series.slug}-${index + 1}`,\r\n series: {\r\n set: seriesId,\r\n },\r\n seriesIndex: index,\r\n category: series.category\r\n ? {\r\n set: series.category.documentId,\r\n }\r\n : null,\r\n creator: series.creator\r\n ? {\r\n set: series.creator?.documentId,\r\n }\r\n : null,\r\n publishedAt: undefined,\r\n // Copy all required fields from series\r\n description: series.description,\r\n shortDescription: series.shortDescription,\r\n media: series.media,\r\n coverImage: series.coverImage,\r\n seo: series.seo,\r\n totalCost: series.totalCost,\r\n wholesalePrice: series.wholesalePrice,\r\n retailPrice: series.retailPrice,\r\n } as ProductData,\r\n });\r\n products.push(product);\r\n }\r\n\r\n return products;\r\n },\r\n\r\n async updateSeriesProducts(seriesId: string, fieldsToUpdate: string[]) {\r\n const series = await getSeries(strapi, seriesId);\r\n\r\n const dataToUpdate: Record<string, unknown> = {};\r\n\r\n if (fieldsToUpdate.includes(\"description\")) {\r\n dataToUpdate.description = series.description;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"shortDescription\")) {\r\n dataToUpdate.shortDescription = series.shortDescription;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"media\")) {\r\n dataToUpdate.media = series.media;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"coverImage\")) {\r\n dataToUpdate.coverImage = series.coverImage;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"seo\")) {\r\n dataToUpdate.seo = series.seo;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"totalCost\")) {\r\n dataToUpdate.totalCost = series.totalCost;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"wholesalePrice\")) {\r\n dataToUpdate.wholesalePrice = series.wholesalePrice;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"retailPrice\")) {\r\n dataToUpdate.retailPrice = series.retailPrice;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"category\")) {\r\n dataToUpdate.category = {\r\n set: [series.category?.documentId],\r\n };\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"creator\")) {\r\n dataToUpdate.creator = {\r\n set: [series.creator?.documentId],\r\n };\r\n }\r\n\r\n const updatePromises = series.products?.map((product) =>\r\n strapi.documents(\"api::product.product\").update({\r\n documentId: product.documentId,\r\n data: {\r\n ...dataToUpdate,\r\n },\r\n }),\r\n );\r\n\r\n if (updatePromises) {\r\n await Promise.all(updatePromises);\r\n }\r\n return true;\r\n },\r\n});\r\n\r\nasync function getSeries(\r\n strapi: Core.Strapi,\r\n seriesId: string,\r\n): Promise<Series> {\r\n const series = await strapi\r\n .documents(\"api::product-series.product-series\")\r\n .findOne({\r\n documentId: seriesId,\r\n populate: [\r\n \"products\",\r\n \"category\",\r\n \"creator\",\r\n \"media\",\r\n \"coverImage\",\r\n \"seo\",\r\n ],\r\n });\r\n\r\n if (!series) {\r\n throw new Error(\"Series not found\");\r\n }\r\n return series as unknown as Series;\r\n}\r\n"],"names":["productSeriesService","strapi","createProductsFromSeries","seriesId","count","series","getSeries","products","startIndex","length","i","index","product","documents","create","data","name","slug","set","seriesIndex","category","documentId","creator","publishedAt","undefined","description","shortDescription","media","coverImage","seo","totalCost","wholesalePrice","retailPrice","push","updateSeriesProducts","fieldsToUpdate","dataToUpdate","includes","updatePromises","map","update","Promise","all","findOne","populate","Error"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ const productSeriesService = ({ strapi })=>({
2
+ async createProductsFromSeries (seriesId, count = 1) {
3
+ const series = await getSeries(strapi, seriesId);
4
+ const products = [];
5
+ const startIndex = series.products?.length || 0;
6
+ for(let i = 0; i < count; i++){
7
+ const index = startIndex + i;
8
+ // Create product with series data
9
+ const product = await strapi.documents("api::product.product").create({
10
+ data: {
11
+ name: `${series.name} #${index + 1}`,
12
+ slug: `${series.slug}-${index + 1}`,
13
+ series: {
14
+ set: seriesId
15
+ },
16
+ seriesIndex: index,
17
+ category: series.category ? {
18
+ set: series.category.documentId
19
+ } : null,
20
+ creator: series.creator ? {
21
+ set: series.creator?.documentId
22
+ } : null,
23
+ publishedAt: undefined,
24
+ // Copy all required fields from series
25
+ description: series.description,
26
+ shortDescription: series.shortDescription,
27
+ media: series.media,
28
+ coverImage: series.coverImage,
29
+ seo: series.seo,
30
+ totalCost: series.totalCost,
31
+ wholesalePrice: series.wholesalePrice,
32
+ retailPrice: series.retailPrice
33
+ }
34
+ });
35
+ products.push(product);
36
+ }
37
+ return products;
38
+ },
39
+ async updateSeriesProducts (seriesId, fieldsToUpdate) {
40
+ const series = await getSeries(strapi, seriesId);
41
+ const dataToUpdate = {};
42
+ if (fieldsToUpdate.includes("description")) {
43
+ dataToUpdate.description = series.description;
44
+ }
45
+ if (fieldsToUpdate.includes("shortDescription")) {
46
+ dataToUpdate.shortDescription = series.shortDescription;
47
+ }
48
+ if (fieldsToUpdate.includes("media")) {
49
+ dataToUpdate.media = series.media;
50
+ }
51
+ if (fieldsToUpdate.includes("coverImage")) {
52
+ dataToUpdate.coverImage = series.coverImage;
53
+ }
54
+ if (fieldsToUpdate.includes("seo")) {
55
+ dataToUpdate.seo = series.seo;
56
+ }
57
+ if (fieldsToUpdate.includes("totalCost")) {
58
+ dataToUpdate.totalCost = series.totalCost;
59
+ }
60
+ if (fieldsToUpdate.includes("wholesalePrice")) {
61
+ dataToUpdate.wholesalePrice = series.wholesalePrice;
62
+ }
63
+ if (fieldsToUpdate.includes("retailPrice")) {
64
+ dataToUpdate.retailPrice = series.retailPrice;
65
+ }
66
+ if (fieldsToUpdate.includes("category")) {
67
+ dataToUpdate.category = {
68
+ set: [
69
+ series.category?.documentId
70
+ ]
71
+ };
72
+ }
73
+ if (fieldsToUpdate.includes("creator")) {
74
+ dataToUpdate.creator = {
75
+ set: [
76
+ series.creator?.documentId
77
+ ]
78
+ };
79
+ }
80
+ const updatePromises = series.products?.map((product)=>strapi.documents("api::product.product").update({
81
+ documentId: product.documentId,
82
+ data: {
83
+ ...dataToUpdate
84
+ }
85
+ }));
86
+ if (updatePromises) {
87
+ await Promise.all(updatePromises);
88
+ }
89
+ return true;
90
+ }
91
+ });
92
+ async function getSeries(strapi, seriesId) {
93
+ const series = await strapi.documents("api::product-series.product-series").findOne({
94
+ documentId: seriesId,
95
+ populate: [
96
+ "products",
97
+ "category",
98
+ "creator",
99
+ "media",
100
+ "coverImage",
101
+ "seo"
102
+ ]
103
+ });
104
+ if (!series) {
105
+ throw new Error("Series not found");
106
+ }
107
+ return series;
108
+ }
109
+
110
+ export { productSeriesService };
111
+ //# sourceMappingURL=product-series.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-series.mjs","sources":["../../../server/src/services/product-series.ts"],"sourcesContent":["import type { Core } from \"@strapi/strapi\";\r\n\r\ninterface Series {\r\n name: string;\r\n slug: string;\r\n products?: Array<{ documentId: string }>;\r\n category?: { documentId: string };\r\n creator?: { documentId: string };\r\n description: unknown;\r\n shortDescription: string;\r\n media: unknown;\r\n coverImage: unknown;\r\n seo: unknown;\r\n totalCost: number;\r\n wholesalePrice: number;\r\n retailPrice: number;\r\n}\r\n\r\ninterface ProductData {\r\n name: string;\r\n slug: string;\r\n series: { set: string };\r\n seriesIndex: number;\r\n category: { set: string };\r\n creator: { set: string };\r\n publishedAt: undefined;\r\n description: unknown;\r\n shortDescription: string;\r\n media: unknown;\r\n coverImage: unknown;\r\n seo: unknown;\r\n totalCost: number;\r\n wholesalePrice: number;\r\n retailPrice: number;\r\n}\r\n\r\nexport const productSeriesService = ({ strapi }: { strapi: Core.Strapi }) => ({\r\n async createProductsFromSeries(seriesId: string, count = 1) {\r\n const series = await getSeries(strapi, seriesId);\r\n\r\n const products: unknown[] = [];\r\n const startIndex = series.products?.length || 0;\r\n\r\n for (let i = 0; i < count; i++) {\r\n const index = startIndex + i;\r\n\r\n // Create product with series data\r\n const product = await strapi.documents(\"api::product.product\").create({\r\n data: {\r\n name: `${series.name} #${index + 1}`,\r\n slug: `${series.slug}-${index + 1}`,\r\n series: {\r\n set: seriesId,\r\n },\r\n seriesIndex: index,\r\n category: series.category\r\n ? {\r\n set: series.category.documentId,\r\n }\r\n : null,\r\n creator: series.creator\r\n ? {\r\n set: series.creator?.documentId,\r\n }\r\n : null,\r\n publishedAt: undefined,\r\n // Copy all required fields from series\r\n description: series.description,\r\n shortDescription: series.shortDescription,\r\n media: series.media,\r\n coverImage: series.coverImage,\r\n seo: series.seo,\r\n totalCost: series.totalCost,\r\n wholesalePrice: series.wholesalePrice,\r\n retailPrice: series.retailPrice,\r\n } as ProductData,\r\n });\r\n products.push(product);\r\n }\r\n\r\n return products;\r\n },\r\n\r\n async updateSeriesProducts(seriesId: string, fieldsToUpdate: string[]) {\r\n const series = await getSeries(strapi, seriesId);\r\n\r\n const dataToUpdate: Record<string, unknown> = {};\r\n\r\n if (fieldsToUpdate.includes(\"description\")) {\r\n dataToUpdate.description = series.description;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"shortDescription\")) {\r\n dataToUpdate.shortDescription = series.shortDescription;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"media\")) {\r\n dataToUpdate.media = series.media;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"coverImage\")) {\r\n dataToUpdate.coverImage = series.coverImage;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"seo\")) {\r\n dataToUpdate.seo = series.seo;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"totalCost\")) {\r\n dataToUpdate.totalCost = series.totalCost;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"wholesalePrice\")) {\r\n dataToUpdate.wholesalePrice = series.wholesalePrice;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"retailPrice\")) {\r\n dataToUpdate.retailPrice = series.retailPrice;\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"category\")) {\r\n dataToUpdate.category = {\r\n set: [series.category?.documentId],\r\n };\r\n }\r\n\r\n if (fieldsToUpdate.includes(\"creator\")) {\r\n dataToUpdate.creator = {\r\n set: [series.creator?.documentId],\r\n };\r\n }\r\n\r\n const updatePromises = series.products?.map((product) =>\r\n strapi.documents(\"api::product.product\").update({\r\n documentId: product.documentId,\r\n data: {\r\n ...dataToUpdate,\r\n },\r\n }),\r\n );\r\n\r\n if (updatePromises) {\r\n await Promise.all(updatePromises);\r\n }\r\n return true;\r\n },\r\n});\r\n\r\nasync function getSeries(\r\n strapi: Core.Strapi,\r\n seriesId: string,\r\n): Promise<Series> {\r\n const series = await strapi\r\n .documents(\"api::product-series.product-series\")\r\n .findOne({\r\n documentId: seriesId,\r\n populate: [\r\n \"products\",\r\n \"category\",\r\n \"creator\",\r\n \"media\",\r\n \"coverImage\",\r\n \"seo\",\r\n ],\r\n });\r\n\r\n if (!series) {\r\n throw new Error(\"Series not found\");\r\n }\r\n return series as unknown as Series;\r\n}\r\n"],"names":["productSeriesService","strapi","createProductsFromSeries","seriesId","count","series","getSeries","products","startIndex","length","i","index","product","documents","create","data","name","slug","set","seriesIndex","category","documentId","creator","publishedAt","undefined","description","shortDescription","media","coverImage","seo","totalCost","wholesalePrice","retailPrice","push","updateSeriesProducts","fieldsToUpdate","dataToUpdate","includes","updatePromises","map","update","Promise","all","findOne","populate","Error"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bootstrap = void 0;
4
+ const permissions_1 = require("./permissions");
5
+ const bootstrap = async ({ strapi }) => {
6
+ // Register permissions for the plugin
7
+ try {
8
+ await strapi
9
+ .service("admin::permission")
10
+ .actionProvider.registerMany(permissions_1.permissions.actions);
11
+ }
12
+ catch (error) {
13
+ // Handle error silently or log to proper logging service
14
+ }
15
+ };
16
+ exports.bootstrap = bootstrap;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.controllers = void 0;
7
+ const product_series_1 = __importDefault(require("./product-series"));
8
+ exports.controllers = {
9
+ productSeries: product_series_1.default,
10
+ };
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const productSeries = ({ strapi, }) => ({
4
+ async createProducts(ctx) {
5
+ try {
6
+ const { id, count = 1 } = ctx.request.body;
7
+ const products = await strapi
8
+ .plugin("primer-product-actions")
9
+ .service("productSeries")
10
+ .createProductsFromSeries(id, count);
11
+ return { data: products };
12
+ }
13
+ catch (error) {
14
+ ctx.throw(500, error);
15
+ }
16
+ },
17
+ async updateProducts(ctx) {
18
+ try {
19
+ const { seriesId, fieldsToUpdate } = ctx.request.body;
20
+ await strapi
21
+ .plugin("primer-product-actions")
22
+ .service("productSeries")
23
+ .updateSeriesProducts(seriesId, fieldsToUpdate);
24
+ return { success: true };
25
+ }
26
+ catch (error) {
27
+ ctx.throw(500, error);
28
+ }
29
+ },
30
+ });
31
+ exports.default = productSeries;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.plugin = void 0;
4
+ const controllers_1 = require("./controllers");
5
+ const routes_1 = require("./routes");
6
+ const services_1 = require("./services");
7
+ const register_1 = require("./register");
8
+ const bootstrap_1 = require("./bootstrap");
9
+ const plugin = () => {
10
+ return {
11
+ register: register_1.register,
12
+ controllers: controllers_1.controllers,
13
+ routes: routes_1.routes,
14
+ services: services_1.services,
15
+ middlewares: {},
16
+ bootstrap: bootstrap_1.bootstrap,
17
+ };
18
+ };
19
+ exports.plugin = plugin;
20
+ exports.default = exports.plugin;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.permissions = void 0;
4
+ exports.permissions = {
5
+ actions: [
6
+ {
7
+ // Roles
8
+ section: "plugins",
9
+ displayName: "Create",
10
+ uid: "product-series.create",
11
+ subCategory: "product-series",
12
+ pluginName: "primer-product-actions",
13
+ },
14
+ {
15
+ section: "plugins",
16
+ displayName: "Read",
17
+ uid: "product-series.read",
18
+ subCategory: "product-series",
19
+ pluginName: "primer-product-actions",
20
+ aliases: [
21
+ {
22
+ actionId: "plugin::content-manager.explorer.read",
23
+ subjects: ["api::product-series.product-series"],
24
+ },
25
+ ],
26
+ },
27
+ {
28
+ section: "plugins",
29
+ displayName: "Update",
30
+ uid: "product-series.update",
31
+ subCategory: "product-series",
32
+ pluginName: "primer-product-actions",
33
+ },
34
+ {
35
+ section: "plugins",
36
+ displayName: "Delete",
37
+ uid: "product-series.delete",
38
+ subCategory: "product-series",
39
+ pluginName: "primer-product-actions",
40
+ },
41
+ ],
42
+ };
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLUGIN_ID = void 0;
4
+ exports.PLUGIN_ID = "primer-product-actions";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.register = void 0;
4
+ const pluginId_1 = require("./pluginId");
5
+ const register = ({ strapi }) => {
6
+ // Register permissions
7
+ strapi.admin.services.permission.actionProvider.register({
8
+ section: "plugins",
9
+ displayName: "Product Actions",
10
+ uid: pluginId_1.PLUGIN_ID,
11
+ pluginName: pluginId_1.PLUGIN_ID,
12
+ });
13
+ };
14
+ exports.register = register;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ type: "admin",
5
+ routes: [
6
+ {
7
+ method: "POST",
8
+ path: "/create-products",
9
+ handler: "productSeries.createProducts",
10
+ config: {
11
+ policies: [
12
+ {
13
+ name: "admin::hasPermissions",
14
+ config: {
15
+ actions: ["plugin::primer-product-actions.product-series.create"],
16
+ },
17
+ },
18
+ ],
19
+ },
20
+ },
21
+ {
22
+ method: "PUT",
23
+ path: "/update-products",
24
+ handler: "productSeries.updateProducts",
25
+ config: {
26
+ policies: [
27
+ {
28
+ name: "admin::hasPermissions",
29
+ config: {
30
+ actions: ["plugin::primer-product-actions.product-series.update"],
31
+ },
32
+ },
33
+ ],
34
+ },
35
+ },
36
+ ],
37
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.routes = void 0;
7
+ const admin_1 = __importDefault(require("./admin"));
8
+ const routes = { admin: admin_1.default };
9
+ exports.routes = routes;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.services = void 0;
4
+ const product_series_1 = require("./product-series");
5
+ exports.services = {
6
+ productSeries: product_series_1.productSeriesService,
7
+ };