medusa-plugin-veeqo 0.1.3
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/.medusa/server/medusa-config.js +29 -0
- package/.medusa/server/src/admin/index.js +686 -0
- package/.medusa/server/src/admin/index.mjs +685 -0
- package/.medusa/server/src/api/admin/veeqo/customers/[customerId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/customers/sync/route.js +16 -0
- package/.medusa/server/src/api/admin/veeqo/orders/[orderId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/orders/shipment-sync/route.js +30 -0
- package/.medusa/server/src/api/admin/veeqo/orders/sync/route.js +16 -0
- package/.medusa/server/src/api/admin/veeqo/products/[productId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/products/sync/route.js +14 -0
- package/.medusa/server/src/api/admin/veeqo/sales-channels/[salesChannelId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/sales-channels/sync/route.js +14 -0
- package/.medusa/server/src/api/admin/veeqo/shipments/[id]/tracking-events/route.js +20 -0
- package/.medusa/server/src/api/admin/veeqo/shipping-options/[shippingOptionId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/shipping-options/sync/route.js +14 -0
- package/.medusa/server/src/api/admin/veeqo/stock-locations/[stockLocationId]/sync/route.js +19 -0
- package/.medusa/server/src/api/admin/veeqo/stock-locations/sync/route.js +14 -0
- package/.medusa/server/src/api/middlewares.js +39 -0
- package/.medusa/server/src/api/validators.js +23 -0
- package/.medusa/server/src/jobs/veeqo-order-sync.js +34 -0
- package/.medusa/server/src/links/customer-veeqo-customer.js +18 -0
- package/.medusa/server/src/links/fulfillment-veeqo-shipment.js +18 -0
- package/.medusa/server/src/links/order-veeqo-order.js +18 -0
- package/.medusa/server/src/links/product-variant-veeqo-sellable.js +18 -0
- package/.medusa/server/src/links/product-veeqo-product.js +18 -0
- package/.medusa/server/src/links/sales-channel-veeqo-channel.js +18 -0
- package/.medusa/server/src/links/shipping-option-veeqo-delivery-method.js +18 -0
- package/.medusa/server/src/links/stock-location-veeqo-warehouse.js +18 -0
- package/.medusa/server/src/links/veeqo-channel-sales-channel.js +15 -0
- package/.medusa/server/src/links/veeqo-customer-customer.js +15 -0
- package/.medusa/server/src/links/veeqo-delivery-method.js +15 -0
- package/.medusa/server/src/links/veeqo-order-order.js +15 -0
- package/.medusa/server/src/links/veeqo-product-product.js +15 -0
- package/.medusa/server/src/links/veeqo-sellable-product-variant.js +15 -0
- package/.medusa/server/src/links/veeqo-shipment-fulfillment.js +15 -0
- package/.medusa/server/src/links/veeqo-warehouse-stock-location.js +15 -0
- package/.medusa/server/src/modules/veeqo/index.js +10 -0
- package/.medusa/server/src/modules/veeqo/migrations/Migration20260411222036.js +76 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-channel.js +10 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-customer.js +14 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-delivery-method.js +10 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-order.js +26 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-product.js +10 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-sellable.js +10 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-shipment.js +20 -0
- package/.medusa/server/src/modules/veeqo/models/veeqo-warehouse.js +10 -0
- package/.medusa/server/src/modules/veeqo/service.js +566 -0
- package/.medusa/server/src/modules/veeqo/types.js +3 -0
- package/.medusa/server/src/subscribers/veeqo-dispatcher.js +12 -0
- package/.medusa/server/src/workflows/channel.js +137 -0
- package/.medusa/server/src/workflows/customer.js +112 -0
- package/.medusa/server/src/workflows/delivery-method.js +116 -0
- package/.medusa/server/src/workflows/order.js +327 -0
- package/.medusa/server/src/workflows/product.js +163 -0
- package/.medusa/server/src/workflows/shipments.js +155 -0
- package/.medusa/server/src/workflows/warehouse.js +133 -0
- package/README.md +70 -0
- package/package.json +83 -0
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VeeqoService = void 0;
|
|
4
|
+
const async_sema_1 = require("async-sema");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
const veeqo_channel_1 = require("./models/veeqo-channel");
|
|
8
|
+
const veeqo_customer_1 = require("./models/veeqo-customer");
|
|
9
|
+
const veeqo_delivery_method_1 = require("./models/veeqo-delivery-method");
|
|
10
|
+
const veeqo_order_1 = require("./models/veeqo-order");
|
|
11
|
+
const veeqo_product_1 = require("./models/veeqo-product");
|
|
12
|
+
const veeqo_sellable_1 = require("./models/veeqo-sellable");
|
|
13
|
+
const veeqo_shipment_1 = require("./models/veeqo-shipment");
|
|
14
|
+
const veeqo_warehouse_1 = require("./models/veeqo-warehouse");
|
|
15
|
+
class VeeqoService extends (0, utils_1.MedusaService)({
|
|
16
|
+
VeeqoChannel: veeqo_channel_1.VeeqoChannel,
|
|
17
|
+
VeeqoCustomer: veeqo_customer_1.VeeqoCustomer,
|
|
18
|
+
VeeqoDeliveryMethod: veeqo_delivery_method_1.VeeqoDeliveryMethod,
|
|
19
|
+
VeeqoOrder: veeqo_order_1.VeeqoOrder,
|
|
20
|
+
VeeqoProduct: veeqo_product_1.VeeqoProduct,
|
|
21
|
+
VeeqoSellable: veeqo_sellable_1.VeeqoSellable,
|
|
22
|
+
VeeqoShipment: veeqo_shipment_1.VeeqoShipment,
|
|
23
|
+
VeeqoWarehouse: veeqo_warehouse_1.VeeqoWarehouse
|
|
24
|
+
}) {
|
|
25
|
+
constructor(container, options) {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
// The Veeqo API currently has a rate limit of 5 requests per second with a bucket size of 100.
|
|
28
|
+
// See https://developers.veeqo.com/getting-started/introduction/#limits
|
|
29
|
+
// The worker and main threads share the same account/api key, so throttle to 3 requests per second.
|
|
30
|
+
// This maximizes throughput but may very rarely result in a 429 if the bucket is full. In that case, the request will be retried with exponential backoff up to the number of times specified in options.retry.
|
|
31
|
+
this.rateLimit = (0, async_sema_1.RateLimit)(3);
|
|
32
|
+
this.delay = (durationMs) => new Promise(resolve => setTimeout(resolve, durationMs));
|
|
33
|
+
this.options_ = options;
|
|
34
|
+
this.logger_ = container.logger;
|
|
35
|
+
this.headers = {
|
|
36
|
+
...(this.options_.headers || {}),
|
|
37
|
+
'x-api-key': this.options_.apiKey
|
|
38
|
+
};
|
|
39
|
+
this.url = this.options_.veeqoUrl || 'https://api.veeqo.com';
|
|
40
|
+
}
|
|
41
|
+
async fetch(options, retry = this.options_.retry || 1) {
|
|
42
|
+
let { path, method = 'GET', body = null, ...rest } = options;
|
|
43
|
+
let headers = {};
|
|
44
|
+
if (this.headers) {
|
|
45
|
+
for (const [key, value] of Object.entries(this.headers)) {
|
|
46
|
+
headers[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (body && Object.keys(body).length != 0) {
|
|
50
|
+
headers['Accept'] = 'application/json';
|
|
51
|
+
headers['Content-Type'] = 'application/json';
|
|
52
|
+
body = JSON.stringify(options.body);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const id = setTimeout(() => controller.abort(), this.options_.timeout || 5000);
|
|
57
|
+
await this.rateLimit();
|
|
58
|
+
const response = await fetch(`${this.url}${path}`, {
|
|
59
|
+
method,
|
|
60
|
+
body,
|
|
61
|
+
headers,
|
|
62
|
+
...rest,
|
|
63
|
+
signal: controller.signal
|
|
64
|
+
});
|
|
65
|
+
clearTimeout(id);
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (retry > 0) {
|
|
70
|
+
await this.rateLimit();
|
|
71
|
+
// add exponential backoff with jitter
|
|
72
|
+
const backoffTime = Math.pow(2, this.options_.retry - retry) * 100 + Math.random() * 100;
|
|
73
|
+
this.logger_.warn(`[VEEQO]: Veeqo API request failed. Retrying in ${backoffTime}ms... (${retry} retries left)`);
|
|
74
|
+
await this.delay(backoffTime);
|
|
75
|
+
return await this.fetch(options, retry - 1);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return Promise.reject(err);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Fetches a channel from Veeqo by Veeqo Channel ID. Returns the Veeqo channel or null if not found.
|
|
84
|
+
*/
|
|
85
|
+
async fetchChannel(veeqoChannelId) {
|
|
86
|
+
return this.fetch({
|
|
87
|
+
path: `/channels/${veeqoChannelId}`,
|
|
88
|
+
method: 'GET'
|
|
89
|
+
})
|
|
90
|
+
.then(response => response.json())
|
|
91
|
+
.catch(err => {
|
|
92
|
+
this.logger_.error(err);
|
|
93
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo channel with veeqo_channel_id ${veeqoChannelId} not found`);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Fetches a customer from Veeqo by Veeqo Customer ID. Returns the Veeqo customer or null if not found.
|
|
98
|
+
*/
|
|
99
|
+
async fetchCustomer(veeqoCustomerId) {
|
|
100
|
+
return await this.fetch({
|
|
101
|
+
path: `/customers/${veeqoCustomerId}`,
|
|
102
|
+
method: 'GET'
|
|
103
|
+
})
|
|
104
|
+
.then(response => response.json())
|
|
105
|
+
.catch(err => {
|
|
106
|
+
this.logger_.error(err);
|
|
107
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo customer with veeqo_customer_id ${veeqoCustomerId} not found`);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Fetches a delivery method from Veeqo by Veeqo Delivery Method ID. Returns the Veeqo delivery method or null if not found.
|
|
112
|
+
*/
|
|
113
|
+
async fetchDeliveryMethod(veeqoDeliveryMethodId) {
|
|
114
|
+
return await this.fetch({
|
|
115
|
+
path: `/delivery_methods/${veeqoDeliveryMethodId}`,
|
|
116
|
+
method: 'GET'
|
|
117
|
+
})
|
|
118
|
+
.then(response => response.json())
|
|
119
|
+
.catch(err => {
|
|
120
|
+
this.logger_.error(err);
|
|
121
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo delivery method with veeqo_delivery_method_id ${veeqoDeliveryMethodId} not found`);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Fetches an order from Veeqo by Veeqo Order ID. Returns the Veeqo order or null if not found.
|
|
126
|
+
*/
|
|
127
|
+
async fetchOrder(veeqoOrderId) {
|
|
128
|
+
return await this.fetch({
|
|
129
|
+
path: `/orders/${veeqoOrderId}`,
|
|
130
|
+
method: 'GET'
|
|
131
|
+
})
|
|
132
|
+
.then(response => response.json())
|
|
133
|
+
.catch(err => {
|
|
134
|
+
this.logger_.error(err);
|
|
135
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo order with veeqo_order_id ${veeqoOrderId} not found`);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fetches a product from Veeqo by Veeqo Product ID. Returns the Veeqo product or null if not found.
|
|
140
|
+
*/
|
|
141
|
+
async fetchProduct(veeqoProductId) {
|
|
142
|
+
return await this.fetch({
|
|
143
|
+
path: `/products/${veeqoProductId}`,
|
|
144
|
+
method: 'GET'
|
|
145
|
+
})
|
|
146
|
+
.then(response => response.json())
|
|
147
|
+
.catch(err => {
|
|
148
|
+
this.logger_.error(err);
|
|
149
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo product with veeqo_product_id ${veeqoProductId} not found`);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Fetches a shipment from Veeqo by Veeqo Shipment ID. Returns the Veeqo shipment or null if not found.
|
|
154
|
+
*/
|
|
155
|
+
async fetchShipment(shipmentId) {
|
|
156
|
+
return await this.fetch({
|
|
157
|
+
path: `/shipments/${shipmentId}`,
|
|
158
|
+
method: 'GET'
|
|
159
|
+
})
|
|
160
|
+
.then(response => response.json())
|
|
161
|
+
.catch(err => {
|
|
162
|
+
this.logger_.error(err);
|
|
163
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo shipment with veeqo_shipment_id ${shipmentId} not found`);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Fetches tracking events for a shipment from Veeqo by Veeqo Shipment ID. Returns an array of tracking events.
|
|
168
|
+
*/
|
|
169
|
+
async fetchTrackingEvents(shipmentId) {
|
|
170
|
+
return await this.fetch({
|
|
171
|
+
path: `/shipments/tracking_events/${shipmentId}`,
|
|
172
|
+
method: 'GET'
|
|
173
|
+
})
|
|
174
|
+
.then(response => response.json())
|
|
175
|
+
.catch(err => {
|
|
176
|
+
this.logger_.error(err);
|
|
177
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Tracking events for shipment with veeqo_shipment_id ${shipmentId} not found`);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Fetches a warehouse (Stock Location) from Veeqo by Veeqo Warehouse ID. Returns the Veeqo warehouse or null if not found.
|
|
182
|
+
*/
|
|
183
|
+
async fetchWarehouse(warehouseId) {
|
|
184
|
+
return await this.fetch({
|
|
185
|
+
path: `/warehouses/${warehouseId}`,
|
|
186
|
+
method: 'GET'
|
|
187
|
+
})
|
|
188
|
+
.then(response => response.json())
|
|
189
|
+
.catch(err => {
|
|
190
|
+
this.logger_.error(err);
|
|
191
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo warehouse with veeqo_warehouse_id ${warehouseId} not found`);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Adds a channel to Veeqo and links it to the corresponding sales channel in Medusa. First argument is the Medusa sales channel ID, second argument is the input data to create the channel in Veeqo. Returns the created Veeqo channel.
|
|
196
|
+
*/
|
|
197
|
+
async addChannel(salesChannelId, channelInput) {
|
|
198
|
+
const veeqoChannel = (await this.fetch({
|
|
199
|
+
path: `/channels`,
|
|
200
|
+
method: 'POST',
|
|
201
|
+
body: { channel: channelInput }
|
|
202
|
+
})
|
|
203
|
+
.then(response => response.json())
|
|
204
|
+
.catch(err => this.logger_.error(err)));
|
|
205
|
+
if (!veeqoChannel?.id) {
|
|
206
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create channel in Veeqo for sales channel ${salesChannelId}`);
|
|
207
|
+
}
|
|
208
|
+
await this.createVeeqoChannels({
|
|
209
|
+
sales_channel_id: salesChannelId,
|
|
210
|
+
veeqo_channel_id: veeqoChannel.id
|
|
211
|
+
});
|
|
212
|
+
return veeqoChannel;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Adds a customer to Veeqo and links it to the corresponding customer in Medusa. First argument is the Medusa customer ID, second argument is the input data to create the customer in Veeqo. Returns the created Veeqo customer.
|
|
216
|
+
*/
|
|
217
|
+
async addCustomer(customerId, customerInput) {
|
|
218
|
+
const veeqoCustomer = (await this.fetch({
|
|
219
|
+
path: `/customers`,
|
|
220
|
+
method: 'POST',
|
|
221
|
+
body: { customer: customerInput }
|
|
222
|
+
})
|
|
223
|
+
.then(response => response.json())
|
|
224
|
+
.catch(err => this.logger_.error(err)));
|
|
225
|
+
if (!veeqoCustomer?.id) {
|
|
226
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create customer in Veeqo for customer ${customerId}`);
|
|
227
|
+
}
|
|
228
|
+
await this.createVeeqoCustomers({
|
|
229
|
+
customer_id: customerId,
|
|
230
|
+
veeqo_customer_id: veeqoCustomer.id
|
|
231
|
+
});
|
|
232
|
+
return veeqoCustomer;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Adds a delivery method to Veeqo and links it to the corresponding shipping option in Medusa. First argument is the Medusa shipping option ID, second argument is the input data to create the delivery method in Veeqo. Returns the created Veeqo delivery method.
|
|
236
|
+
*/
|
|
237
|
+
async addDeliveryMethod(shippingOptionId, deliveryMethodInput) {
|
|
238
|
+
const veeqoDeliveryMethod = (await this.fetch({
|
|
239
|
+
path: `/delivery_methods`,
|
|
240
|
+
method: 'POST',
|
|
241
|
+
body: deliveryMethodInput
|
|
242
|
+
})
|
|
243
|
+
.then(response => response.json())
|
|
244
|
+
.catch(err => this.logger_.error(err)));
|
|
245
|
+
if (!veeqoDeliveryMethod?.id) {
|
|
246
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create delivery method in Veeqo for shipping option ${shippingOptionId}`);
|
|
247
|
+
}
|
|
248
|
+
await this.createVeeqoDeliveryMethods({
|
|
249
|
+
shipping_option_id: shippingOptionId,
|
|
250
|
+
veeqo_delivery_method_id: veeqoDeliveryMethod.id
|
|
251
|
+
});
|
|
252
|
+
return veeqoDeliveryMethod;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Adds an order to Veeqo and links it to the corresponding order in Medusa. First argument is the Medusa order ID, second argument is the input data to create the order in Veeqo. Returns the created Veeqo order.
|
|
256
|
+
*/
|
|
257
|
+
async addOrder(orderId, orderInput) {
|
|
258
|
+
const veeqoOrder = (await this.fetch({
|
|
259
|
+
path: `/orders`,
|
|
260
|
+
method: 'POST',
|
|
261
|
+
body: { order: orderInput }
|
|
262
|
+
})
|
|
263
|
+
.then(response => response.json())
|
|
264
|
+
.catch(err => this.logger_.error(err)));
|
|
265
|
+
if (!veeqoOrder?.id) {
|
|
266
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create order in Veeqo for order ${orderId}`);
|
|
267
|
+
}
|
|
268
|
+
// Resolve the local VeeqoCustomer DB record so we can set the required FK
|
|
269
|
+
const dbCustomers = await this.listVeeqoCustomers({ veeqo_customer_id: orderInput.customer_id }, { take: 1 });
|
|
270
|
+
const dbCustomer = dbCustomers[0];
|
|
271
|
+
await this.createVeeqoOrders({
|
|
272
|
+
order_id: orderId,
|
|
273
|
+
veeqo_order_id: veeqoOrder.id,
|
|
274
|
+
...(dbCustomer ? { veeqo_customer_id: dbCustomer.id } : {})
|
|
275
|
+
});
|
|
276
|
+
return veeqoOrder;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Adds a product to Veeqo and links it to the corresponding product in Medusa. First argument is the Medusa product ID, second argument is the input data to create the product in Veeqo. Returns the created Veeqo product.
|
|
280
|
+
*/
|
|
281
|
+
async addProduct(product, productInput) {
|
|
282
|
+
const veeqoProduct = (await this.fetch({
|
|
283
|
+
path: `/products`,
|
|
284
|
+
method: 'POST',
|
|
285
|
+
body: { product: productInput }
|
|
286
|
+
})
|
|
287
|
+
.then(response => response.json())
|
|
288
|
+
.catch(err => this.logger_.error(err)));
|
|
289
|
+
if (!veeqoProduct?.id) {
|
|
290
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create product in Veeqo for product ${product.id}`);
|
|
291
|
+
}
|
|
292
|
+
await this.createVeeqoProducts({
|
|
293
|
+
product_id: product.id,
|
|
294
|
+
veeqo_product_id: veeqoProduct.id
|
|
295
|
+
});
|
|
296
|
+
for (const sellable of veeqoProduct.sellables) {
|
|
297
|
+
const matchingVariant = product.variants?.find(variant => variant.sku === sellable.sku_code);
|
|
298
|
+
if (matchingVariant) {
|
|
299
|
+
await this.createVeeqoSellables({
|
|
300
|
+
product_variant_id: matchingVariant.id,
|
|
301
|
+
veeqo_sellable_id: sellable.id
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
await this.addInfiniteStockForSellables(veeqoProduct.sellables);
|
|
306
|
+
return veeqoProduct;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Adds a warehouse (Stock Location) to Veeqo and links it to the corresponding warehouse in Medusa. First argument is the Medusa stock location ID, second argument is the input data to create the warehouse in Veeqo. Returns the created Veeqo warehouse.
|
|
310
|
+
*/
|
|
311
|
+
async addWarehouse(stockLocationId, warehouseInput) {
|
|
312
|
+
const veeqoWarehouse = (await this.fetch({
|
|
313
|
+
path: `/warehouses`,
|
|
314
|
+
method: 'POST',
|
|
315
|
+
body: warehouseInput
|
|
316
|
+
})
|
|
317
|
+
.then(response => response.json())
|
|
318
|
+
.catch(err => this.logger_.error(err)));
|
|
319
|
+
if (!veeqoWarehouse?.id) {
|
|
320
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to create warehouse in Veeqo for stock location ${stockLocationId}`);
|
|
321
|
+
}
|
|
322
|
+
await this.createVeeqoWarehouses({
|
|
323
|
+
stock_location_id: stockLocationId,
|
|
324
|
+
veeqo_warehouse_id: veeqoWarehouse.id
|
|
325
|
+
});
|
|
326
|
+
return veeqoWarehouse;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Updates a channel in Veeqo. First argument is the Veeqo channel ID, second argument is the input data to update the channel in Veeqo. Returns the updated Veeqo channel.
|
|
330
|
+
*/
|
|
331
|
+
async updateChannel(veeqoChannelId, veeqoChannelInput) {
|
|
332
|
+
const veeqoChannel = (await this.fetch({
|
|
333
|
+
path: `/channels/${veeqoChannelId}`,
|
|
334
|
+
method: 'PUT',
|
|
335
|
+
body: veeqoChannelInput
|
|
336
|
+
})
|
|
337
|
+
.then(response => response.json())
|
|
338
|
+
.catch(err => this.logger_.error(err)));
|
|
339
|
+
if (!veeqoChannel?.id) {
|
|
340
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update channel in Veeqo with Veeqo ID ${veeqoChannelId}`);
|
|
341
|
+
}
|
|
342
|
+
return veeqoChannel;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Updates a customer in Veeqo. First argument is the Veeqo customer ID, second argument is the input data to update the customer in Veeqo. Returns the updated Veeqo customer.
|
|
346
|
+
*/
|
|
347
|
+
async updateCustomer(veeqoCustomerId, veeqoCustomerInput) {
|
|
348
|
+
const veeqoCustomer = (await this.fetch({
|
|
349
|
+
path: `/customers/${veeqoCustomerId}`,
|
|
350
|
+
method: 'PUT',
|
|
351
|
+
body: { customer: veeqoCustomerInput }
|
|
352
|
+
})
|
|
353
|
+
.then(response => response.json())
|
|
354
|
+
.catch(err => this.logger_.error(err)));
|
|
355
|
+
if (!veeqoCustomer?.id) {
|
|
356
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update customer in Veeqo with Veeqo ID ${veeqoCustomerId}`);
|
|
357
|
+
}
|
|
358
|
+
return veeqoCustomer;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Updates a delivery method in Veeqo. First argument is the Veeqo delivery method ID, second argument is the input data to update the delivery method in Veeqo. Returns the updated Veeqo delivery method.
|
|
362
|
+
*/
|
|
363
|
+
async updateDeliveryMethod(veeqoDeliveryMethodId, veeqoDeliveryMethodInput) {
|
|
364
|
+
const veeqoDeliveryMethod = (await this.fetch({
|
|
365
|
+
path: `/delivery_methods/${veeqoDeliveryMethodId}`,
|
|
366
|
+
method: 'PUT',
|
|
367
|
+
body: veeqoDeliveryMethodInput
|
|
368
|
+
})
|
|
369
|
+
.then(response => response.json())
|
|
370
|
+
.catch(err => this.logger_.error(err)));
|
|
371
|
+
if (!veeqoDeliveryMethod?.id) {
|
|
372
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update delivery method in Veeqo with Veeqo ID ${veeqoDeliveryMethodId}`);
|
|
373
|
+
}
|
|
374
|
+
return veeqoDeliveryMethod;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Updates an order in Veeqo. First argument is the Veeqo order ID, second argument is the input data to update the order in Veeqo. Returns the updated Veeqo order.
|
|
378
|
+
*/
|
|
379
|
+
async updateOrder(veeqoOrderId, veeqoOrderInput) {
|
|
380
|
+
const veeqoOrder = (await this.fetch({
|
|
381
|
+
path: `/orders/${veeqoOrderId}`,
|
|
382
|
+
method: 'PUT',
|
|
383
|
+
body: { order: veeqoOrderInput }
|
|
384
|
+
})
|
|
385
|
+
.then(response => response.json())
|
|
386
|
+
.catch(err => this.logger_.error(err)));
|
|
387
|
+
if (!veeqoOrder?.id) {
|
|
388
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update order in Veeqo with Veeqo ID ${veeqoOrderId}`);
|
|
389
|
+
}
|
|
390
|
+
return veeqoOrder;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Updates a product in Veeqo. First argument is the Veeqo product ID, second argument is the input data to update the product in Veeqo. Returns the updated Veeqo product.
|
|
394
|
+
*/
|
|
395
|
+
async updateProduct(veeqoProductId, veeqoProductInput) {
|
|
396
|
+
const veeqoProduct = (await this.fetch({
|
|
397
|
+
path: `/products/${veeqoProductId}`,
|
|
398
|
+
method: 'PUT',
|
|
399
|
+
body: { product: veeqoProductInput }
|
|
400
|
+
})
|
|
401
|
+
.then(response => response.json())
|
|
402
|
+
.catch(err => this.logger_.error(err)));
|
|
403
|
+
if (!veeqoProduct?.id) {
|
|
404
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update product in Veeqo with Veeqo ID ${veeqoProductId}`);
|
|
405
|
+
}
|
|
406
|
+
const needStockEntryUpdate = veeqoProduct.sellables?.filter(sellable => {
|
|
407
|
+
sellable.inventory.infinite === false;
|
|
408
|
+
});
|
|
409
|
+
if (needStockEntryUpdate?.length)
|
|
410
|
+
await this.addInfiniteStockForSellables(needStockEntryUpdate);
|
|
411
|
+
return veeqoProduct;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Updates a warehouse (Stock Location) in Veeqo. First argument is the Veeqo warehouse ID, second argument is the input data to update the warehouse in Veeqo. Returns the updated Veeqo warehouse.
|
|
415
|
+
*/
|
|
416
|
+
async updateWarehouse(veeqoWarehouseId, veeqoWarehouseInput) {
|
|
417
|
+
const veeqoWarehouse = (await this.fetch({
|
|
418
|
+
path: `/warehouses/${veeqoWarehouseId}`,
|
|
419
|
+
method: 'PUT',
|
|
420
|
+
body: { warehouse: veeqoWarehouseInput }
|
|
421
|
+
})
|
|
422
|
+
.then(response => response.json())
|
|
423
|
+
.catch(err => this.logger_.error(err)));
|
|
424
|
+
if (!veeqoWarehouse?.id) {
|
|
425
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to update warehouse in Veeqo with Veeqo ID ${veeqoWarehouseId}`);
|
|
426
|
+
}
|
|
427
|
+
return veeqoWarehouse;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Deletes a channel in Veeqo by Medusa sales channel ID and unlinks it in Medusa.
|
|
431
|
+
*/
|
|
432
|
+
async deleteChannel(salesChannelId) {
|
|
433
|
+
const [veeqoChannel] = await this.listVeeqoChannels({ sales_channel_id: salesChannelId });
|
|
434
|
+
if (!veeqoChannel) {
|
|
435
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo channel linked to sales channel ${salesChannelId} not found`);
|
|
436
|
+
}
|
|
437
|
+
const { id, veeqo_channel_id } = veeqoChannel;
|
|
438
|
+
const success = await this.fetch({
|
|
439
|
+
path: `/channels/${veeqo_channel_id}`,
|
|
440
|
+
method: 'DELETE'
|
|
441
|
+
})
|
|
442
|
+
.then(async (response) => { await response.text(); return response.ok; })
|
|
443
|
+
.catch(err => this.logger_.error(err));
|
|
444
|
+
if (!success) {
|
|
445
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to delete channel in Veeqo with Veeqo ID ${veeqo_channel_id}`);
|
|
446
|
+
}
|
|
447
|
+
return this.deleteVeeqoChannels(id);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Deletes a customer in Veeqo by Medusa customer ID. Since Veeqo does not allow deleting customers, this only unlinks the customer in Medusa so it is no longer associated with the Veeqo customer.
|
|
451
|
+
*/
|
|
452
|
+
async deleteCustomer(customerId) {
|
|
453
|
+
const [veeqoCustomer] = await this.listVeeqoCustomers({ customer_id: customerId });
|
|
454
|
+
return this.deleteVeeqoCustomers(veeqoCustomer?.id);
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Deletes a delivery method in Veeqo by Medusa shipping option ID and unlinks it in Medusa.
|
|
458
|
+
*/
|
|
459
|
+
async deleteDeliveryMethod(shippingOptionId) {
|
|
460
|
+
const [veeqoDeliveryMethod] = await this.listVeeqoDeliveryMethods({
|
|
461
|
+
shipping_option_id: shippingOptionId
|
|
462
|
+
});
|
|
463
|
+
if (!veeqoDeliveryMethod) {
|
|
464
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo delivery method linked to shipping option ${shippingOptionId} not found`);
|
|
465
|
+
}
|
|
466
|
+
const { id, veeqo_delivery_method_id } = veeqoDeliveryMethod;
|
|
467
|
+
const success = await this.fetch({
|
|
468
|
+
path: `/delivery_methods/${veeqo_delivery_method_id}`,
|
|
469
|
+
method: 'DELETE'
|
|
470
|
+
})
|
|
471
|
+
.then(response => response.ok)
|
|
472
|
+
.catch(err => this.logger_.error(err));
|
|
473
|
+
if (!success) {
|
|
474
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to delete delivery method in Veeqo with Veeqo ID ${veeqo_delivery_method_id}`);
|
|
475
|
+
}
|
|
476
|
+
return this.deleteVeeqoDeliveryMethods(id);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Cancels an order in Veeqo by Medusa order ID and unlinks it in Medusa. Veeqo does not allow deleting orders, but canceling the order will hide it in the Veeqo interface.
|
|
480
|
+
*/
|
|
481
|
+
async deleteOrder(orderId, cancelReason = '') {
|
|
482
|
+
const [veeqoOrder] = await this.listVeeqoOrders({ order_id: orderId });
|
|
483
|
+
if (!veeqoOrder) {
|
|
484
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo order linked to order ${orderId} not found`);
|
|
485
|
+
}
|
|
486
|
+
const { id, veeqo_order_id } = veeqoOrder;
|
|
487
|
+
if (!cancelReason)
|
|
488
|
+
cancelReason = 'Cancelled from Medusa';
|
|
489
|
+
const success = await this.fetch({
|
|
490
|
+
path: `/orders/${veeqo_order_id}/cancel`,
|
|
491
|
+
method: 'PUT',
|
|
492
|
+
body: {
|
|
493
|
+
reason: cancelReason,
|
|
494
|
+
send_veeqo_email: false
|
|
495
|
+
}
|
|
496
|
+
})
|
|
497
|
+
.then(response => response.ok)
|
|
498
|
+
.catch(err => this.logger_.error(err));
|
|
499
|
+
if (!success) {
|
|
500
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to cancel order in Veeqo with Veeqo ID ${veeqo_order_id}`);
|
|
501
|
+
}
|
|
502
|
+
return this.deleteVeeqoOrders(id);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Deletes a product in Veeqo by Medusa product ID and unlinks it in Medusa.
|
|
506
|
+
*/
|
|
507
|
+
async deleteProduct(productId) {
|
|
508
|
+
const [veeqoProduct] = await this.listVeeqoProducts({ product_id: productId });
|
|
509
|
+
if (!veeqoProduct) {
|
|
510
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo product linked to product ${productId} not found`);
|
|
511
|
+
}
|
|
512
|
+
const { id, veeqo_product_id } = veeqoProduct;
|
|
513
|
+
const success = await this.fetch({
|
|
514
|
+
path: `/products/${veeqo_product_id}`,
|
|
515
|
+
method: 'DELETE'
|
|
516
|
+
})
|
|
517
|
+
.then(response => response.ok)
|
|
518
|
+
.catch(err => this.logger_.error(err));
|
|
519
|
+
if (!success) {
|
|
520
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to delete product in Veeqo with Veeqo ID ${veeqo_product_id}`);
|
|
521
|
+
}
|
|
522
|
+
return this.deleteVeeqoProducts(id);
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Deletes a warehouse (Stock Location) in Veeqo by Medusa stock location ID and unlinks it in Medusa.
|
|
526
|
+
*/
|
|
527
|
+
async deleteWarehouse(stockLocationId) {
|
|
528
|
+
const [veeqoWarehouse] = await this.listVeeqoWarehouses({
|
|
529
|
+
stock_location_id: stockLocationId
|
|
530
|
+
});
|
|
531
|
+
if (!veeqoWarehouse) {
|
|
532
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.NOT_FOUND, `Veeqo warehouse linked to stock location ${stockLocationId} not found`);
|
|
533
|
+
}
|
|
534
|
+
const { id, veeqo_warehouse_id } = veeqoWarehouse;
|
|
535
|
+
const success = await this.fetch({
|
|
536
|
+
path: `/warehouses/${veeqo_warehouse_id}`,
|
|
537
|
+
method: 'DELETE'
|
|
538
|
+
})
|
|
539
|
+
.then(response => response.ok)
|
|
540
|
+
.catch(err => this.logger_.error(err));
|
|
541
|
+
if (!success) {
|
|
542
|
+
throw new utils_2.MedusaError(utils_2.MedusaError.Types.UNEXPECTED_STATE, `Failed to delete warehouse in Veeqo with Veeqo ID ${veeqo_warehouse_id}`);
|
|
543
|
+
}
|
|
544
|
+
return this.deleteVeeqoWarehouses(id);
|
|
545
|
+
}
|
|
546
|
+
async addInfiniteStockForSellables(sellables) {
|
|
547
|
+
const warehouses = await this.listVeeqoWarehouses();
|
|
548
|
+
for (const sellable of sellables) {
|
|
549
|
+
const stockEntry = {
|
|
550
|
+
physical_stock_level: 200,
|
|
551
|
+
infinite: true
|
|
552
|
+
};
|
|
553
|
+
for (const warehouse of warehouses) {
|
|
554
|
+
await this.fetch({
|
|
555
|
+
path: `/sellables/${sellable.id}/warehouses/${warehouse.veeqo_warehouse_id}/stock_entry`,
|
|
556
|
+
method: 'PUT',
|
|
557
|
+
body: { stock_entry: stockEntry }
|
|
558
|
+
})
|
|
559
|
+
.then(response => response?.json())
|
|
560
|
+
.catch(err => this.logger_.error(err));
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
exports.VeeqoService = VeeqoService;
|
|
566
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ZlZXFvL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXNDO0FBQ3RDLHFEQUF5RDtBQUV6RCxxREFBdUQ7QUFxQnZELDBEQUFxRDtBQUNyRCw0REFBdUQ7QUFDdkQsMEVBQW9FO0FBQ3BFLHNEQUFpRDtBQUNqRCwwREFBcUQ7QUFDckQsNERBQXVEO0FBQ3ZELDREQUF1RDtBQUN2RCw4REFBeUQ7QUFrQnpELE1BQWEsWUFBYSxTQUFRLElBQUEscUJBQWEsRUFBQztJQUMvQyxZQUFZLEVBQVosNEJBQVk7SUFDWixhQUFhLEVBQWIsOEJBQWE7SUFDYixtQkFBbUIsRUFBbkIsMkNBQW1CO0lBQ25CLFVBQVUsRUFBVix3QkFBVTtJQUNWLFlBQVksRUFBWiw0QkFBWTtJQUNaLGFBQWEsRUFBYiw4QkFBYTtJQUNiLGFBQWEsRUFBYiw4QkFBYTtJQUNiLGNBQWMsRUFBZCxnQ0FBYztDQUNkLENBQUM7SUFZRCxZQUNDLFNBRUMsRUFDRCxPQUFxQjtRQUVyQixLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQTtRQWZwQiwrRkFBK0Y7UUFDL0Ysd0VBQXdFO1FBQ3hFLG9HQUFvRztRQUNwRyxnTkFBZ047UUFDeE0sY0FBUyxHQUFHLElBQUEsc0JBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUN4QixVQUFLLEdBQUcsQ0FBQyxVQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQVc5RixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUE7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNkLEdBQUcsQ0FBQyxJ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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy92ZWVxby90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = veeqoDispatchHandler;
|
|
5
|
+
const order_1 = require("../workflows/order");
|
|
6
|
+
exports.config = {
|
|
7
|
+
event: 'order.placed'
|
|
8
|
+
};
|
|
9
|
+
async function veeqoDispatchHandler({ event: { data: { id: orderId } }, container }) {
|
|
10
|
+
await (0, order_1.syncOrderToVeeqoWorkflow)(container).run({ input: orderId });
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVlcW8tZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy92ZWVxby1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLHVDQU9DO0FBYkQsOENBQTZEO0FBRWhELFFBQUEsTUFBTSxHQUFxQjtJQUN2QyxLQUFLLEVBQUUsY0FBYztDQUNyQixDQUFBO0FBRWMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEVBQ2xELEtBQUssRUFBRSxFQUNOLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFDckIsRUFDRCxTQUFTLEVBQ3VCO0lBQ2hDLE1BQU0sSUFBQSxnQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtBQUNsRSxDQUFDIn0=
|