@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,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
|
+
};
|