@webbycrown/webbycommerce 1.2.1 → 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 +21 -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-Bg2JyQ4c.js +0 -31518
  93. package/dist/_chunks/Settings-BonPzbwr.mjs +0 -31499
  94. package/dist/_chunks/en-DE15m4xZ.mjs +0 -574
  95. package/dist/_chunks/index-BWVy9o1d.mjs +0 -128
  96. package/dist/_chunks/index-NRuOdjd7.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 -27336
  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,243 @@
1
+ 'use strict';
2
+
3
+ const PLUGIN_ID = 'webbycommerce';
4
+ const { ensureEcommercePermission } = require('../utils/check-ecommerce-permission');
5
+
6
+ module.exports = {
7
+ /**
8
+ * Create payment intent
9
+ */
10
+ async createIntent(ctx) {
11
+ try {
12
+ const { order_id, payment_method, amount, currency = 'USD' } = ctx.request.body;
13
+
14
+ if (!order_id || !payment_method || !amount) {
15
+ return ctx.badRequest('Order ID, payment method, and amount are required.');
16
+ }
17
+
18
+ // Validate order exists and belongs to user
19
+ const order = await strapi.db.query('plugin::webbycommerce.order').findOne({
20
+ where: { id: order_id },
21
+ populate: ['user']
22
+ });
23
+
24
+ if (!order) {
25
+ return ctx.notFound('Order not found.');
26
+ }
27
+
28
+ // Check if user owns the order (unless it's an admin)
29
+ if (order.user && order.user.id !== ctx.state.user?.id) {
30
+ // For now, allow all authenticated users - you might want to add admin check here
31
+ }
32
+
33
+ // Create payment transaction record
34
+ const paymentTransaction = await strapi.db.query('plugin::webbycommerce.payment-transaction').create({
35
+ data: {
36
+ order: order_id,
37
+ transaction_id: `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, // Temporary ID
38
+ payment_method,
39
+ amount: parseFloat(amount),
40
+ currency,
41
+ status: 'pending'
42
+ }
43
+ });
44
+
45
+ // Here you would integrate with actual payment gateways (Stripe, PayPal, Razorpay)
46
+ // For now, return mock data
47
+ const paymentIntent = {
48
+ client_secret: `pi_mock_${Date.now()}`,
49
+ transaction_id: paymentTransaction.transaction_id,
50
+ amount: parseFloat(amount),
51
+ currency,
52
+ payment_method
53
+ };
54
+
55
+ ctx.send({
56
+ data: {
57
+ payment_intent: paymentIntent,
58
+ transaction: paymentTransaction
59
+ }
60
+ });
61
+ } catch (error) {
62
+ strapi.log.error(`[${PLUGIN_ID}] Error in createIntent:`, error);
63
+ ctx.internalServerError('Failed to create payment intent. Please try again.');
64
+ }
65
+ },
66
+
67
+ /**
68
+ * Confirm payment
69
+ */
70
+ async confirmPayment(ctx) {
71
+ try {
72
+ const { transaction_id, payment_data } = ctx.request.body;
73
+
74
+ if (!transaction_id) {
75
+ return ctx.badRequest('Transaction ID is required.');
76
+ }
77
+
78
+ // Find the payment transaction
79
+ const paymentTransaction = await strapi.db.query('plugin::webbycommerce.payment-transaction').findOne({
80
+ where: { transaction_id },
81
+ populate: ['order']
82
+ });
83
+
84
+ if (!paymentTransaction) {
85
+ return ctx.notFound('Payment transaction not found.');
86
+ }
87
+
88
+ // Update payment transaction
89
+ const updatedTransaction = await strapi.db.query('plugin::webbycommerce.payment-transaction').update({
90
+ where: { id: paymentTransaction.id },
91
+ data: {
92
+ status: 'completed',
93
+ processed_at: new Date(),
94
+ gateway_response: payment_data
95
+ }
96
+ });
97
+
98
+ // Update order payment status
99
+ await strapi.db.query('plugin::webbycommerce.order').update({
100
+ where: { id: paymentTransaction.order.id },
101
+ data: {
102
+ payment_status: 'paid',
103
+ status: 'processing' // Move order to processing
104
+ }
105
+ });
106
+
107
+ ctx.send({
108
+ data: {
109
+ transaction: updatedTransaction,
110
+ message: 'Payment confirmed successfully'
111
+ }
112
+ });
113
+ } catch (error) {
114
+ strapi.log.error(`[${PLUGIN_ID}] Error in confirmPayment:`, error);
115
+ ctx.internalServerError('Failed to confirm payment. Please try again.');
116
+ }
117
+ },
118
+
119
+ /**
120
+ * Handle payment webhook
121
+ */
122
+ async handleWebhook(ctx) {
123
+ try {
124
+ const webhookData = ctx.request.body;
125
+ const signature = ctx.request.headers['stripe-signature'] || ctx.request.headers['paypal-signature'];
126
+
127
+ // Here you would verify webhook signatures and handle different gateway webhooks
128
+ // For now, just log the webhook
129
+ strapi.log.info(`[${PLUGIN_ID}] Webhook received:`, webhookData);
130
+
131
+ // Process webhook based on type
132
+ // This is a placeholder implementation
133
+
134
+ ctx.send({ message: 'Webhook processed successfully' });
135
+ } catch (error) {
136
+ strapi.log.error(`[${PLUGIN_ID}] Error in handleWebhook:`, error);
137
+ ctx.internalServerError('Failed to process webhook.');
138
+ }
139
+ },
140
+
141
+ /**
142
+ * Process refund
143
+ */
144
+ async processRefund(ctx) {
145
+ try {
146
+ const { id } = ctx.params;
147
+ const { amount, reason } = ctx.request.body;
148
+
149
+ // Find the payment transaction
150
+ const paymentTransaction = await strapi.db.query('plugin::webbycommerce.payment-transaction').findOne({
151
+ where: { id },
152
+ populate: ['order']
153
+ });
154
+
155
+ if (!paymentTransaction) {
156
+ return ctx.notFound('Payment transaction not found.');
157
+ }
158
+
159
+ if (paymentTransaction.status !== 'completed') {
160
+ return ctx.badRequest('Only completed payments can be refunded.');
161
+ }
162
+
163
+ // Calculate refund amount
164
+ const refundAmount = amount ? parseFloat(amount) : paymentTransaction.amount;
165
+
166
+ if (refundAmount > paymentTransaction.amount) {
167
+ return ctx.badRequest('Refund amount cannot exceed payment amount.');
168
+ }
169
+
170
+ // Here you would integrate with payment gateway refund APIs
171
+ // For now, update the transaction
172
+ const updatedTransaction = await strapi.db.query('plugin::webbycommerce.payment-transaction').update({
173
+ where: { id: paymentTransaction.id },
174
+ data: {
175
+ status: 'refunded',
176
+ refunded_at: new Date(),
177
+ refund_amount: refundAmount,
178
+ failure_reason: reason
179
+ }
180
+ });
181
+
182
+ // Update order status
183
+ await strapi.db.query('plugin::webbycommerce.order').update({
184
+ where: { id: paymentTransaction.order.id },
185
+ data: {
186
+ payment_status: 'refunded',
187
+ status: 'refunded'
188
+ }
189
+ });
190
+
191
+ ctx.send({
192
+ data: {
193
+ transaction: updatedTransaction,
194
+ message: 'Refund processed successfully'
195
+ }
196
+ });
197
+ } catch (error) {
198
+ strapi.log.error(`[${PLUGIN_ID}] Error in processRefund:`, error);
199
+ ctx.internalServerError('Failed to process refund. Please try again.');
200
+ }
201
+ },
202
+
203
+ /**
204
+ * Get payment transactions (admin only)
205
+ */
206
+ async getTransactions(ctx) {
207
+ try {
208
+ const { limit = 10, start = 0, order_id, status } = ctx.query;
209
+
210
+ const where = {};
211
+
212
+ if (order_id) {
213
+ where.order = { id: order_id };
214
+ }
215
+
216
+ if (status) {
217
+ where.status = status;
218
+ }
219
+
220
+ const transactions = await strapi.db.query('plugin::webbycommerce.payment-transaction').findMany({
221
+ where,
222
+ limit: parseInt(limit, 10),
223
+ start: parseInt(start, 10),
224
+ orderBy: { createdAt: 'desc' },
225
+ populate: ['order']
226
+ });
227
+
228
+ const total = await strapi.db.query('plugin::webbycommerce.payment-transaction').count({ where });
229
+
230
+ ctx.send({
231
+ data: transactions,
232
+ meta: {
233
+ total,
234
+ limit: parseInt(limit, 10),
235
+ start: parseInt(start, 10)
236
+ }
237
+ });
238
+ } catch (error) {
239
+ strapi.log.error(`[${PLUGIN_ID}] Error in getTransactions:`, error);
240
+ ctx.internalServerError('Failed to fetch payment transactions.');
241
+ }
242
+ }
243
+ };