@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.
- package/README.md +38 -0
- package/dist/admin/components/Initializer/index.js +17 -0
- package/dist/admin/components/Initializer/index.js.map +1 -0
- package/dist/admin/components/Initializer/index.mjs +15 -0
- package/dist/admin/components/Initializer/index.mjs.map +1 -0
- package/dist/admin/components/SeriesProductActions/index.js +229 -0
- package/dist/admin/components/SeriesProductActions/index.js.map +1 -0
- package/dist/admin/components/SeriesProductActions/index.mjs +227 -0
- package/dist/admin/components/SeriesProductActions/index.mjs.map +1 -0
- package/dist/admin/index.js +28 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/index.mjs +26 -0
- package/dist/admin/index.mjs.map +1 -0
- package/dist/admin/pluginId.js +6 -0
- package/dist/admin/pluginId.js.map +1 -0
- package/dist/admin/pluginId.mjs +4 -0
- package/dist/admin/pluginId.mjs.map +1 -0
- package/dist/admin/src/components/Initializer/index.js +13 -0
- package/dist/admin/src/components/SeriesProductActions/index.js +84 -0
- package/dist/admin/src/index.js +22 -0
- package/dist/admin/src/pluginId.js +1 -0
- package/dist/admin/src/translations/en.js +21 -0
- package/dist/admin/src/translations/index.js +1 -0
- package/dist/admin/translations/en.js +25 -0
- package/dist/admin/translations/en.js.map +1 -0
- package/dist/admin/translations/en.mjs +23 -0
- package/dist/admin/translations/en.mjs.map +1 -0
- package/dist/server/bootstrap.js +15 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/bootstrap.mjs +13 -0
- package/dist/server/bootstrap.mjs.map +1 -0
- package/dist/server/controllers/index.js +10 -0
- package/dist/server/controllers/index.js.map +1 -0
- package/dist/server/controllers/index.mjs +8 -0
- package/dist/server/controllers/index.mjs.map +1 -0
- package/dist/server/controllers/product-series.js +29 -0
- package/dist/server/controllers/product-series.js.map +1 -0
- package/dist/server/controllers/product-series.mjs +27 -0
- package/dist/server/controllers/product-series.mjs.map +1 -0
- package/dist/server/index.js +24 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +19 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/permissions.js +46 -0
- package/dist/server/permissions.js.map +1 -0
- package/dist/server/permissions.mjs +44 -0
- package/dist/server/permissions.mjs.map +1 -0
- package/dist/server/pluginId.js +6 -0
- package/dist/server/pluginId.js.map +1 -0
- package/dist/server/pluginId.mjs +4 -0
- package/dist/server/pluginId.mjs.map +1 -0
- package/dist/server/register.js +16 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +14 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/routes/admin.js +44 -0
- package/dist/server/routes/admin.js.map +1 -0
- package/dist/server/routes/admin.mjs +42 -0
- package/dist/server/routes/admin.mjs.map +1 -0
- package/dist/server/routes/index.js +10 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/index.mjs +8 -0
- package/dist/server/routes/index.mjs.map +1 -0
- package/dist/server/services/index.js +10 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/index.mjs +8 -0
- package/dist/server/services/index.mjs.map +1 -0
- package/dist/server/services/product-series.js +113 -0
- package/dist/server/services/product-series.js.map +1 -0
- package/dist/server/services/product-series.mjs +111 -0
- package/dist/server/services/product-series.mjs.map +1 -0
- package/dist/server/src/bootstrap.js +16 -0
- package/dist/server/src/controllers/index.js +10 -0
- package/dist/server/src/controllers/product-series.js +31 -0
- package/dist/server/src/index.js +20 -0
- package/dist/server/src/permissions.js +42 -0
- package/dist/server/src/pluginId.js +4 -0
- package/dist/server/src/register.js +14 -0
- package/dist/server/src/routes/admin.js +37 -0
- package/dist/server/src/routes/index.js +9 -0
- package/dist/server/src/services/index.js +7 -0
- package/dist/server/src/services/product-series.js +116 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,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;
|