@things-factory/integration-sellercraft 8.0.0-beta.9 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +14 -14
  3. package/server/constants/index.ts +2 -0
  4. package/server/constants/order-status-mapping.ts +28 -0
  5. package/server/constants/platform.ts +6 -0
  6. package/server/controllers/index.ts +5 -0
  7. package/server/controllers/sellercraft/apis/add-inbound-order.ts +50 -0
  8. package/server/controllers/sellercraft/apis/echo.ts +14 -0
  9. package/server/controllers/sellercraft/apis/fetch-order-document.ts +18 -0
  10. package/server/controllers/sellercraft/apis/index.ts +8 -0
  11. package/server/controllers/sellercraft/apis/initiate-order-document.ts +17 -0
  12. package/server/controllers/sellercraft/apis/initiate-order-shipment.ts +29 -0
  13. package/server/controllers/sellercraft/apis/pack-marketplace-order.ts +35 -0
  14. package/server/controllers/sellercraft/apis/update-marketplace-order.ts +14 -0
  15. package/server/controllers/sellercraft/apis/update-product.ts +21 -0
  16. package/server/controllers/sellercraft/index.ts +7 -0
  17. package/server/controllers/sellercraft/platform-action.ts +39 -0
  18. package/server/controllers/sellercraft/sellercraft.ts +109 -0
  19. package/server/controllers/sellercraft-api/decorators.ts +52 -0
  20. package/server/controllers/sellercraft-api/index.ts +51 -0
  21. package/server/controllers/sellercraft-api/types.ts +0 -0
  22. package/server/controllers/sellercraft-channel-integration/apis/echo.ts +14 -0
  23. package/server/controllers/sellercraft-channel-integration/apis/index.ts +6 -0
  24. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.ts +37 -0
  25. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-category-attributes.ts +65 -0
  26. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.ts +62 -0
  27. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.ts +92 -0
  28. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.ts +97 -0
  29. package/server/controllers/sellercraft-channel-integration/index.ts +7 -0
  30. package/server/controllers/sellercraft-channel-integration/platform-action.ts +39 -0
  31. package/server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.ts +115 -0
  32. package/server/controllers/sellercraft-channel-integration-api/decorators.ts +45 -0
  33. package/server/controllers/sellercraft-channel-integration-api/index.ts +45 -0
  34. package/server/controllers/sellercraft-channel-integration-api/types.ts +0 -0
  35. package/server/index.ts +7 -0
  36. package/server/middlewares/index.ts +3 -0
  37. package/server/migrations/index.ts +9 -0
  38. package/server/routers/sellercraft-router.ts +326 -0
  39. package/server/routes.ts +32 -0
  40. package/server/service/index.ts +23 -0
  41. package/server/service/marketplace-channel/index.ts +6 -0
  42. package/server/service/marketplace-channel/marketplace-channel-order-mutation.ts +456 -0
  43. package/server/service/marketplace-channel/marketplace-channel-product-mutation.ts +282 -0
  44. package/server/service/marketplace-channel/marketplace-channel.ts +76 -0
  45. package/server/service/sellercraft/index.ts +6 -0
  46. package/server/service/sellercraft/sellercraft-mutation.ts +126 -0
  47. package/server/service/sellercraft/sellercraft-query.ts +43 -0
  48. package/server/service/sellercraft/sellercraft-type.ts +54 -0
  49. package/server/service/sellercraft/sellercraft.ts +96 -0
  50. package/server/utils/tokencraft-util.ts +60 -0
  51. 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-beta.9",
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-beta",
28
- "@things-factory/apptool-ui": "^8.0.0-beta.9",
29
- "@things-factory/auth-ui": "^8.0.0-beta.9",
30
- "@things-factory/biz-base": "^8.0.0-beta.9",
31
- "@things-factory/code-ui": "^8.0.0-beta.9",
32
- "@things-factory/context-ui": "^8.0.0-beta.9",
33
- "@things-factory/i18n-base": "^8.0.0-beta.9",
34
- "@things-factory/integration-marketplace": "^8.0.0-beta.9",
35
- "@things-factory/integration-ui": "^8.0.0-beta.9",
36
- "@things-factory/more-ui": "^8.0.0-beta.9",
37
- "@things-factory/resource-ui": "^8.0.0-beta.9",
38
- "@things-factory/setting-ui": "^8.0.0-beta.9",
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": "86b1dfa26292926a2d5447fdc23bfa5a9e983245"
52
+ "gitHead": "07ef27d272dd9a067a9648ac7013748510556a18"
53
53
  }
@@ -0,0 +1,2 @@
1
+ export * from './platform'
2
+ export * from './order-status-mapping'
@@ -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,6 @@
1
+ export const PLATFORM = {
2
+ WCM: 'woocommerce',
3
+ MGT: 'magento',
4
+ TTK: 'tiktok',
5
+ SPF: 'shopify'
6
+ }
@@ -0,0 +1,5 @@
1
+ import './sellercraft'
2
+
3
+ export * from './sellercraft-api'
4
+ export * from './sellercraft-channel-integration'
5
+ export * from './sellercraft-channel-integration-api'
@@ -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,14 @@
1
+ export function echo() {
2
+ return {
3
+ path: '/echo',
4
+ denormalize(req) {
5
+ return { ...req }
6
+ },
7
+ normalize(res) {
8
+ return { ...res }
9
+ },
10
+ action({ store, method, path, request, platformAction }) {
11
+ return { ...request }
12
+ }
13
+ }
14
+ }
@@ -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,7 @@
1
+ import { SellercraftAPI } from '../sellercraft-api'
2
+ import * as APIS from './apis'
3
+ import { action } from './platform-action'
4
+
5
+ export * from './sellercraft'
6
+
7
+ SellercraftAPI.registerPlatform('sellercraft', action, APIS)
@@ -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,14 @@
1
+ export function echo() {
2
+ return {
3
+ path: '/echo',
4
+ denormalize(req) {
5
+ return { ...req }
6
+ },
7
+ normalize(res) {
8
+ return { ...res }
9
+ },
10
+ action({ store, method, path, request, platformAction }) {
11
+ return { ...request }
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,6 @@
1
+ export * from './echo'
2
+ export * from './ingest-channel-categories'
3
+ export * from './ingest-channel-category-attributes'
4
+ export * from './ingest-channel-order-package'
5
+ export * from './ingest-channel-order'
6
+ export * from './ingest-channel-product'
@@ -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
+ }