@things-factory/integration-sellercraft 8.0.0-beta.9 → 8.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/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
- package/server/constants/index.ts +2 -0
- package/server/constants/order-status-mapping.ts +28 -0
- package/server/constants/platform.ts +6 -0
- package/server/controllers/index.ts +5 -0
- package/server/controllers/sellercraft/apis/add-inbound-order.ts +50 -0
- package/server/controllers/sellercraft/apis/echo.ts +14 -0
- package/server/controllers/sellercraft/apis/fetch-order-document.ts +18 -0
- package/server/controllers/sellercraft/apis/index.ts +8 -0
- package/server/controllers/sellercraft/apis/initiate-order-document.ts +17 -0
- package/server/controllers/sellercraft/apis/initiate-order-shipment.ts +29 -0
- package/server/controllers/sellercraft/apis/pack-marketplace-order.ts +35 -0
- package/server/controllers/sellercraft/apis/update-marketplace-order.ts +14 -0
- package/server/controllers/sellercraft/apis/update-product.ts +21 -0
- package/server/controllers/sellercraft/index.ts +7 -0
- package/server/controllers/sellercraft/platform-action.ts +39 -0
- package/server/controllers/sellercraft/sellercraft.ts +109 -0
- package/server/controllers/sellercraft-api/decorators.ts +52 -0
- package/server/controllers/sellercraft-api/index.ts +51 -0
- package/server/controllers/sellercraft-api/types.ts +0 -0
- package/server/controllers/sellercraft-channel-integration/apis/echo.ts +14 -0
- package/server/controllers/sellercraft-channel-integration/apis/index.ts +6 -0
- package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.ts +37 -0
- package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-category-attributes.ts +65 -0
- package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.ts +62 -0
- package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.ts +92 -0
- package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.ts +97 -0
- package/server/controllers/sellercraft-channel-integration/index.ts +7 -0
- package/server/controllers/sellercraft-channel-integration/platform-action.ts +39 -0
- package/server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.ts +115 -0
- package/server/controllers/sellercraft-channel-integration-api/decorators.ts +45 -0
- package/server/controllers/sellercraft-channel-integration-api/index.ts +45 -0
- package/server/controllers/sellercraft-channel-integration-api/types.ts +0 -0
- package/server/index.ts +7 -0
- package/server/middlewares/index.ts +3 -0
- package/server/migrations/index.ts +9 -0
- package/server/routers/sellercraft-router.ts +326 -0
- package/server/routes.ts +32 -0
- package/server/service/index.ts +23 -0
- package/server/service/marketplace-channel/index.ts +6 -0
- package/server/service/marketplace-channel/marketplace-channel-order-mutation.ts +456 -0
- package/server/service/marketplace-channel/marketplace-channel-product-mutation.ts +282 -0
- package/server/service/marketplace-channel/marketplace-channel.ts +76 -0
- package/server/service/sellercraft/index.ts +6 -0
- package/server/service/sellercraft/sellercraft-mutation.ts +126 -0
- package/server/service/sellercraft/sellercraft-query.ts +43 -0
- package/server/service/sellercraft/sellercraft-type.ts +54 -0
- package/server/service/sellercraft/sellercraft.ts +96 -0
- package/server/utils/tokencraft-util.ts +60 -0
- package/tsconfig.json +9 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/integration-sellercraft",
|
3
|
-
"version": "8.0.0
|
3
|
+
"version": "8.0.0",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -24,18 +24,18 @@
|
|
24
24
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create ./server/migrations/migration"
|
25
25
|
},
|
26
26
|
"dependencies": {
|
27
|
-
"@operato/data-grist": "^8.0.0
|
28
|
-
"@things-factory/apptool-ui": "^8.0.0
|
29
|
-
"@things-factory/auth-ui": "^8.0.0
|
30
|
-
"@things-factory/biz-base": "^8.0.0
|
31
|
-
"@things-factory/code-ui": "^8.0.0
|
32
|
-
"@things-factory/context-ui": "^8.0.0
|
33
|
-
"@things-factory/i18n-base": "^8.0.0
|
34
|
-
"@things-factory/integration-marketplace": "^8.0.0
|
35
|
-
"@things-factory/integration-ui": "^8.0.0
|
36
|
-
"@things-factory/more-ui": "^8.0.0
|
37
|
-
"@things-factory/resource-ui": "^8.0.0
|
38
|
-
"@things-factory/setting-ui": "^8.0.0
|
27
|
+
"@operato/data-grist": "^8.0.0",
|
28
|
+
"@things-factory/apptool-ui": "^8.0.0",
|
29
|
+
"@things-factory/auth-ui": "^8.0.0",
|
30
|
+
"@things-factory/biz-base": "^8.0.0",
|
31
|
+
"@things-factory/code-ui": "^8.0.0",
|
32
|
+
"@things-factory/context-ui": "^8.0.0",
|
33
|
+
"@things-factory/i18n-base": "^8.0.0",
|
34
|
+
"@things-factory/integration-marketplace": "^8.0.0",
|
35
|
+
"@things-factory/integration-ui": "^8.0.0",
|
36
|
+
"@things-factory/more-ui": "^8.0.0",
|
37
|
+
"@things-factory/resource-ui": "^8.0.0",
|
38
|
+
"@things-factory/setting-ui": "^8.0.0",
|
39
39
|
"debug": "^4.1.1",
|
40
40
|
"node-fetch": "^2.6.0"
|
41
41
|
},
|
@@ -49,5 +49,5 @@
|
|
49
49
|
"nock": "^13.0.2",
|
50
50
|
"should": "^13.2.3"
|
51
51
|
},
|
52
|
-
"gitHead": "
|
52
|
+
"gitHead": "07ef27d272dd9a067a9648ac7013748510556a18"
|
53
53
|
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
export const ORDER_STATUS = {
|
2
|
+
pending: 'CONFIRMED',
|
3
|
+
payment_pending: 'PAYMENT_PENDING',
|
4
|
+
ready_to_ship: 'READY_TO_SHIP',
|
5
|
+
processing: 'CONFIRMED',
|
6
|
+
shipped: 'SHIPPED',
|
7
|
+
completed: 'DELIVERED',
|
8
|
+
cancelled: 'CANCELLED',
|
9
|
+
canceled: 'CANCELLED',
|
10
|
+
refunded: 'REFUND_COMPLETE',
|
11
|
+
failed: 'SHIPMENT_LOST_OR_DAMAGED',
|
12
|
+
refund: 'REFUND_COMPLETE',
|
13
|
+
ttk_100: 'PAYMENT_PENDING', // UNPAID
|
14
|
+
ttk_111: 'CONFIRMED', // AWAITING_SHIPMENT
|
15
|
+
ttk_112: 'READY_TO_SHIP', // AWAITING_COLLECTION
|
16
|
+
ttk_121: 'SHIPPED', // IN_TRANSIT
|
17
|
+
ttk_122: 'DELIVERED', // DELIVERED
|
18
|
+
ttk_130: 'CLOSED', // COMPLETED
|
19
|
+
ttk_140: 'CANCELLED', // CANCELLED
|
20
|
+
ttk_201: 'INITIATED_CANCELLATION', // CANCEL_PENDING
|
21
|
+
ttk_202: '', // CANCEL_REJECT
|
22
|
+
ttk_203: 'CANCELLED' // CANCEL_COMPLETED
|
23
|
+
}
|
24
|
+
|
25
|
+
export const SHIPPING_TYPE = {
|
26
|
+
DROP_SHIPPING: 'DROP_SHIPPING',
|
27
|
+
CROSS_DOCKING_PICKUP: 'CROSS_DOCKING_PICKUP'
|
28
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY3OTk0Mjg-register-product-inbound */
|
2
|
+
|
3
|
+
export function addInboundOrder() {
|
4
|
+
return {
|
5
|
+
method: 'post',
|
6
|
+
path: '/product/inbound',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId, inboundId, inboundTime, inboundType, purchaseOrderId, sellercraftOPs } = req
|
9
|
+
|
10
|
+
let orderInformation: any = {}
|
11
|
+
orderInformation.account_id = accountId
|
12
|
+
orderInformation.inbound_id = inboundId
|
13
|
+
orderInformation.inbound_time = inboundTime
|
14
|
+
orderInformation.inbound_type = inboundType
|
15
|
+
orderInformation.purchase_order_id = purchaseOrderId
|
16
|
+
|
17
|
+
let products: any[] = sellercraftOPs.map(orderProduct => {
|
18
|
+
const { packageDimension, forceCreateProduct } = orderProduct
|
19
|
+
let sellercraftOP: any = {}
|
20
|
+
sellercraftOP.sku = orderProduct.sku
|
21
|
+
sellercraftOP.unit_of_measure = orderProduct.uom
|
22
|
+
sellercraftOP.purchase_order_quantity = orderProduct.purchaseOrderQty
|
23
|
+
sellercraftOP.received_quantity = orderProduct.receivedQty
|
24
|
+
sellercraftOP.batch_number = orderProduct.batchId
|
25
|
+
sellercraftOP.expiry_time = orderProduct?.expiryTime ? orderProduct.expiryTime : 0
|
26
|
+
sellercraftOP.force_create_product = forceCreateProduct
|
27
|
+
sellercraftOP.product_name = orderProduct.productName
|
28
|
+
sellercraftOP.gtin = orderProduct.gtin
|
29
|
+
sellercraftOP.package_weight_gm = orderProduct.weight
|
30
|
+
sellercraftOP.package_dimensions = {
|
31
|
+
length_mm: packageDimension.length,
|
32
|
+
width_mm: packageDimension.width,
|
33
|
+
height_mm: packageDimension.height
|
34
|
+
}
|
35
|
+
|
36
|
+
return sellercraftOP
|
37
|
+
})
|
38
|
+
|
39
|
+
return {
|
40
|
+
payload: {
|
41
|
+
...orderInformation,
|
42
|
+
products
|
43
|
+
}
|
44
|
+
}
|
45
|
+
},
|
46
|
+
normalize(res) {
|
47
|
+
return res
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4ODQxNTc-fetch-order-documents */
|
2
|
+
|
3
|
+
export function fetchOrderDocument() {
|
4
|
+
return {
|
5
|
+
method: 'get',
|
6
|
+
path: '/order/documents',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId: account_id, orderId: order_id, packageId: package_id } = req
|
9
|
+
return {
|
10
|
+
payload: { account_id, order_id, package_id }
|
11
|
+
}
|
12
|
+
},
|
13
|
+
normalize(res) {
|
14
|
+
const { documents, tracking_no: trackingNo, shipper_name: transporter } = res.data
|
15
|
+
return { documents, trackingNo, transporter }
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export * from './echo'
|
2
|
+
export * from './add-inbound-order'
|
3
|
+
export * from './fetch-order-document'
|
4
|
+
export * from './initiate-order-document'
|
5
|
+
export * from './initiate-order-shipment'
|
6
|
+
export * from './pack-marketplace-order'
|
7
|
+
export * from './update-marketplace-order'
|
8
|
+
export * from './update-product'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4ODAzMjg-initiate-order-documents */
|
2
|
+
|
3
|
+
export function initiateOrderDocument() {
|
4
|
+
return {
|
5
|
+
method: 'post',
|
6
|
+
path: '/order/documents',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId: account_id, orderId: order_id, packageId: package_id } = req
|
9
|
+
return {
|
10
|
+
payload: { account_id, order_id, package_id }
|
11
|
+
}
|
12
|
+
},
|
13
|
+
normalize(res) {
|
14
|
+
return res
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4NjQxODU-initiate-order-shipment */
|
2
|
+
|
3
|
+
export function initiateOrderShipment() {
|
4
|
+
return {
|
5
|
+
method: 'post',
|
6
|
+
path: '/order/ship',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId: account_id, orderId: order_id, packageId: package_id } = req
|
9
|
+
return {
|
10
|
+
payload: { account_id, order_id, package_id }
|
11
|
+
}
|
12
|
+
},
|
13
|
+
normalize(res) {
|
14
|
+
const {
|
15
|
+
handover_type: handOverType,
|
16
|
+
pickup_time: pickupTime,
|
17
|
+
pickup_address: pickupAddress,
|
18
|
+
dropoff_address: dropoffAddress
|
19
|
+
} = res.data
|
20
|
+
|
21
|
+
return {
|
22
|
+
handOverType,
|
23
|
+
pickupTime,
|
24
|
+
pickupAddress,
|
25
|
+
dropoffAddress
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4NTc0NjI-pack-an-order */
|
2
|
+
|
3
|
+
export function packMarketplaceOrder() {
|
4
|
+
return {
|
5
|
+
method: 'post',
|
6
|
+
path: '/order/pack',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId: account_id, orderId: order_id, sellercraftOPs } = req
|
9
|
+
|
10
|
+
const items: any[] = sellercraftOPs.map(orderProduct => {
|
11
|
+
return {
|
12
|
+
sku: orderProduct.sku,
|
13
|
+
quantity: orderProduct.releaseQty,
|
14
|
+
unit_of_measure: orderProduct.uom
|
15
|
+
}
|
16
|
+
})
|
17
|
+
|
18
|
+
let packages: any[] = []
|
19
|
+
packages.push({ items })
|
20
|
+
|
21
|
+
return {
|
22
|
+
payload: {
|
23
|
+
account_id,
|
24
|
+
order_id,
|
25
|
+
packages
|
26
|
+
}
|
27
|
+
}
|
28
|
+
},
|
29
|
+
normalize(res) {
|
30
|
+
const { packages } = res.data
|
31
|
+
const packageId: string = packages[0].package_id
|
32
|
+
return packageId
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4OTA0NDM-amend-an-order */
|
2
|
+
|
3
|
+
export function updateMarketplaceOrder() {
|
4
|
+
return {
|
5
|
+
method: 'put',
|
6
|
+
path: '/order',
|
7
|
+
denormalize(req) {
|
8
|
+
return req
|
9
|
+
},
|
10
|
+
normalize(res) {
|
11
|
+
return res
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4OTE3MTA-update-product */
|
2
|
+
|
3
|
+
export function updateProduct() {
|
4
|
+
return {
|
5
|
+
method: 'put',
|
6
|
+
path: '/product',
|
7
|
+
denormalize(req) {
|
8
|
+
const { accountId, sellercraftInv } = req
|
9
|
+
|
10
|
+
return {
|
11
|
+
payload: {
|
12
|
+
account_id: accountId,
|
13
|
+
products: sellercraftInv
|
14
|
+
}
|
15
|
+
}
|
16
|
+
},
|
17
|
+
normalize(res) {
|
18
|
+
return res
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { config } from '@things-factory/env'
|
2
|
+
|
3
|
+
import { Sellercraft } from './sellercraft'
|
4
|
+
|
5
|
+
const sellercraftConfig = config.get('sellercraftIntegrationConfig', {})
|
6
|
+
const { apiKey } = sellercraftConfig
|
7
|
+
|
8
|
+
function substitute(path, obj) {
|
9
|
+
var props = []
|
10
|
+
var re = /{([^}]+)}/g
|
11
|
+
var text
|
12
|
+
|
13
|
+
while ((text = re.exec(path))) {
|
14
|
+
props.push(text[1])
|
15
|
+
}
|
16
|
+
|
17
|
+
var result = path
|
18
|
+
props.forEach(prop => {
|
19
|
+
let value = obj[prop.trim()]
|
20
|
+
result = result.replace(`{${prop}}`, value === undefined ? '' : value)
|
21
|
+
})
|
22
|
+
|
23
|
+
return result
|
24
|
+
}
|
25
|
+
|
26
|
+
export const action = async ({ method = 'get', path, request }) => {
|
27
|
+
const client = new Sellercraft({ apiKey })
|
28
|
+
|
29
|
+
const { resource = {}, payload = {} } = request
|
30
|
+
|
31
|
+
path = substitute(path, resource)
|
32
|
+
|
33
|
+
var response = await client[method](path, payload)
|
34
|
+
if (response.errors) {
|
35
|
+
throw response
|
36
|
+
}
|
37
|
+
|
38
|
+
return response
|
39
|
+
}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
import fetch from 'node-fetch'
|
2
|
+
import { v4 as uuidv4 } from 'uuid'
|
3
|
+
|
4
|
+
const debug = require('debug')('things-factory:integration-sellercraft:sellercraft')
|
5
|
+
|
6
|
+
export type SellercraftConfig = {
|
7
|
+
apiKey: string
|
8
|
+
}
|
9
|
+
|
10
|
+
export class Sellercraft {
|
11
|
+
private config: SellercraftConfig
|
12
|
+
|
13
|
+
constructor(config: SellercraftConfig) {
|
14
|
+
this.config = {
|
15
|
+
...config
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
getBaseUrl() {
|
20
|
+
return `https://open.sellercraft.co/v1`
|
21
|
+
}
|
22
|
+
|
23
|
+
generateRequestId() {
|
24
|
+
return uuidv4()
|
25
|
+
}
|
26
|
+
|
27
|
+
async post(path: string, data: any = {}) {
|
28
|
+
const { apiKey } = this.config
|
29
|
+
|
30
|
+
debug('data', data)
|
31
|
+
|
32
|
+
const jsondata = JSON.stringify(data)
|
33
|
+
const requestId: string = this.generateRequestId()
|
34
|
+
const fullPath: string = `${this.getBaseUrl()}${path}`
|
35
|
+
|
36
|
+
const response: any = await fetch(fullPath, {
|
37
|
+
method: 'post',
|
38
|
+
headers: {
|
39
|
+
'Content-Type': 'application/json',
|
40
|
+
request_id: requestId,
|
41
|
+
'x-api-key': apiKey
|
42
|
+
},
|
43
|
+
body: jsondata
|
44
|
+
})
|
45
|
+
|
46
|
+
if (response.ok) {
|
47
|
+
return await response.json()
|
48
|
+
} else {
|
49
|
+
const result = await response.text()
|
50
|
+
throw new Error(`(${response.status}) ${result}`)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
async put(path: string, data: any = {}) {
|
55
|
+
const { apiKey } = this.config
|
56
|
+
|
57
|
+
const jsondata = JSON.stringify(data)
|
58
|
+
const requestId: string = this.generateRequestId()
|
59
|
+
const fullPath: string = `${this.getBaseUrl()}${path}`
|
60
|
+
debug('data', data)
|
61
|
+
|
62
|
+
const response: any = await fetch(fullPath, {
|
63
|
+
method: 'put',
|
64
|
+
headers: {
|
65
|
+
'Content-Type': 'application/json',
|
66
|
+
request_id: requestId,
|
67
|
+
'x-api-key': apiKey
|
68
|
+
},
|
69
|
+
body: jsondata
|
70
|
+
})
|
71
|
+
|
72
|
+
if (response.ok) {
|
73
|
+
return await response.json()
|
74
|
+
} else {
|
75
|
+
const result = await response.text()
|
76
|
+
throw new Error(`(${response.status}) ${result}`)
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
async get(path: string, data: any = {}) {
|
81
|
+
const { apiKey } = this.config
|
82
|
+
|
83
|
+
const qs = Object.entries(data)
|
84
|
+
.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`)
|
85
|
+
.join('&')
|
86
|
+
|
87
|
+
const fullPath: string = `${this.getBaseUrl()}${path}`
|
88
|
+
const endpoint = `${fullPath}${qs ? '?' + qs : ''}`
|
89
|
+
debug('endpoint', endpoint)
|
90
|
+
|
91
|
+
const requestId: string = this.generateRequestId()
|
92
|
+
|
93
|
+
const response: any = await fetch(endpoint, {
|
94
|
+
method: 'get',
|
95
|
+
headers: {
|
96
|
+
'Content-Type': 'application/json',
|
97
|
+
request_id: requestId,
|
98
|
+
'x-api-key': apiKey
|
99
|
+
}
|
100
|
+
})
|
101
|
+
|
102
|
+
if (response.ok) {
|
103
|
+
return await response.json()
|
104
|
+
} else {
|
105
|
+
const result = await response.text()
|
106
|
+
throw new Error(`(${response.status}) ${result}`)
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import Debug from 'debug'
|
2
|
+
const debug = Debug('things-factory:integration-marketplace:store-api-decorator')
|
3
|
+
|
4
|
+
import { Sellercraft } from '../../service'
|
5
|
+
import { createPayloadLog } from '@things-factory/integration-base'
|
6
|
+
|
7
|
+
const NOOP = v => v
|
8
|
+
|
9
|
+
export const api = (target: Object, property: string, descriptor: TypedPropertyDescriptor<any>): any => {
|
10
|
+
const method = descriptor.value
|
11
|
+
|
12
|
+
descriptor.value = async function (store: Sellercraft, request) {
|
13
|
+
const SellercraftAPI = this
|
14
|
+
|
15
|
+
var { platform } = store
|
16
|
+
|
17
|
+
var { action: platformAction, apis } = SellercraftAPI.getPlatform(platform)
|
18
|
+
|
19
|
+
var m = apis[method.name]
|
20
|
+
if (!m) {
|
21
|
+
throw Error(`Sellercraft doesn't have API ${method.name}`)
|
22
|
+
}
|
23
|
+
|
24
|
+
var {
|
25
|
+
path,
|
26
|
+
method: httpMethod = 'post',
|
27
|
+
denormalize = NOOP,
|
28
|
+
normalize = NOOP,
|
29
|
+
action = platformAction
|
30
|
+
} = m.apply(this, [request])
|
31
|
+
|
32
|
+
var denormalized = await denormalize(request || {}, { store })
|
33
|
+
debug('request', denormalized)
|
34
|
+
|
35
|
+
try {
|
36
|
+
var response = await action.apply(this, [
|
37
|
+
{ store, method: httpMethod, path, request: denormalized, platformAction }
|
38
|
+
])
|
39
|
+
|
40
|
+
createPayloadLog(store.accountId, path, denormalized, response, request?.context)
|
41
|
+
|
42
|
+
debug('response', response)
|
43
|
+
|
44
|
+
return await normalize(response, { store })
|
45
|
+
} catch (error) {
|
46
|
+
createPayloadLog(store.accountId, path, denormalized, error, request?.context)
|
47
|
+
throw error
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
return descriptor
|
52
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { getRepository } from '@things-factory/shell'
|
2
|
+
|
3
|
+
import { Sellercraft } from '../../service'
|
4
|
+
import { api } from './decorators'
|
5
|
+
|
6
|
+
export class SellercraftAPI {
|
7
|
+
static platforms = {}
|
8
|
+
|
9
|
+
static registerPlatform(name, action, apis) {
|
10
|
+
SellercraftAPI.platforms[name] = {
|
11
|
+
action,
|
12
|
+
apis
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
static getPlatform(name) {
|
17
|
+
return SellercraftAPI.platforms[name]
|
18
|
+
}
|
19
|
+
|
20
|
+
static async getSellercraft(id) {
|
21
|
+
const repository = getRepository(Sellercraft)
|
22
|
+
return await repository.findOne({
|
23
|
+
where: { id },
|
24
|
+
relations: ['domain']
|
25
|
+
})
|
26
|
+
}
|
27
|
+
|
28
|
+
@api
|
29
|
+
static echo(sellercraft, req): any {}
|
30
|
+
|
31
|
+
@api
|
32
|
+
static addInboundOrder(sellercraft, req): any {}
|
33
|
+
|
34
|
+
@api
|
35
|
+
static fetchOrderDocument(sellercraft, req): any {}
|
36
|
+
|
37
|
+
@api
|
38
|
+
static initiateOrderDocument(sellercraft, req): any {}
|
39
|
+
|
40
|
+
@api
|
41
|
+
static initiateOrderShipment(sellercraft, req): any {}
|
42
|
+
|
43
|
+
@api
|
44
|
+
static packMarketplaceOrder(sellercraft, req): any {}
|
45
|
+
|
46
|
+
@api
|
47
|
+
static updateMarketplaceOrder(sellercraft, req): any {}
|
48
|
+
|
49
|
+
@api
|
50
|
+
static updateProduct(sellercraft, req): any {}
|
51
|
+
}
|
File without changes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
/* https://docs.sellercraft.co/docs/api-integrations/b3A6MTY4NjQxODU-initiate-order-shipment */
|
2
|
+
|
3
|
+
export function ingestChannelCategories() {
|
4
|
+
return {
|
5
|
+
method: 'post',
|
6
|
+
path: '/channel/ingest/category',
|
7
|
+
denormalize(req) {
|
8
|
+
const { categories } = req
|
9
|
+
|
10
|
+
let newCategories = mapCategories(categories)
|
11
|
+
|
12
|
+
return {
|
13
|
+
payload: [...newCategories]
|
14
|
+
}
|
15
|
+
},
|
16
|
+
normalize(res) {
|
17
|
+
return res
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
function mapCategories(categories) {
|
23
|
+
if (!categories) return null
|
24
|
+
categories = categories.map(category => {
|
25
|
+
let children_categories = mapCategories(category.childrenCategories)
|
26
|
+
return {
|
27
|
+
native_category_id: category.categoryId.toString(),
|
28
|
+
channel_code: category.channelCode,
|
29
|
+
channel_country: category.countryCode,
|
30
|
+
category_name: category.categoryName,
|
31
|
+
is_leaf: children_categories.length == 0 ? true : false,
|
32
|
+
is_active: category.isActive,
|
33
|
+
children_categories
|
34
|
+
}
|
35
|
+
})
|
36
|
+
return categories
|
37
|
+
}
|