@webbycrown/webbycommerce 1.2.0 → 2.0.0
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 +26 -3
- package/admin/app.js +3 -0
- package/admin/jsconfig.json +20 -0
- package/admin/src/components/ApiCollectionsContent.jsx +4626 -0
- package/admin/src/components/CompareContent.jsx +300 -0
- package/admin/src/components/ConfigureContent.jsx +407 -0
- package/admin/src/components/Initializer.jsx +64 -0
- package/admin/src/components/LoginRegisterContent.jsx +280 -0
- package/admin/src/components/PluginIcon.jsx +6 -0
- package/admin/src/components/ShippingTypeContent.jsx +230 -0
- package/admin/src/components/SmtpContent.jsx +316 -0
- package/admin/src/components/WishlistContent.jsx +273 -0
- package/admin/src/index.js +81 -0
- package/admin/src/pages/ApiCollections.jsx +169 -0
- package/admin/src/pages/Configure.jsx +55 -0
- package/admin/src/pages/Settings.jsx +93 -0
- package/admin/src/pluginId.js +4 -0
- package/{dist/_chunks/en-CiQ97iC8.js → admin/src/translations/en.json} +712 -574
- package/bin/setup.js +50 -3
- package/package.json +14 -13
- package/server/bootstrap.js +3 -0
- package/server/register.js +3 -0
- package/server/src/bootstrap.js +3826 -0
- package/server/src/components/content-block.json +37 -0
- package/server/src/components/shipping-zone-location.json +27 -0
- package/server/src/config/index.js +7 -0
- package/server/src/content-types/address/index.js +7 -0
- package/server/src/content-types/address/schema.json +74 -0
- package/server/src/content-types/cart/index.js +61 -0
- package/server/src/content-types/cart-item/index.js +79 -0
- package/server/src/content-types/compare.js +73 -0
- package/server/src/content-types/coupon/index.js +7 -0
- package/server/src/content-types/coupon/schema.json +67 -0
- package/server/src/content-types/index.js +42 -0
- package/server/src/content-types/order/index.js +7 -0
- package/server/src/content-types/order/schema.json +121 -0
- package/server/src/content-types/payment-transaction/index.js +7 -0
- package/server/src/content-types/payment-transaction/schema.json +73 -0
- package/server/src/content-types/product/index.js +7 -0
- package/server/src/content-types/product/schema.json +104 -0
- package/server/src/content-types/product-attribute/index.js +7 -0
- package/server/src/content-types/product-attribute/schema.json +80 -0
- package/server/src/content-types/product-attribute-value/index.js +7 -0
- package/server/src/content-types/product-attribute-value/schema.json +52 -0
- package/server/src/content-types/product-category/index.js +7 -0
- package/server/src/content-types/product-category/schema.json +54 -0
- package/server/src/content-types/product-tag/index.js +7 -0
- package/server/src/content-types/product-tag/schema.json +38 -0
- package/server/src/content-types/product-variation/index.js +7 -0
- package/server/src/content-types/product-variation/schema.json +74 -0
- package/server/src/content-types/shipping-method/index.js +7 -0
- package/server/src/content-types/shipping-method/schema.json +91 -0
- package/server/src/content-types/shipping-rate/index.js +7 -0
- package/server/src/content-types/shipping-rate/schema.json +73 -0
- package/server/src/content-types/shipping-rule/index.js +7 -0
- package/server/src/content-types/shipping-rule/schema.json +84 -0
- package/server/src/content-types/shipping-zone/index.js +7 -0
- package/server/src/content-types/shipping-zone/schema.json +57 -0
- package/server/src/content-types/wishlist.js +66 -0
- package/server/src/controllers/address.js +374 -0
- package/server/src/controllers/auth.js +1409 -0
- package/server/src/controllers/cart.js +337 -0
- package/server/src/controllers/category.js +388 -0
- package/server/src/controllers/compare.js +246 -0
- package/server/src/controllers/controller.js +168 -0
- package/server/src/controllers/ecommerce.js +20 -0
- package/server/src/controllers/index.js +34 -0
- package/server/src/controllers/order.js +1100 -0
- package/server/src/controllers/payment.js +243 -0
- package/server/src/controllers/product.js +1006 -0
- package/server/src/controllers/productTag.js +370 -0
- package/server/src/controllers/productVariation.js +181 -0
- package/server/src/controllers/shipping.js +1046 -0
- package/server/src/controllers/wishlist.js +332 -0
- package/server/src/destroy.js +6 -0
- package/server/src/index.js +26 -0
- package/server/src/middlewares/index.js +4 -0
- package/server/src/policies/index.js +4 -0
- package/server/src/register.js +67 -0
- package/server/src/routes/index.js +1130 -0
- package/server/src/services/cart.js +531 -0
- package/server/src/services/compare.js +300 -0
- package/server/src/services/index.js +16 -0
- package/server/src/services/service.js +19 -0
- package/server/src/services/shipping.js +513 -0
- package/server/src/services/wishlist.js +238 -0
- package/server/src/utils/check-ecommerce-permission.js +204 -0
- package/server/src/utils/extend-user-schema.js +161 -0
- package/server/src/utils/seed-data.js +639 -0
- package/server/src/utils/send-email.js +98 -0
- package/strapi-server.js +1 -6
- package/dist/_chunks/Settings-DZXAkI24.js +0 -31539
- package/dist/_chunks/Settings-yLx-YvVy.mjs +0 -31520
- package/dist/_chunks/en-DE15m4xZ.mjs +0 -574
- package/dist/_chunks/index-CXGrFKp6.mjs +0 -128
- package/dist/_chunks/index-DgocXUgC.js +0 -127
- package/dist/admin/index.js +0 -3
- package/dist/admin/index.mjs +0 -4
- package/dist/robots.txt +0 -3
- package/dist/server/index.js +0 -27078
- package/dist/uploads/.gitkeep +0 -0
- package/dist/uploads/accessories_category_2a5631094b.jpeg +0 -0
- package/dist/uploads/beauty_personal_care_category_57f8a8f1e3.jpeg +0 -0
- package/dist/uploads/books_category_a9a253eada.jpeg +0 -0
- package/dist/uploads/classic_cotton_tshirt_1_cd713425f6.png +0 -0
- package/dist/uploads/clothing_category_d5c60ef07b.jpeg +0 -0
- package/dist/uploads/daviddoe_strapi_adbcd41787.jpeg +0 -0
- package/dist/uploads/electronics_category_fc3e5ef571.jpeg +0 -0
- package/dist/uploads/ergonomic_office_chair_1_c751cffb07.png +0 -0
- package/dist/uploads/home_garden_category_4f6eb3f8d6.jpeg +0 -0
- package/dist/uploads/istockphoto_1188462138_612x612_11f295b9c0.jpg +0 -0
- package/dist/uploads/istockphoto_1188462138_612x612_396fb272fd.jpg +0 -0
- package/dist/uploads/large_daviddoe_strapi_adbcd41787.jpeg +0 -0
- package/dist/uploads/leather_travel_backpack_1_238bc1ae4d.png +0 -0
- package/dist/uploads/mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
- package/dist/uploads/medium_classic_cotton_tshirt_1_cd713425f6.png +0 -0
- package/dist/uploads/medium_daviddoe_strapi_adbcd41787.jpeg +0 -0
- package/dist/uploads/medium_ergonomic_office_chair_1_c751cffb07.png +0 -0
- package/dist/uploads/medium_leather_travel_backpack_1_238bc1ae4d.png +0 -0
- package/dist/uploads/medium_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
- package/dist/uploads/medium_smart_watch_series_5_1_cdc2511fb7.png +0 -0
- package/dist/uploads/medium_smartphone_x_pro_1_c3f0cbd080.png +0 -0
- package/dist/uploads/medium_the_great_gatsby_special_1_2e7c76d997.png +0 -0
- package/dist/uploads/medium_wireless_headphones_1_fa75cd50c3.png +0 -0
- package/dist/uploads/medium_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
- package/dist/uploads/predictive_maintenance_icons_industry_automation_600nw_2685943461_e18a8aa3b0.webp +0 -0
- package/dist/uploads/small_classic_cotton_tshirt_1_cd713425f6.png +0 -0
- package/dist/uploads/small_daviddoe_strapi_adbcd41787.jpeg +0 -0
- package/dist/uploads/small_ergonomic_office_chair_1_c751cffb07.png +0 -0
- package/dist/uploads/small_leather_travel_backpack_1_238bc1ae4d.png +0 -0
- package/dist/uploads/small_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
- package/dist/uploads/small_smart_watch_series_5_1_cdc2511fb7.png +0 -0
- package/dist/uploads/small_smartphone_x_pro_1_c3f0cbd080.png +0 -0
- package/dist/uploads/small_the_great_gatsby_special_1_2e7c76d997.png +0 -0
- package/dist/uploads/small_wireless_headphones_1_fa75cd50c3.png +0 -0
- package/dist/uploads/small_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
- package/dist/uploads/smart_watch_series_5_1_cdc2511fb7.png +0 -0
- package/dist/uploads/smartphone_x_pro_1_c3f0cbd080.png +0 -0
- package/dist/uploads/the_great_gatsby_special_1_2e7c76d997.png +0 -0
- package/dist/uploads/thumbnail_accessories_category_2a5631094b.jpeg +0 -0
- package/dist/uploads/thumbnail_beauty_personal_care_category_57f8a8f1e3.jpeg +0 -0
- package/dist/uploads/thumbnail_books_category_a9a253eada.jpeg +0 -0
- package/dist/uploads/thumbnail_classic_cotton_tshirt_1_cd713425f6.png +0 -0
- package/dist/uploads/thumbnail_clothing_category_d5c60ef07b.jpeg +0 -0
- package/dist/uploads/thumbnail_daviddoe_strapi_adbcd41787.jpeg +0 -0
- package/dist/uploads/thumbnail_electronics_category_fc3e5ef571.jpeg +0 -0
- package/dist/uploads/thumbnail_ergonomic_office_chair_1_c751cffb07.png +0 -0
- package/dist/uploads/thumbnail_home_garden_category_4f6eb3f8d6.jpeg +0 -0
- package/dist/uploads/thumbnail_istockphoto_1188462138_612x612_11f295b9c0.jpg +0 -0
- package/dist/uploads/thumbnail_istockphoto_1188462138_612x612_396fb272fd.jpg +0 -0
- package/dist/uploads/thumbnail_leather_travel_backpack_1_238bc1ae4d.png +0 -0
- package/dist/uploads/thumbnail_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
- package/dist/uploads/thumbnail_predictive_maintenance_icons_industry_automation_600nw_2685943461_e18a8aa3b0.webp +0 -0
- package/dist/uploads/thumbnail_smart_watch_series_5_1_cdc2511fb7.png +0 -0
- package/dist/uploads/thumbnail_smartphone_x_pro_1_c3f0cbd080.png +0 -0
- package/dist/uploads/thumbnail_the_great_gatsby_special_1_2e7c76d997.png +0 -0
- package/dist/uploads/thumbnail_wireless_headphones_1_fa75cd50c3.png +0 -0
- package/dist/uploads/thumbnail_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
- package/dist/uploads/webby-commerce.png +0 -0
- package/dist/uploads/wireless_headphones_1_fa75cd50c3.png +0 -0
- package/dist/uploads/yoga_mat_premium_1_01f9a3b5fa.png +0 -0
- /package/{dist → server/src}/data/demo-data.json +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PLUGIN_ID = 'webbycommerce';
|
|
4
|
+
const SETTINGS_KEY = 'settings';
|
|
5
|
+
|
|
6
|
+
const getStore = () => {
|
|
7
|
+
return strapi.store({ type: 'plugin', name: PLUGIN_ID });
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const sanitizeOrigins = (input) => {
|
|
11
|
+
if (!Array.isArray(input)) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
return input
|
|
15
|
+
.map((value) => (typeof value === 'string' ? value.trim() : ''))
|
|
16
|
+
.filter((value) => value.length > 0);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
async health(ctx) {
|
|
21
|
+
strapi.log.info(`[${PLUGIN_ID}] Health endpoint called`);
|
|
22
|
+
ctx.body = {
|
|
23
|
+
status: 'ok',
|
|
24
|
+
plugin: PLUGIN_ID,
|
|
25
|
+
message: 'Ecommerce plugin is running',
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
async getSettings(ctx) {
|
|
31
|
+
const store = getStore();
|
|
32
|
+
const value = (await store.get({ key: SETTINGS_KEY })) || {};
|
|
33
|
+
const allowedOrigins = sanitizeOrigins(value.allowedOrigins);
|
|
34
|
+
const loginRegisterMethod = value.loginRegisterMethod || 'default';
|
|
35
|
+
const routePrefix = value.routePrefix || 'webbycommerce';
|
|
36
|
+
const smtp = value.smtp || null;
|
|
37
|
+
const shippingType = value.shippingType || 'single';
|
|
38
|
+
ctx.body = {
|
|
39
|
+
allowedOrigins,
|
|
40
|
+
loginRegisterMethod,
|
|
41
|
+
routePrefix,
|
|
42
|
+
smtp,
|
|
43
|
+
shippingType,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
async updateSettings(ctx) {
|
|
48
|
+
const store = getStore();
|
|
49
|
+
const body = ctx.request.body || {};
|
|
50
|
+
const currentValue = (await store.get({ key: SETTINGS_KEY })) || {};
|
|
51
|
+
|
|
52
|
+
// Merge allowedOrigins
|
|
53
|
+
const allowedOrigins =
|
|
54
|
+
body.allowedOrigins !== undefined
|
|
55
|
+
? sanitizeOrigins(body.allowedOrigins)
|
|
56
|
+
: sanitizeOrigins(currentValue.allowedOrigins);
|
|
57
|
+
|
|
58
|
+
// Merge loginRegisterMethod with validation
|
|
59
|
+
let loginRegisterMethod =
|
|
60
|
+
body.loginRegisterMethod !== undefined
|
|
61
|
+
? body.loginRegisterMethod
|
|
62
|
+
: currentValue.loginRegisterMethod || 'default';
|
|
63
|
+
|
|
64
|
+
if (loginRegisterMethod !== 'default' && loginRegisterMethod !== 'otp' && loginRegisterMethod !== 'both') {
|
|
65
|
+
return ctx.badRequest('Invalid loginRegisterMethod. Must be "default", "otp", or "both".');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Merge routePrefix with sanitization
|
|
69
|
+
let routePrefix =
|
|
70
|
+
body.routePrefix !== undefined
|
|
71
|
+
? body.routePrefix
|
|
72
|
+
: currentValue.routePrefix || 'webbycommerce';
|
|
73
|
+
|
|
74
|
+
// Sanitize route prefix
|
|
75
|
+
routePrefix = routePrefix
|
|
76
|
+
.trim()
|
|
77
|
+
.replace(/^\/+|\/+$/g, '') // Remove leading/trailing slashes
|
|
78
|
+
.replace(/\/+/g, '/') // Replace multiple slashes with single
|
|
79
|
+
.replace(/[^a-zA-Z0-9\/_-]/g, '') // Remove invalid characters
|
|
80
|
+
|| 'webbycommerce';
|
|
81
|
+
|
|
82
|
+
// Merge SMTP settings
|
|
83
|
+
const smtp = body.smtp !== undefined ? body.smtp : currentValue.smtp;
|
|
84
|
+
|
|
85
|
+
// Merge shippingType with validation
|
|
86
|
+
let shippingType =
|
|
87
|
+
body.shippingType !== undefined
|
|
88
|
+
? body.shippingType
|
|
89
|
+
: currentValue.shippingType || 'single';
|
|
90
|
+
|
|
91
|
+
if (shippingType !== 'single' && shippingType !== 'multiple') {
|
|
92
|
+
return ctx.badRequest('Invalid shippingType. Must be "single" or "multiple".');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const newValue = {
|
|
96
|
+
...currentValue,
|
|
97
|
+
allowedOrigins,
|
|
98
|
+
loginRegisterMethod,
|
|
99
|
+
routePrefix,
|
|
100
|
+
smtp,
|
|
101
|
+
shippingType,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
await store.set({
|
|
105
|
+
key: SETTINGS_KEY,
|
|
106
|
+
value: newValue,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
ctx.body = {
|
|
110
|
+
allowedOrigins,
|
|
111
|
+
loginRegisterMethod,
|
|
112
|
+
routePrefix,
|
|
113
|
+
smtp,
|
|
114
|
+
shippingType,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
async seedDemo(ctx) {
|
|
119
|
+
strapi.log.info(`[${PLUGIN_ID}] Seed demo data requested`);
|
|
120
|
+
try {
|
|
121
|
+
const result = await strapi
|
|
122
|
+
.plugin(PLUGIN_ID)
|
|
123
|
+
.service('service')
|
|
124
|
+
.seedDemoData();
|
|
125
|
+
|
|
126
|
+
ctx.body = result;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
strapi.log.error(`[${PLUGIN_ID}] Seed demo failed:`, error);
|
|
129
|
+
ctx.badRequest('Failed to seed demo data', { error: error.message });
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
async generateDemo(ctx) {
|
|
134
|
+
strapi.log.info(`[${PLUGIN_ID}] Demo data generation requested`);
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
const path = require('path');
|
|
138
|
+
// Use absolute path from project root for reliability
|
|
139
|
+
const demoScriptPath = path.join(strapi.dirs.app.root, 'scripts', 'demo-ecommerce-visual.js');
|
|
140
|
+
|
|
141
|
+
strapi.log.info(`[${PLUGIN_ID}] Loading demo script from: ${demoScriptPath}`);
|
|
142
|
+
|
|
143
|
+
// Import the demo script
|
|
144
|
+
const { createVisualDemo } = require(demoScriptPath);
|
|
145
|
+
|
|
146
|
+
if (typeof createVisualDemo !== 'function') {
|
|
147
|
+
throw new Error('createVisualDemo is not a function in the demo script');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Run the demo generation
|
|
151
|
+
const result = await createVisualDemo();
|
|
152
|
+
|
|
153
|
+
ctx.body = {
|
|
154
|
+
success: true,
|
|
155
|
+
message: 'Demo data generated successfully',
|
|
156
|
+
data: result
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
} catch (error) {
|
|
160
|
+
strapi.log.error(`[${PLUGIN_ID}] Demo generation failed:`, error);
|
|
161
|
+
ctx.badRequest('Failed to generate demo data', {
|
|
162
|
+
error: error.message,
|
|
163
|
+
details: error.stack
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This controller exists primarily so that Strapi's Users & Permissions plugin
|
|
5
|
+
* `syncPermissions()` can "see" the action:
|
|
6
|
+
* plugin::webbycommerce.ecommerce.enable
|
|
7
|
+
*
|
|
8
|
+
* Without a real controller action present in the codebase, `syncPermissions()`
|
|
9
|
+
* may delete the permission from the DB on restart (because it thinks it's stale),
|
|
10
|
+
* which makes the checkbox turn OFF again.
|
|
11
|
+
*
|
|
12
|
+
* We intentionally do not expose a public route for this action.
|
|
13
|
+
*/
|
|
14
|
+
module.exports = {
|
|
15
|
+
// No-op endpoint (not routed by default). Kept for permission discovery.
|
|
16
|
+
async enable(ctx) {
|
|
17
|
+
ctx.body = { ok: true };
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const controller = require('./controller');
|
|
4
|
+
const auth = require('./auth');
|
|
5
|
+
const address = require('./address');
|
|
6
|
+
const compare = require('./compare');
|
|
7
|
+
const order = require('./order');
|
|
8
|
+
const payment = require('./payment');
|
|
9
|
+
const product = require('./product');
|
|
10
|
+
const productTag = require('./productTag');
|
|
11
|
+
const productCategory = require('./category');
|
|
12
|
+
const productVariation = require('./productVariation');
|
|
13
|
+
const cart = require('./cart');
|
|
14
|
+
const wishlist = require('./wishlist');
|
|
15
|
+
const ecommerce = require('./ecommerce');
|
|
16
|
+
const shipping = require('./shipping');
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
controller,
|
|
20
|
+
auth,
|
|
21
|
+
address,
|
|
22
|
+
compare,
|
|
23
|
+
order,
|
|
24
|
+
payment,
|
|
25
|
+
product,
|
|
26
|
+
productTag,
|
|
27
|
+
productCategory,
|
|
28
|
+
productVariation,
|
|
29
|
+
cart,
|
|
30
|
+
wishlist,
|
|
31
|
+
ecommerce,
|
|
32
|
+
shipping,
|
|
33
|
+
};
|
|
34
|
+
|