@commercejs/adapter-salla 0.1.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/dist/__tests__/adapter.contract.test.d.ts +2 -0
- package/dist/__tests__/adapter.contract.test.d.ts.map +1 -0
- package/dist/__tests__/adapter.contract.test.js +228 -0
- package/dist/__tests__/adapter.contract.test.js.map +1 -0
- package/dist/__tests__/mappers.test.d.ts +2 -0
- package/dist/__tests__/mappers.test.d.ts.map +1 -0
- package/dist/__tests__/mappers.test.js +512 -0
- package/dist/__tests__/mappers.test.js.map +1 -0
- package/dist/adapter.d.ts +85 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +492 -0
- package/dist/adapter.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mappers/brand.d.ts +4 -0
- package/dist/mappers/brand.d.ts.map +1 -0
- package/dist/mappers/brand.js +20 -0
- package/dist/mappers/brand.js.map +1 -0
- package/dist/mappers/category.d.ts +5 -0
- package/dist/mappers/category.d.ts.map +1 -0
- package/dist/mappers/category.js +25 -0
- package/dist/mappers/category.js.map +1 -0
- package/dist/mappers/country.d.ts +4 -0
- package/dist/mappers/country.d.ts.map +1 -0
- package/dist/mappers/country.js +14 -0
- package/dist/mappers/country.js.map +1 -0
- package/dist/mappers/customer.d.ts +7 -0
- package/dist/mappers/customer.d.ts.map +1 -0
- package/dist/mappers/customer.js +45 -0
- package/dist/mappers/customer.js.map +1 -0
- package/dist/mappers/index.d.ts +12 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +15 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/mappers/location.d.ts +4 -0
- package/dist/mappers/location.d.ts.map +1 -0
- package/dist/mappers/location.js +44 -0
- package/dist/mappers/location.js.map +1 -0
- package/dist/mappers/order-status.d.ts +7 -0
- package/dist/mappers/order-status.d.ts.map +1 -0
- package/dist/mappers/order-status.js +38 -0
- package/dist/mappers/order-status.js.map +1 -0
- package/dist/mappers/order.d.ts +5 -0
- package/dist/mappers/order.d.ts.map +1 -0
- package/dist/mappers/order.js +141 -0
- package/dist/mappers/order.js.map +1 -0
- package/dist/mappers/payment.d.ts +5 -0
- package/dist/mappers/payment.d.ts.map +1 -0
- package/dist/mappers/payment.js +20 -0
- package/dist/mappers/payment.js.map +1 -0
- package/dist/mappers/product.d.ts +5 -0
- package/dist/mappers/product.d.ts.map +1 -0
- package/dist/mappers/product.js +143 -0
- package/dist/mappers/product.js.map +1 -0
- package/dist/mappers/review.d.ts +5 -0
- package/dist/mappers/review.d.ts.map +1 -0
- package/dist/mappers/review.js +17 -0
- package/dist/mappers/review.js.map +1 -0
- package/dist/mappers/shipping.d.ts +5 -0
- package/dist/mappers/shipping.d.ts.map +1 -0
- package/dist/mappers/shipping.js +20 -0
- package/dist/mappers/shipping.js.map +1 -0
- package/dist/types.d.ts +472 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// SallaAdapter — maps Salla Merchant API v2 → CommerceAdapter contract
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { CommerceError, } from '@commercejs/types';
|
|
5
|
+
import { SallaClient } from './client.js';
|
|
6
|
+
import { mapSallaProduct, mapSallaCategory, mapSallaCustomer, mapSallaOrder, mapSallaOrderStatus, mapSallaOrderHistory, mapSallaReview, mapSallaShipping, mapSallaPayment, mapSallaBrand, mapSallaCountry, mapSallaBranch, } from './mappers/index.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
function notImplemented(method) {
|
|
11
|
+
throw new CommerceError(`SallaAdapter.${method}() is not supported by the Salla platform`, 'NOT_SUPPORTED', 501);
|
|
12
|
+
}
|
|
13
|
+
function toLocalized(value, locale = 'ar') {
|
|
14
|
+
if (locale === 'en')
|
|
15
|
+
return { ar: '', en: value };
|
|
16
|
+
return { ar: value, en: '' };
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Adapter
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export class SallaAdapter {
|
|
22
|
+
name = 'salla';
|
|
23
|
+
client;
|
|
24
|
+
locale;
|
|
25
|
+
/**
|
|
26
|
+
* Domains this adapter actually supports (methods won't throw NOT_SUPPORTED).
|
|
27
|
+
* Used by consumers to check capability before calling.
|
|
28
|
+
*/
|
|
29
|
+
capabilities = [
|
|
30
|
+
'catalog',
|
|
31
|
+
'orders',
|
|
32
|
+
'store',
|
|
33
|
+
'promotions',
|
|
34
|
+
'reviews',
|
|
35
|
+
'brands',
|
|
36
|
+
'countries',
|
|
37
|
+
'locations',
|
|
38
|
+
'customers', // partial: register + read via API
|
|
39
|
+
];
|
|
40
|
+
constructor(config) {
|
|
41
|
+
this.client = new SallaClient(config);
|
|
42
|
+
this.locale = config.locale ?? 'ar';
|
|
43
|
+
}
|
|
44
|
+
// ========================================================================
|
|
45
|
+
// CatalogAdapter
|
|
46
|
+
// ========================================================================
|
|
47
|
+
async getProduct(params) {
|
|
48
|
+
const id = params.id ?? params.slug;
|
|
49
|
+
if (!id)
|
|
50
|
+
throw new CommerceError('Product ID or slug is required', 'VALIDATION', 422);
|
|
51
|
+
const res = await this.client.get(`/products/${id}`);
|
|
52
|
+
return mapSallaProduct(res.data, this.locale);
|
|
53
|
+
}
|
|
54
|
+
async getProducts(params) {
|
|
55
|
+
const query = {};
|
|
56
|
+
if (params.query)
|
|
57
|
+
query.keyword = params.query;
|
|
58
|
+
if (params.categoryId)
|
|
59
|
+
query.category_id = params.categoryId;
|
|
60
|
+
if (params.page)
|
|
61
|
+
query.page = params.page;
|
|
62
|
+
if (params.perPage)
|
|
63
|
+
query.per_page = params.perPage;
|
|
64
|
+
if (params.sort) {
|
|
65
|
+
query.sort_by = params.sort.field;
|
|
66
|
+
query.sort_order = params.sort.direction;
|
|
67
|
+
}
|
|
68
|
+
const paginated = await this.client.paginated('/products', query);
|
|
69
|
+
return {
|
|
70
|
+
products: {
|
|
71
|
+
items: paginated.data.map((p) => mapSallaProduct(p, this.locale)),
|
|
72
|
+
total: paginated.total,
|
|
73
|
+
page: paginated.page,
|
|
74
|
+
perPage: paginated.perPage,
|
|
75
|
+
hasMore: paginated.page < paginated.totalPages,
|
|
76
|
+
},
|
|
77
|
+
facets: [],
|
|
78
|
+
suggestions: null,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async getCategories(params) {
|
|
82
|
+
const query = {};
|
|
83
|
+
if (params?.parentId)
|
|
84
|
+
query.parent_id = params.parentId;
|
|
85
|
+
const res = await this.client.get('/categories', query);
|
|
86
|
+
return res.data.map((c) => mapSallaCategory(c, this.locale));
|
|
87
|
+
}
|
|
88
|
+
// ========================================================================
|
|
89
|
+
// CartAdapter — NOT SUPPORTED (Salla has no storefront cart REST API)
|
|
90
|
+
// ========================================================================
|
|
91
|
+
async createCart() { return notImplemented('createCart'); }
|
|
92
|
+
async getCart(_cartId) { return notImplemented('getCart'); }
|
|
93
|
+
async addToCart(_cartId, _item) { return notImplemented('addToCart'); }
|
|
94
|
+
async updateCartItem(_cartId, _itemId, _quantity) { return notImplemented('updateCartItem'); }
|
|
95
|
+
async removeFromCart(_cartId, _itemId) { return notImplemented('removeFromCart'); }
|
|
96
|
+
async applyCoupon(_cartId, _code) { return notImplemented('applyCoupon'); }
|
|
97
|
+
async removeCoupon(_cartId) { return notImplemented('removeCoupon'); }
|
|
98
|
+
// ========================================================================
|
|
99
|
+
// CheckoutAdapter
|
|
100
|
+
// ========================================================================
|
|
101
|
+
async getShippingMethods(_cartId) {
|
|
102
|
+
try {
|
|
103
|
+
const res = await this.client.get('/shipping/companies');
|
|
104
|
+
return res.data.map((s) => mapSallaShipping(s, this.locale));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// shipping scope may not be granted — return empty
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async setShippingAddress(_cartId, _address) {
|
|
112
|
+
return notImplemented('setShippingAddress');
|
|
113
|
+
}
|
|
114
|
+
async setBillingAddress(_cartId, _address) {
|
|
115
|
+
return notImplemented('setBillingAddress');
|
|
116
|
+
}
|
|
117
|
+
async setShippingMethod(_cartId, _methodId) {
|
|
118
|
+
return notImplemented('setShippingMethod');
|
|
119
|
+
}
|
|
120
|
+
async getPaymentMethods(_cartId) {
|
|
121
|
+
const res = await this.client.get('/payment/methods');
|
|
122
|
+
return res.data.map((p) => mapSallaPayment(p, this.locale));
|
|
123
|
+
}
|
|
124
|
+
async setPaymentMethod(_cartId, _methodId) {
|
|
125
|
+
return notImplemented('setPaymentMethod');
|
|
126
|
+
}
|
|
127
|
+
async placeOrder(_cartId) {
|
|
128
|
+
return notImplemented('placeOrder');
|
|
129
|
+
}
|
|
130
|
+
// ========================================================================
|
|
131
|
+
// CustomerAdapter
|
|
132
|
+
// ========================================================================
|
|
133
|
+
async login(_email, _password) {
|
|
134
|
+
// Salla Merchant API doesn't support customer login — auth is via OAuth
|
|
135
|
+
return notImplemented('login');
|
|
136
|
+
}
|
|
137
|
+
async register(input) {
|
|
138
|
+
const res = await this.client.post('/customers', {
|
|
139
|
+
first_name: input.firstName,
|
|
140
|
+
last_name: input.lastName,
|
|
141
|
+
email: input.email,
|
|
142
|
+
mobile: input.phone,
|
|
143
|
+
});
|
|
144
|
+
return mapSallaCustomer(res.data);
|
|
145
|
+
}
|
|
146
|
+
async getCustomer() {
|
|
147
|
+
// Salla Merchant API doesn't have a "me" endpoint —
|
|
148
|
+
// this requires a customer ID which we'd get from session context.
|
|
149
|
+
// For now, throw until we have session management.
|
|
150
|
+
return notImplemented('getCustomer');
|
|
151
|
+
}
|
|
152
|
+
async updateCustomer(input) {
|
|
153
|
+
// Requires customer ID from session context
|
|
154
|
+
// When session management is added, this will use PUT /customers/{id}
|
|
155
|
+
return notImplemented('updateCustomer');
|
|
156
|
+
}
|
|
157
|
+
async logout() {
|
|
158
|
+
// OAuth — token revocation handled externally
|
|
159
|
+
}
|
|
160
|
+
async forgotPassword(_email) {
|
|
161
|
+
return notImplemented('forgotPassword');
|
|
162
|
+
}
|
|
163
|
+
async resetPassword(_token, _newPassword) {
|
|
164
|
+
return notImplemented('resetPassword');
|
|
165
|
+
}
|
|
166
|
+
async getAddresses() {
|
|
167
|
+
// Requires customer ID from session context
|
|
168
|
+
return notImplemented('getAddresses');
|
|
169
|
+
}
|
|
170
|
+
async addAddress(_address) {
|
|
171
|
+
return notImplemented('addAddress');
|
|
172
|
+
}
|
|
173
|
+
async updateAddress(_addressId, _address) {
|
|
174
|
+
return notImplemented('updateAddress');
|
|
175
|
+
}
|
|
176
|
+
async deleteAddress(_addressId) {
|
|
177
|
+
return notImplemented('deleteAddress');
|
|
178
|
+
}
|
|
179
|
+
// ========================================================================
|
|
180
|
+
// OrderAdapter
|
|
181
|
+
// ========================================================================
|
|
182
|
+
async createOrder(input) {
|
|
183
|
+
// Build Salla's POST /orders payload
|
|
184
|
+
const body = {
|
|
185
|
+
// Items
|
|
186
|
+
items: input.items.map((item) => ({
|
|
187
|
+
product_id: Number(item.productId),
|
|
188
|
+
quantity: item.quantity,
|
|
189
|
+
...(item.variantId ? { variant_id: Number(item.variantId) } : {}),
|
|
190
|
+
...(item.notes ? { note: item.notes } : {}),
|
|
191
|
+
})),
|
|
192
|
+
// Shipping address
|
|
193
|
+
shipping: {
|
|
194
|
+
company_id: input.shippingMethodId ? Number(input.shippingMethodId) : undefined,
|
|
195
|
+
address: {
|
|
196
|
+
country: input.shippingAddress.country,
|
|
197
|
+
city: input.shippingAddress.city,
|
|
198
|
+
street: input.shippingAddress.street,
|
|
199
|
+
...(input.shippingAddress.street2 ? { block: input.shippingAddress.street2 } : {}),
|
|
200
|
+
...(input.shippingAddress.postalCode ? { postal_code: input.shippingAddress.postalCode } : {}),
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
// Payment method
|
|
204
|
+
...(input.payment ? { payment_method: input.payment.methodId } : {}),
|
|
205
|
+
// Note
|
|
206
|
+
...(input.note ? { note: input.note } : {}),
|
|
207
|
+
};
|
|
208
|
+
// Customer ID or receiver (guest)
|
|
209
|
+
if (input.customerId) {
|
|
210
|
+
body.customer_id = Number(input.customerId);
|
|
211
|
+
}
|
|
212
|
+
else if (input.receiver) {
|
|
213
|
+
body.receiver = {
|
|
214
|
+
name: `${input.receiver.firstName} ${input.receiver.lastName}`,
|
|
215
|
+
email: input.receiver.email,
|
|
216
|
+
...(input.receiver.phone ? { phone: input.receiver.phone } : {}),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Coupon
|
|
220
|
+
if (input.couponCode) {
|
|
221
|
+
body.coupon = input.couponCode;
|
|
222
|
+
}
|
|
223
|
+
const res = await this.client.post('/orders', body);
|
|
224
|
+
return mapSallaOrder(res.data, this.locale);
|
|
225
|
+
}
|
|
226
|
+
async getCustomerOrders(params) {
|
|
227
|
+
const paginated = await this.client.paginated('/orders', {
|
|
228
|
+
page: params?.page,
|
|
229
|
+
perPage: params?.perPage,
|
|
230
|
+
});
|
|
231
|
+
return {
|
|
232
|
+
items: paginated.data.map((o) => mapSallaOrder(o, this.locale)),
|
|
233
|
+
total: paginated.total,
|
|
234
|
+
page: paginated.page,
|
|
235
|
+
perPage: paginated.perPage,
|
|
236
|
+
hasMore: paginated.page < paginated.totalPages,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
async getOrder(orderId) {
|
|
240
|
+
const res = await this.client.get(`/orders/${orderId}`);
|
|
241
|
+
return mapSallaOrder(res.data, this.locale);
|
|
242
|
+
}
|
|
243
|
+
async getOrderStatuses() {
|
|
244
|
+
const res = await this.client.get('/orders/statuses');
|
|
245
|
+
return res.data.map(mapSallaOrderStatus);
|
|
246
|
+
}
|
|
247
|
+
async updateOrderStatus(orderId, input) {
|
|
248
|
+
await this.client.post(`/orders/${orderId}/status`, {
|
|
249
|
+
slug: input.status,
|
|
250
|
+
...(input.note ? { note: input.note } : {}),
|
|
251
|
+
...(input.restoreItems !== undefined ? { restore_items: input.restoreItems } : {}),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async cancelOrder(orderId, note) {
|
|
255
|
+
await this.updateOrderStatus(orderId, {
|
|
256
|
+
status: 'canceled',
|
|
257
|
+
note,
|
|
258
|
+
restoreItems: true,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async duplicateOrder(orderId) {
|
|
262
|
+
const res = await this.client.post('/orders/duplicate', {
|
|
263
|
+
order_id: Number(orderId),
|
|
264
|
+
});
|
|
265
|
+
return mapSallaOrder(res.data, this.locale);
|
|
266
|
+
}
|
|
267
|
+
async getOrderHistory(orderId) {
|
|
268
|
+
const res = await this.client.get('/orders/histories', {
|
|
269
|
+
order_id: orderId,
|
|
270
|
+
});
|
|
271
|
+
return res.data.map((h) => mapSallaOrderHistory(h, orderId));
|
|
272
|
+
}
|
|
273
|
+
// ========================================================================
|
|
274
|
+
// WishlistAdapter — NOT SUPPORTED
|
|
275
|
+
// ========================================================================
|
|
276
|
+
async getWishlist() { return notImplemented('getWishlist'); }
|
|
277
|
+
async addToWishlist(_productId, _variantId) { return notImplemented('addToWishlist'); }
|
|
278
|
+
async removeFromWishlist(_itemId) { return notImplemented('removeFromWishlist'); }
|
|
279
|
+
// ========================================================================
|
|
280
|
+
// ReviewAdapter
|
|
281
|
+
// ========================================================================
|
|
282
|
+
async getProductReviews(productId, params) {
|
|
283
|
+
// Salla reviews are store-wide at /reviews — we filter by product_id
|
|
284
|
+
const paginated = await this.client.paginated('/reviews', {
|
|
285
|
+
page: params?.page,
|
|
286
|
+
perPage: params?.perPage,
|
|
287
|
+
product_id: productId,
|
|
288
|
+
});
|
|
289
|
+
return {
|
|
290
|
+
items: paginated.data.map(mapSallaReview),
|
|
291
|
+
total: paginated.total,
|
|
292
|
+
page: paginated.page,
|
|
293
|
+
perPage: paginated.perPage,
|
|
294
|
+
hasMore: paginated.page < paginated.totalPages,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
async getReviewSummary(productId) {
|
|
298
|
+
const all = await this.getProductReviews(productId, { page: 1, perPage: 100 });
|
|
299
|
+
const distribution = [0, 0, 0, 0, 0];
|
|
300
|
+
let totalRating = 0;
|
|
301
|
+
for (const review of all.items) {
|
|
302
|
+
if (review.rating >= 1 && review.rating <= 5) {
|
|
303
|
+
distribution[review.rating - 1]++;
|
|
304
|
+
totalRating += review.rating;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
productId,
|
|
309
|
+
averageRating: all.total > 0 ? totalRating / all.total : 0,
|
|
310
|
+
totalCount: all.total,
|
|
311
|
+
distribution,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async submitReview(input) {
|
|
315
|
+
// Salla may not support review submission via API — try anyway
|
|
316
|
+
try {
|
|
317
|
+
const res = await this.client.post(`/products/${input.productId}/reviews`, {
|
|
318
|
+
rating: input.rating,
|
|
319
|
+
content: input.body ?? '',
|
|
320
|
+
});
|
|
321
|
+
return mapSallaReview(res.data);
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
return notImplemented('submitReview');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// ========================================================================
|
|
328
|
+
// StoreAdapter
|
|
329
|
+
// ========================================================================
|
|
330
|
+
async getStoreInfo() {
|
|
331
|
+
const [storeRes, currencyRes] = await Promise.all([
|
|
332
|
+
this.client.get('/store/info'),
|
|
333
|
+
this.client.get('/currencies'),
|
|
334
|
+
]);
|
|
335
|
+
const store = storeRes.data;
|
|
336
|
+
const currencies = currencyRes.data;
|
|
337
|
+
return {
|
|
338
|
+
name: { ar: store.name, en: store.name },
|
|
339
|
+
description: store.description ? { ar: store.description, en: store.description } : null,
|
|
340
|
+
logo: store.logo ? { url: store.logo, alt: store.name } : null,
|
|
341
|
+
currencies: currencies.map((c) => ({
|
|
342
|
+
code: c.code,
|
|
343
|
+
symbol: c.symbol,
|
|
344
|
+
isDefault: c.is_default,
|
|
345
|
+
})),
|
|
346
|
+
locales: [
|
|
347
|
+
{ code: 'ar', name: 'العربية', direction: 'rtl', isDefault: true },
|
|
348
|
+
{ code: 'en', name: 'English', direction: 'ltr', isDefault: false },
|
|
349
|
+
],
|
|
350
|
+
country: 'SA',
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// ========================================================================
|
|
354
|
+
// PromotionAdapter
|
|
355
|
+
// ========================================================================
|
|
356
|
+
async getActivePromotions() {
|
|
357
|
+
const res = await this.client.get('/coupons');
|
|
358
|
+
return res.data
|
|
359
|
+
.filter((c) => c.status === 'active')
|
|
360
|
+
.map((c) => ({
|
|
361
|
+
id: String(c.id),
|
|
362
|
+
name: toLocalized(c.code, this.locale),
|
|
363
|
+
description: null,
|
|
364
|
+
discountType: c.type === 'percentage' ? 'percentage' : 'fixed_amount',
|
|
365
|
+
discountValue: c.amount,
|
|
366
|
+
currency: c.type !== 'percentage' ? 'SAR' : null,
|
|
367
|
+
maxDiscount: c.maximum_amount ? { amount: c.maximum_amount, currency: 'SAR', formatted: `${c.maximum_amount.toFixed(2)} SAR` } : null,
|
|
368
|
+
target: 'order',
|
|
369
|
+
conditions: {
|
|
370
|
+
minPurchaseAmount: c.minimum_amount ? { amount: c.minimum_amount, currency: 'SAR', formatted: `${c.minimum_amount.toFixed(2)} SAR` } : null,
|
|
371
|
+
minItemCount: null,
|
|
372
|
+
productIds: null,
|
|
373
|
+
categoryIds: null,
|
|
374
|
+
firstOrderOnly: false,
|
|
375
|
+
},
|
|
376
|
+
startsAt: c.start_date ?? new Date().toISOString(),
|
|
377
|
+
endsAt: c.expiry_date,
|
|
378
|
+
isActive: true,
|
|
379
|
+
requiresCoupon: true,
|
|
380
|
+
usageLimitPerCustomer: null,
|
|
381
|
+
usageLimitTotal: c.usage_limit,
|
|
382
|
+
}));
|
|
383
|
+
}
|
|
384
|
+
async validateCoupon(code) {
|
|
385
|
+
const res = await this.client.get('/coupons', { code });
|
|
386
|
+
const coupon = res.data.find((c) => c.code.toLowerCase() === code.toLowerCase());
|
|
387
|
+
if (!coupon) {
|
|
388
|
+
throw new CommerceError(`Coupon "${code}" not found`, 'VALIDATION', 404);
|
|
389
|
+
}
|
|
390
|
+
const promotion = {
|
|
391
|
+
id: String(coupon.id),
|
|
392
|
+
name: toLocalized(coupon.code, this.locale),
|
|
393
|
+
description: null,
|
|
394
|
+
discountType: coupon.type === 'percentage' ? 'percentage' : 'fixed_amount',
|
|
395
|
+
discountValue: coupon.amount,
|
|
396
|
+
currency: coupon.type !== 'percentage' ? 'SAR' : null,
|
|
397
|
+
maxDiscount: coupon.maximum_amount ? { amount: coupon.maximum_amount, currency: 'SAR', formatted: `${coupon.maximum_amount.toFixed(2)} SAR` } : null,
|
|
398
|
+
target: 'order',
|
|
399
|
+
conditions: {
|
|
400
|
+
minPurchaseAmount: coupon.minimum_amount ? { amount: coupon.minimum_amount, currency: 'SAR', formatted: `${coupon.minimum_amount.toFixed(2)} SAR` } : null,
|
|
401
|
+
minItemCount: null,
|
|
402
|
+
productIds: null,
|
|
403
|
+
categoryIds: null,
|
|
404
|
+
firstOrderOnly: false,
|
|
405
|
+
},
|
|
406
|
+
startsAt: coupon.start_date ?? new Date().toISOString(),
|
|
407
|
+
endsAt: coupon.expiry_date,
|
|
408
|
+
isActive: coupon.status === 'active',
|
|
409
|
+
requiresCoupon: true,
|
|
410
|
+
usageLimitPerCustomer: null,
|
|
411
|
+
usageLimitTotal: coupon.usage_limit,
|
|
412
|
+
};
|
|
413
|
+
return {
|
|
414
|
+
id: String(coupon.id),
|
|
415
|
+
code: coupon.code,
|
|
416
|
+
promotion,
|
|
417
|
+
isValid: coupon.status === 'active',
|
|
418
|
+
invalidReason: coupon.status !== 'active' ? coupon.status : null,
|
|
419
|
+
timesUsed: coupon.usage_count,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
// ========================================================================
|
|
423
|
+
// ReturnAdapter — NOT SUPPORTED
|
|
424
|
+
// ========================================================================
|
|
425
|
+
async createReturn(_input) { return notImplemented('createReturn'); }
|
|
426
|
+
async getReturns(_params) { return notImplemented('getReturns'); }
|
|
427
|
+
async getReturn(_returnId) { return notImplemented('getReturn'); }
|
|
428
|
+
async cancelReturn(_returnId) { return notImplemented('cancelReturn'); }
|
|
429
|
+
// ========================================================================
|
|
430
|
+
// WholesaleAdapter — PARTIAL (customer groups only)
|
|
431
|
+
// ========================================================================
|
|
432
|
+
async getCustomerGroups() {
|
|
433
|
+
const res = await this.client.get('/customers/groups');
|
|
434
|
+
return res.data.map((g) => ({
|
|
435
|
+
id: String(g.id),
|
|
436
|
+
code: String(g.id),
|
|
437
|
+
name: toLocalized(g.name, this.locale),
|
|
438
|
+
isWholesale: false,
|
|
439
|
+
defaultDiscount: 0,
|
|
440
|
+
minimumOrderValue: null,
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
async createQuote(_input) { return notImplemented('createQuote'); }
|
|
444
|
+
async getQuotes(_params) { return notImplemented('getQuotes'); }
|
|
445
|
+
async getQuote(_quoteId) { return notImplemented('getQuote'); }
|
|
446
|
+
async acceptQuote(_quoteId) { return notImplemented('acceptQuote'); }
|
|
447
|
+
async rejectQuote(_quoteId) { return notImplemented('rejectQuote'); }
|
|
448
|
+
// ========================================================================
|
|
449
|
+
// AuctionAdapter — NOT SUPPORTED
|
|
450
|
+
// ========================================================================
|
|
451
|
+
async placeBid(_input) { return notImplemented('placeBid'); }
|
|
452
|
+
async getBids(_productId, _params) { return notImplemented('getBids'); }
|
|
453
|
+
async getWinningBid(_productId) { return notImplemented('getWinningBid'); }
|
|
454
|
+
// ========================================================================
|
|
455
|
+
// RentalAdapter — NOT SUPPORTED
|
|
456
|
+
// ========================================================================
|
|
457
|
+
async checkAvailability(_productId, _startDate, _endDate) { return notImplemented('checkAvailability'); }
|
|
458
|
+
async createBooking(_input) { return notImplemented('createBooking'); }
|
|
459
|
+
async getBookings(_params) { return notImplemented('getBookings'); }
|
|
460
|
+
async getBooking(_bookingId) { return notImplemented('getBooking'); }
|
|
461
|
+
async cancelBooking(_bookingId) { return notImplemented('cancelBooking'); }
|
|
462
|
+
// ========================================================================
|
|
463
|
+
// GiftCardAdapter — NOT SUPPORTED
|
|
464
|
+
// ========================================================================
|
|
465
|
+
async purchaseGiftCard(_input) { return notImplemented('purchaseGiftCard'); }
|
|
466
|
+
async getGiftCardBalance(_code) { return notImplemented('getGiftCardBalance'); }
|
|
467
|
+
async redeemGiftCard(_input) { return notImplemented('redeemGiftCard'); }
|
|
468
|
+
async getMyGiftCards() { return notImplemented('getMyGiftCards'); }
|
|
469
|
+
async getGiftCardTransactions(_giftCardId) { return notImplemented('getGiftCardTransactions'); }
|
|
470
|
+
// ========================================================================
|
|
471
|
+
// BrandAdapter
|
|
472
|
+
// ========================================================================
|
|
473
|
+
async getBrands() {
|
|
474
|
+
const res = await this.client.get('/brands');
|
|
475
|
+
return res.data.map((b) => mapSallaBrand(b, this.locale));
|
|
476
|
+
}
|
|
477
|
+
// ========================================================================
|
|
478
|
+
// CountryAdapter
|
|
479
|
+
// ========================================================================
|
|
480
|
+
async getCountries() {
|
|
481
|
+
const res = await this.client.get('/countries');
|
|
482
|
+
return res.data.map(mapSallaCountry);
|
|
483
|
+
}
|
|
484
|
+
// ========================================================================
|
|
485
|
+
// LocationAdapter
|
|
486
|
+
// ========================================================================
|
|
487
|
+
async getStoreLocations() {
|
|
488
|
+
const res = await this.client.get('/branches');
|
|
489
|
+
return res.data.map((b) => mapSallaBranch(b, this.locale));
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SallaConfig, SallaApiResponse } from './types.js';
|
|
2
|
+
export declare class SallaClient {
|
|
3
|
+
private http;
|
|
4
|
+
readonly config: SallaConfig;
|
|
5
|
+
private _accessToken;
|
|
6
|
+
private _refreshPromise;
|
|
7
|
+
constructor(config: SallaConfig);
|
|
8
|
+
private createHttpClient;
|
|
9
|
+
/** Whether this client has the credentials needed for token refresh */
|
|
10
|
+
get canRefresh(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Refresh the OAuth access token using the refresh token.
|
|
13
|
+
* Uses a mutex so concurrent 401s only trigger one refresh.
|
|
14
|
+
*/
|
|
15
|
+
refreshAccessToken(): Promise<string>;
|
|
16
|
+
private _doRefresh;
|
|
17
|
+
/**
|
|
18
|
+
* Execute a request. If it fails with 401 and refresh credentials
|
|
19
|
+
* are available, refresh the token and retry once.
|
|
20
|
+
*/
|
|
21
|
+
private withRefreshRetry;
|
|
22
|
+
/** GET request — returns the unwrapped response from Salla's response envelope */
|
|
23
|
+
get<T>(path: string, query?: Record<string, unknown>): Promise<SallaApiResponse<T>>;
|
|
24
|
+
/** POST request */
|
|
25
|
+
post<T>(path: string, body?: Record<string, unknown>): Promise<SallaApiResponse<T>>;
|
|
26
|
+
/** PUT request */
|
|
27
|
+
put<T>(path: string, body?: Record<string, unknown>): Promise<SallaApiResponse<T>>;
|
|
28
|
+
/** DELETE request */
|
|
29
|
+
delete<T>(path: string): Promise<SallaApiResponse<T>>;
|
|
30
|
+
/** Fetch a paginated list from Salla and return data + pagination */
|
|
31
|
+
paginated<T>(path: string, params?: {
|
|
32
|
+
page?: number;
|
|
33
|
+
perPage?: number;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
data: T[];
|
|
37
|
+
total: number;
|
|
38
|
+
page: number;
|
|
39
|
+
perPage: number;
|
|
40
|
+
totalPages: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAM/D,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAQ;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAG5B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,eAAe,CAA+B;gBAE1C,MAAM,EAAE,WAAW;IAS/B,OAAO,CAAC,gBAAgB;IAkCxB,uEAAuE;IACvE,IAAI,UAAU,IAAI,OAAO,CAGxB;IAED;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;YAuB7B,UAAU;IAoCxB;;;OAGG;YACW,gBAAgB;IAsB9B,kFAAkF;IAC5E,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAMzF,mBAAmB;IACb,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAMzF,kBAAkB;IACZ,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAMxF,qBAAqB;IACf,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAQ3D,qEAAqE;IAC/D,SAAS,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GACnE,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAmB5F"}
|