@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.
Files changed (162) hide show
  1. package/README.md +26 -3
  2. package/admin/app.js +3 -0
  3. package/admin/jsconfig.json +20 -0
  4. package/admin/src/components/ApiCollectionsContent.jsx +4626 -0
  5. package/admin/src/components/CompareContent.jsx +300 -0
  6. package/admin/src/components/ConfigureContent.jsx +407 -0
  7. package/admin/src/components/Initializer.jsx +64 -0
  8. package/admin/src/components/LoginRegisterContent.jsx +280 -0
  9. package/admin/src/components/PluginIcon.jsx +6 -0
  10. package/admin/src/components/ShippingTypeContent.jsx +230 -0
  11. package/admin/src/components/SmtpContent.jsx +316 -0
  12. package/admin/src/components/WishlistContent.jsx +273 -0
  13. package/admin/src/index.js +81 -0
  14. package/admin/src/pages/ApiCollections.jsx +169 -0
  15. package/admin/src/pages/Configure.jsx +55 -0
  16. package/admin/src/pages/Settings.jsx +93 -0
  17. package/admin/src/pluginId.js +4 -0
  18. package/{dist/_chunks/en-CiQ97iC8.js → admin/src/translations/en.json} +712 -574
  19. package/bin/setup.js +50 -3
  20. package/package.json +14 -13
  21. package/server/bootstrap.js +3 -0
  22. package/server/register.js +3 -0
  23. package/server/src/bootstrap.js +3826 -0
  24. package/server/src/components/content-block.json +37 -0
  25. package/server/src/components/shipping-zone-location.json +27 -0
  26. package/server/src/config/index.js +7 -0
  27. package/server/src/content-types/address/index.js +7 -0
  28. package/server/src/content-types/address/schema.json +74 -0
  29. package/server/src/content-types/cart/index.js +61 -0
  30. package/server/src/content-types/cart-item/index.js +79 -0
  31. package/server/src/content-types/compare.js +73 -0
  32. package/server/src/content-types/coupon/index.js +7 -0
  33. package/server/src/content-types/coupon/schema.json +67 -0
  34. package/server/src/content-types/index.js +42 -0
  35. package/server/src/content-types/order/index.js +7 -0
  36. package/server/src/content-types/order/schema.json +121 -0
  37. package/server/src/content-types/payment-transaction/index.js +7 -0
  38. package/server/src/content-types/payment-transaction/schema.json +73 -0
  39. package/server/src/content-types/product/index.js +7 -0
  40. package/server/src/content-types/product/schema.json +104 -0
  41. package/server/src/content-types/product-attribute/index.js +7 -0
  42. package/server/src/content-types/product-attribute/schema.json +80 -0
  43. package/server/src/content-types/product-attribute-value/index.js +7 -0
  44. package/server/src/content-types/product-attribute-value/schema.json +52 -0
  45. package/server/src/content-types/product-category/index.js +7 -0
  46. package/server/src/content-types/product-category/schema.json +54 -0
  47. package/server/src/content-types/product-tag/index.js +7 -0
  48. package/server/src/content-types/product-tag/schema.json +38 -0
  49. package/server/src/content-types/product-variation/index.js +7 -0
  50. package/server/src/content-types/product-variation/schema.json +74 -0
  51. package/server/src/content-types/shipping-method/index.js +7 -0
  52. package/server/src/content-types/shipping-method/schema.json +91 -0
  53. package/server/src/content-types/shipping-rate/index.js +7 -0
  54. package/server/src/content-types/shipping-rate/schema.json +73 -0
  55. package/server/src/content-types/shipping-rule/index.js +7 -0
  56. package/server/src/content-types/shipping-rule/schema.json +84 -0
  57. package/server/src/content-types/shipping-zone/index.js +7 -0
  58. package/server/src/content-types/shipping-zone/schema.json +57 -0
  59. package/server/src/content-types/wishlist.js +66 -0
  60. package/server/src/controllers/address.js +374 -0
  61. package/server/src/controllers/auth.js +1409 -0
  62. package/server/src/controllers/cart.js +337 -0
  63. package/server/src/controllers/category.js +388 -0
  64. package/server/src/controllers/compare.js +246 -0
  65. package/server/src/controllers/controller.js +168 -0
  66. package/server/src/controllers/ecommerce.js +20 -0
  67. package/server/src/controllers/index.js +34 -0
  68. package/server/src/controllers/order.js +1100 -0
  69. package/server/src/controllers/payment.js +243 -0
  70. package/server/src/controllers/product.js +1006 -0
  71. package/server/src/controllers/productTag.js +370 -0
  72. package/server/src/controllers/productVariation.js +181 -0
  73. package/server/src/controllers/shipping.js +1046 -0
  74. package/server/src/controllers/wishlist.js +332 -0
  75. package/server/src/destroy.js +6 -0
  76. package/server/src/index.js +26 -0
  77. package/server/src/middlewares/index.js +4 -0
  78. package/server/src/policies/index.js +4 -0
  79. package/server/src/register.js +67 -0
  80. package/server/src/routes/index.js +1130 -0
  81. package/server/src/services/cart.js +531 -0
  82. package/server/src/services/compare.js +300 -0
  83. package/server/src/services/index.js +16 -0
  84. package/server/src/services/service.js +19 -0
  85. package/server/src/services/shipping.js +513 -0
  86. package/server/src/services/wishlist.js +238 -0
  87. package/server/src/utils/check-ecommerce-permission.js +204 -0
  88. package/server/src/utils/extend-user-schema.js +161 -0
  89. package/server/src/utils/seed-data.js +639 -0
  90. package/server/src/utils/send-email.js +98 -0
  91. package/strapi-server.js +1 -6
  92. package/dist/_chunks/Settings-DZXAkI24.js +0 -31539
  93. package/dist/_chunks/Settings-yLx-YvVy.mjs +0 -31520
  94. package/dist/_chunks/en-DE15m4xZ.mjs +0 -574
  95. package/dist/_chunks/index-CXGrFKp6.mjs +0 -128
  96. package/dist/_chunks/index-DgocXUgC.js +0 -127
  97. package/dist/admin/index.js +0 -3
  98. package/dist/admin/index.mjs +0 -4
  99. package/dist/robots.txt +0 -3
  100. package/dist/server/index.js +0 -27078
  101. package/dist/uploads/.gitkeep +0 -0
  102. package/dist/uploads/accessories_category_2a5631094b.jpeg +0 -0
  103. package/dist/uploads/beauty_personal_care_category_57f8a8f1e3.jpeg +0 -0
  104. package/dist/uploads/books_category_a9a253eada.jpeg +0 -0
  105. package/dist/uploads/classic_cotton_tshirt_1_cd713425f6.png +0 -0
  106. package/dist/uploads/clothing_category_d5c60ef07b.jpeg +0 -0
  107. package/dist/uploads/daviddoe_strapi_adbcd41787.jpeg +0 -0
  108. package/dist/uploads/electronics_category_fc3e5ef571.jpeg +0 -0
  109. package/dist/uploads/ergonomic_office_chair_1_c751cffb07.png +0 -0
  110. package/dist/uploads/home_garden_category_4f6eb3f8d6.jpeg +0 -0
  111. package/dist/uploads/istockphoto_1188462138_612x612_11f295b9c0.jpg +0 -0
  112. package/dist/uploads/istockphoto_1188462138_612x612_396fb272fd.jpg +0 -0
  113. package/dist/uploads/large_daviddoe_strapi_adbcd41787.jpeg +0 -0
  114. package/dist/uploads/leather_travel_backpack_1_238bc1ae4d.png +0 -0
  115. package/dist/uploads/mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
  116. package/dist/uploads/medium_classic_cotton_tshirt_1_cd713425f6.png +0 -0
  117. package/dist/uploads/medium_daviddoe_strapi_adbcd41787.jpeg +0 -0
  118. package/dist/uploads/medium_ergonomic_office_chair_1_c751cffb07.png +0 -0
  119. package/dist/uploads/medium_leather_travel_backpack_1_238bc1ae4d.png +0 -0
  120. package/dist/uploads/medium_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
  121. package/dist/uploads/medium_smart_watch_series_5_1_cdc2511fb7.png +0 -0
  122. package/dist/uploads/medium_smartphone_x_pro_1_c3f0cbd080.png +0 -0
  123. package/dist/uploads/medium_the_great_gatsby_special_1_2e7c76d997.png +0 -0
  124. package/dist/uploads/medium_wireless_headphones_1_fa75cd50c3.png +0 -0
  125. package/dist/uploads/medium_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
  126. package/dist/uploads/predictive_maintenance_icons_industry_automation_600nw_2685943461_e18a8aa3b0.webp +0 -0
  127. package/dist/uploads/small_classic_cotton_tshirt_1_cd713425f6.png +0 -0
  128. package/dist/uploads/small_daviddoe_strapi_adbcd41787.jpeg +0 -0
  129. package/dist/uploads/small_ergonomic_office_chair_1_c751cffb07.png +0 -0
  130. package/dist/uploads/small_leather_travel_backpack_1_238bc1ae4d.png +0 -0
  131. package/dist/uploads/small_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
  132. package/dist/uploads/small_smart_watch_series_5_1_cdc2511fb7.png +0 -0
  133. package/dist/uploads/small_smartphone_x_pro_1_c3f0cbd080.png +0 -0
  134. package/dist/uploads/small_the_great_gatsby_special_1_2e7c76d997.png +0 -0
  135. package/dist/uploads/small_wireless_headphones_1_fa75cd50c3.png +0 -0
  136. package/dist/uploads/small_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
  137. package/dist/uploads/smart_watch_series_5_1_cdc2511fb7.png +0 -0
  138. package/dist/uploads/smartphone_x_pro_1_c3f0cbd080.png +0 -0
  139. package/dist/uploads/the_great_gatsby_special_1_2e7c76d997.png +0 -0
  140. package/dist/uploads/thumbnail_accessories_category_2a5631094b.jpeg +0 -0
  141. package/dist/uploads/thumbnail_beauty_personal_care_category_57f8a8f1e3.jpeg +0 -0
  142. package/dist/uploads/thumbnail_books_category_a9a253eada.jpeg +0 -0
  143. package/dist/uploads/thumbnail_classic_cotton_tshirt_1_cd713425f6.png +0 -0
  144. package/dist/uploads/thumbnail_clothing_category_d5c60ef07b.jpeg +0 -0
  145. package/dist/uploads/thumbnail_daviddoe_strapi_adbcd41787.jpeg +0 -0
  146. package/dist/uploads/thumbnail_electronics_category_fc3e5ef571.jpeg +0 -0
  147. package/dist/uploads/thumbnail_ergonomic_office_chair_1_c751cffb07.png +0 -0
  148. package/dist/uploads/thumbnail_home_garden_category_4f6eb3f8d6.jpeg +0 -0
  149. package/dist/uploads/thumbnail_istockphoto_1188462138_612x612_11f295b9c0.jpg +0 -0
  150. package/dist/uploads/thumbnail_istockphoto_1188462138_612x612_396fb272fd.jpg +0 -0
  151. package/dist/uploads/thumbnail_leather_travel_backpack_1_238bc1ae4d.png +0 -0
  152. package/dist/uploads/thumbnail_mechanical_keyboard_pro_1_0cd391a6ac.png +0 -0
  153. package/dist/uploads/thumbnail_predictive_maintenance_icons_industry_automation_600nw_2685943461_e18a8aa3b0.webp +0 -0
  154. package/dist/uploads/thumbnail_smart_watch_series_5_1_cdc2511fb7.png +0 -0
  155. package/dist/uploads/thumbnail_smartphone_x_pro_1_c3f0cbd080.png +0 -0
  156. package/dist/uploads/thumbnail_the_great_gatsby_special_1_2e7c76d997.png +0 -0
  157. package/dist/uploads/thumbnail_wireless_headphones_1_fa75cd50c3.png +0 -0
  158. package/dist/uploads/thumbnail_yoga_mat_premium_1_01f9a3b5fa.png +0 -0
  159. package/dist/uploads/webby-commerce.png +0 -0
  160. package/dist/uploads/wireless_headphones_1_fa75cd50c3.png +0 -0
  161. package/dist/uploads/yoga_mat_premium_1_01f9a3b5fa.png +0 -0
  162. /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
+