@things-factory/integration-fulfillment 8.0.0-beta.0 → 8.0.0-beta.2

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.
Files changed (47) hide show
  1. package/package.json +11 -11
  2. package/server/controllers/fulfillment-api/decorators.ts +0 -44
  3. package/server/controllers/fulfillment-api/index.ts +0 -64
  4. package/server/controllers/fulfillment-api/types.ts +0 -0
  5. package/server/controllers/index.ts +0 -1
  6. package/server/controllers/operato/cancel-release-order.ts +0 -19
  7. package/server/controllers/operato/create-inbound-order.ts +0 -33
  8. package/server/controllers/operato/create-outbound-order.ts +0 -17
  9. package/server/controllers/operato/create-sales-invoice.ts +0 -17
  10. package/server/controllers/operato/echo.ts +0 -14
  11. package/server/controllers/operato/get-center-products.ts +0 -20
  12. package/server/controllers/operato/get-inbound-order.ts +0 -22
  13. package/server/controllers/operato/get-inventory-product-group-open-api.ts +0 -19
  14. package/server/controllers/operato/get-inventory-product-group.ts +0 -19
  15. package/server/controllers/operato/get-outbound-order.ts +0 -22
  16. package/server/controllers/operato/get-outbound-orders.ts +0 -21
  17. package/server/controllers/operato/index.ts +0 -31
  18. package/server/controllers/operato/operato.ts +0 -130
  19. package/server/controllers/operato/platform-action.ts +0 -51
  20. package/server/controllers/operato/update-release-order-details.ts +0 -17
  21. package/server/entities/fulfillment-center.ts +0 -82
  22. package/server/entities/index.ts +0 -5
  23. package/server/graphql/index.ts +0 -7
  24. package/server/graphql/resolvers/fulfillment-center/create-fulfillment-center.ts +0 -14
  25. package/server/graphql/resolvers/fulfillment-center/delete-fulfillment-center.ts +0 -10
  26. package/server/graphql/resolvers/fulfillment-center/delete-fulfillment-centers.ts +0 -15
  27. package/server/graphql/resolvers/fulfillment-center/fulfillment-center.ts +0 -14
  28. package/server/graphql/resolvers/fulfillment-center/fulfillment-centers.ts +0 -16
  29. package/server/graphql/resolvers/fulfillment-center/having-fulfillment-center.ts +0 -21
  30. package/server/graphql/resolvers/fulfillment-center/index.ts +0 -27
  31. package/server/graphql/resolvers/fulfillment-center/operato/deactivate-operato-center.ts +0 -49
  32. package/server/graphql/resolvers/fulfillment-center/operato/generate-operato-access-token.ts +0 -63
  33. package/server/graphql/resolvers/fulfillment-center/operato/get-operato-auth-url.ts +0 -14
  34. package/server/graphql/resolvers/fulfillment-center/operato/index.ts +0 -14
  35. package/server/graphql/resolvers/fulfillment-center/operato/refresh-operato-access-token.ts +0 -62
  36. package/server/graphql/resolvers/fulfillment-center/update-fulfillment-center.ts +0 -18
  37. package/server/graphql/resolvers/fulfillment-center/update-multiple-fulfillment-center.ts +0 -45
  38. package/server/graphql/resolvers/index.ts +0 -5
  39. package/server/graphql/types/fulfillment-center/fulfillment-center-list.ts +0 -8
  40. package/server/graphql/types/fulfillment-center/fulfillment-center-patch.ts +0 -13
  41. package/server/graphql/types/fulfillment-center/fulfillment-center.ts +0 -19
  42. package/server/graphql/types/fulfillment-center/index.ts +0 -52
  43. package/server/graphql/types/fulfillment-center/new-fulfillment-center.ts +0 -11
  44. package/server/graphql/types/index.ts +0 -9
  45. package/server/index.ts +0 -6
  46. package/server/migrations/index.ts +0 -9
  47. package/server/routes.ts +0 -25
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-fulfillment",
3
- "version": "8.0.0-beta.0",
3
+ "version": "8.0.0-beta.2",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -26,15 +26,15 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@operato/data-grist": "^8.0.0-beta",
29
- "@things-factory/apptool-ui": "^8.0.0-beta.0",
30
- "@things-factory/auth-ui": "^8.0.0-beta.0",
31
- "@things-factory/biz-base": "^8.0.0-beta.0",
32
- "@things-factory/context-ui": "^8.0.0-beta.0",
33
- "@things-factory/i18n-base": "^8.0.0-beta.0",
34
- "@things-factory/integration-ui": "^8.0.0-beta.0",
35
- "@things-factory/more-ui": "^8.0.0-beta.0",
36
- "@things-factory/resource-ui": "^8.0.0-beta.0",
37
- "@things-factory/setting-ui": "^8.0.0-beta.0",
29
+ "@things-factory/apptool-ui": "^8.0.0-beta.2",
30
+ "@things-factory/auth-ui": "^8.0.0-beta.2",
31
+ "@things-factory/biz-base": "^8.0.0-beta.2",
32
+ "@things-factory/context-ui": "^8.0.0-beta.2",
33
+ "@things-factory/i18n-base": "^8.0.0-beta.2",
34
+ "@things-factory/integration-ui": "^8.0.0-beta.2",
35
+ "@things-factory/more-ui": "^8.0.0-beta.2",
36
+ "@things-factory/resource-ui": "^8.0.0-beta.2",
37
+ "@things-factory/setting-ui": "^8.0.0-beta.2",
38
38
  "debug": "^4.1.1",
39
39
  "node-fetch": "^2.6.0"
40
40
  },
@@ -48,5 +48,5 @@
48
48
  "nock": "^13.0.2",
49
49
  "should": "^13.2.3"
50
50
  },
51
- "gitHead": "add6fb8224b2cb19cbea47bed6a5ecb0424c9a28"
51
+ "gitHead": "f03431a09435511b2595515658f9cb8f78ba4ebb"
52
52
  }
@@ -1,44 +0,0 @@
1
- import Debug from 'debug'
2
- const debug = Debug('things-factory:integration-fulfillment:fulfillment-api-decorator')
3
-
4
- import { FulfillmentCenter } from '../../entities'
5
-
6
- const NOOP = v => v
7
-
8
- export const api = (target: Object, property: string, descriptor: TypedPropertyDescriptor<any>): any => {
9
- const method = descriptor.value
10
-
11
- descriptor.value = async function (center: FulfillmentCenter, request) {
12
- const FulfillmentAPI = this
13
-
14
- var { platform } = center
15
-
16
- var { action: platformAction, apis } = FulfillmentAPI.getPlatform(platform)
17
-
18
- var m = apis[method.name]
19
- if (!m) {
20
- throw Error(`Fulfillment Platform '${platform}' doesn't have API ${method.name}`)
21
- }
22
-
23
- var {
24
- path,
25
- method: httpMethod = 'post',
26
- denormalize = NOOP,
27
- normalize = NOOP,
28
- action = platformAction
29
- } = m.apply(this, [request])
30
-
31
- var denormalized = denormalize(request || {})
32
- debug('request', denormalized)
33
-
34
- var response = await action.apply(this, [
35
- { center, method: httpMethod, path, request: denormalized, platformAction }
36
- ])
37
-
38
- debug('response', response)
39
-
40
- return normalize(response)
41
- }
42
-
43
- return descriptor
44
- }
@@ -1,64 +0,0 @@
1
- import { getRepository } from '@things-factory/shell'
2
-
3
- import { FulfillmentCenter } from '../../entities'
4
- import { api } from './decorators'
5
-
6
- export class FulfillmentAPI {
7
- static platforms = {}
8
-
9
- static registerPlatform(name, action, apis) {
10
- FulfillmentAPI.platforms[name] = {
11
- action,
12
- apis
13
- }
14
- }
15
-
16
- static getPlatform(name) {
17
- return FulfillmentAPI.platforms[name]
18
- }
19
-
20
- static async getFulfillmentCenter(id) {
21
- const repository = getRepository(FulfillmentCenter)
22
- // return await repository.find(id)
23
- return await repository.findOne({
24
- where: { id },
25
- relations: ['domain']
26
- })
27
- }
28
-
29
- @api
30
- static echo(center, req): any {}
31
-
32
- @api
33
- static getCenterProducts(center, req): any {}
34
-
35
- @api
36
- static getInventoryProductGroup(center, req): any {}
37
-
38
- @api
39
- static getInventoryProductGroupOpenAPI(center, req): any {}
40
-
41
- @api
42
- static getOutboundOrder(center, req): any {}
43
-
44
- @api
45
- static getOutboundOrders(center, req): any {}
46
-
47
- @api
48
- static getInboundOrder(center, req): any {}
49
-
50
- @api
51
- static cancelReleaseOrder(center, req): any {}
52
-
53
- @api
54
- static createOutboundOrder(center, req): any {}
55
-
56
- @api
57
- static createInboundOrder(center, req): any {}
58
-
59
- @api
60
- static createSalesInvoice(center, req): any {}
61
-
62
- @api
63
- static updateReleaseGoodDetails(center, req): any {}
64
- }
File without changes
@@ -1 +0,0 @@
1
- export * from './fulfillment-api'
@@ -1,19 +0,0 @@
1
- /* https://operato.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-07#index-2020-07 */
2
-
3
- export function cancelReleaseOrder() {
4
- return {
5
- method: 'post',
6
- path: '/unstable/warehouse/{warehouseId}/cancel-release-order',
7
- denormalize(req) {
8
- var { customerBizplaceId, releaseOrderId } = req
9
-
10
- return {
11
- payload: { releaseOrderId },
12
- resource: { warehouseId: customerBizplaceId }
13
- }
14
- },
15
- normalize(res) {
16
- return res
17
- }
18
- }
19
- }
@@ -1,33 +0,0 @@
1
- /* https://operato.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-07#index-2020-07 */
2
-
3
- export function createInboundOrder() {
4
- return {
5
- method: 'post',
6
- path: '/unstable/warehouse/{warehouseId}/add-inbound-order',
7
- denormalize(req) {
8
- var { customerBizplaceId, purchaseOrder } = req
9
-
10
- return {
11
- payload: {
12
- containerNo: purchaseOrder?.containerNo,
13
- containerSize: purchaseOrder?.containerSize,
14
- ownTransport: purchaseOrder?.ownTransport,
15
- crossDocking: false,
16
- refNo: purchaseOrder?.refNo,
17
- refNo2: purchaseOrder?.refNo2,
18
- importCargo: purchaseOrder?.importCargo,
19
- looseItem: false,
20
- etaDate: purchaseOrder.etaDate,
21
- truckNo: purchaseOrder?.truckNo,
22
- orderProducts: purchaseOrder.orderProducts
23
- },
24
- resource: {
25
- warehouseId: customerBizplaceId
26
- }
27
- }
28
- },
29
- normalize(res) {
30
- return res
31
- }
32
- }
33
- }
@@ -1,17 +0,0 @@
1
- export function createOutboundOrder() {
2
- return {
3
- method: 'post',
4
- path: '/unstable/warehouse/{warehouseId}/add-release-order',
5
- denormalize(req) {
6
- var { customerBizplaceId, releaseOrder } = req
7
-
8
- return {
9
- payload: { ...releaseOrder },
10
- resource: { warehouseId: customerBizplaceId }
11
- }
12
- },
13
- normalize(res) {
14
- return res.result.addReleaseGood
15
- }
16
- }
17
- }
@@ -1,17 +0,0 @@
1
- export function createSalesInvoice() {
2
- return {
3
- method: 'post',
4
- path: '/unstable/warehouse/{warehouseId}/add-sales-invoice',
5
- denormalize(req) {
6
- var { customerBizplaceId, invoice } = req
7
-
8
- return {
9
- payload: { ...invoice },
10
- resource: { warehouseId: customerBizplaceId }
11
- }
12
- },
13
- normalize(res) {
14
- return res.result.createInvoice
15
- }
16
- }
17
- }
@@ -1,14 +0,0 @@
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({ center, method, path, request, platformAction }) {
11
- return { ...request }
12
- }
13
- }
14
- }
@@ -1,20 +0,0 @@
1
- /* https://operato.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-07#index-2020-07 */
2
-
3
- export function getCenterProducts() {
4
- return {
5
- method: 'get',
6
- path: '/unstable/warehouse/{warehouseId}/get-product-list',
7
- denormalize(req) {
8
- var { warehouseId } = req
9
-
10
- return {
11
- resource: {
12
- warehouseId: warehouseId
13
- }
14
- }
15
- },
16
- normalize(res) {
17
- return res
18
- }
19
- }
20
- }
@@ -1,22 +0,0 @@
1
- export function getInboundOrder() {
2
- return {
3
- method: 'get',
4
- path: '/unstable/warehouse/{warehouseId}/get-inbound-order-detail',
5
- denormalize(req) {
6
- var { customerBizplaceId, refNo, ganNo } = req
7
- let param: any = {}
8
-
9
- if (ganNo) param.ganNo = ganNo
10
- if (refNo) param.refNo = refNo
11
-
12
- return {
13
- resource: { warehouseId: customerBizplaceId },
14
- payload: { ...param }
15
- }
16
- },
17
- normalize(res) {
18
- const { arrivalNotice } = res.result
19
- return arrivalNotice
20
- }
21
- }
22
- }
@@ -1,19 +0,0 @@
1
- /* https://operato.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-07#index-2020-07 */
2
-
3
- export function getInventoryProductGroupOpenAPI() {
4
- return {
5
- method: 'get',
6
- path: '/unstable/warehouse/{warehouseId}/get-inventory-product-group-open-api',
7
- denormalize(req) {
8
- var { warehouseId, paginationEntriesPerPage, paginationOffset } = req
9
-
10
- return {
11
- resource: { warehouseId },
12
- payload: { paginationEntriesPerPage, paginationOffset }
13
- }
14
- },
15
- normalize(res) {
16
- return res.result.inventoryProductGroupOpenAPI
17
- }
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- /* https://operato.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-07#index-2020-07 */
2
-
3
- export function getInventoryProductGroup() {
4
- return {
5
- method: 'get',
6
- path: '/unstable/warehouse/{warehouseId}/get-inventory-product-group',
7
- denormalize(req) {
8
- var { warehouseId, paginationEntriesPerPage, paginationOffset } = req
9
-
10
- return {
11
- resource: { warehouseId },
12
- payload: { paginationEntriesPerPage, paginationOffset }
13
- }
14
- },
15
- normalize(res) {
16
- return res.result.inventoryProductGroup
17
- }
18
- }
19
- }
@@ -1,22 +0,0 @@
1
- export function getOutboundOrder() {
2
- return {
3
- method: 'get',
4
- path: '/unstable/warehouse/{warehouseId}/get-release-order-detail',
5
- denormalize(req) {
6
- var { customerBizplaceId, refNo, releaseOrderNo } = req
7
- let param: any = {}
8
-
9
- if (releaseOrderNo) param.releaseOrderNo = releaseOrderNo
10
- if (refNo) param.refNo = refNo
11
-
12
- return {
13
- resource: { warehouseId: customerBizplaceId },
14
- payload: { ...param }
15
- }
16
- },
17
- normalize(res) {
18
- const { releaseGoodDetail } = res.result
19
- return releaseGoodDetail
20
- }
21
- }
22
- }
@@ -1,21 +0,0 @@
1
- export function getOutboundOrders() {
2
- return {
3
- method: 'get',
4
- path: '/unstable/warehouse/{warehouseId}/get-release-order-list',
5
- denormalize(req) {
6
- var { customerBizplaceId, refNo } = req
7
- let param: any = {}
8
-
9
- if (refNo) param.refNo = refNo
10
-
11
- return {
12
- resource: { warehouseId: customerBizplaceId },
13
- payload: { ...param }
14
- }
15
- },
16
- normalize(res) {
17
- const { releaseGoods } = res.result
18
- return releaseGoods
19
- }
20
- }
21
- }
@@ -1,31 +0,0 @@
1
- import { FulfillmentAPI } from '../fulfillment-api'
2
- import { cancelReleaseOrder } from './cancel-release-order'
3
- import { createInboundOrder } from './create-inbound-order'
4
- import { createOutboundOrder } from './create-outbound-order'
5
- import { createSalesInvoice } from './create-sales-invoice'
6
- import { echo } from './echo'
7
- import { getCenterProducts } from './get-center-products'
8
- import { getInboundOrder } from './get-inbound-order'
9
- import { getInventoryProductGroup } from './get-inventory-product-group'
10
- import { getInventoryProductGroupOpenAPI } from './get-inventory-product-group-open-api'
11
- import { getOutboundOrder } from './get-outbound-order'
12
- import { getOutboundOrders } from './get-outbound-orders'
13
- import { action } from './platform-action'
14
- import { updateReleaseGoodDetails } from './update-release-order-details'
15
-
16
- export * from './operato'
17
-
18
- FulfillmentAPI.registerPlatform('operato', action, {
19
- echo,
20
- getCenterProducts,
21
- getInventoryProductGroup,
22
- getInboundOrder,
23
- getOutboundOrder,
24
- getOutboundOrders,
25
- getInventoryProductGroupOpenAPI,
26
- createSalesInvoice,
27
- createOutboundOrder,
28
- createInboundOrder,
29
- cancelReleaseOrder,
30
- updateReleaseGoodDetails
31
- })
@@ -1,130 +0,0 @@
1
- import Debug from 'debug'
2
- import fetch from 'node-fetch'
3
-
4
- import { config } from '@things-factory/env'
5
- import { getRepository } from '@things-factory/shell'
6
- import { parseJwt } from '@things-factory/utils'
7
-
8
- import { FulfillmentCenter } from '../../entities'
9
-
10
- const { protocol = 'https', host, callback } = config.get('fulfillmentIntegrationOperato', {})
11
-
12
- const debug = Debug('things-factory:integration-fulfillment:operato')
13
-
14
- export type OperatoConfig = {
15
- appKey: string
16
- appSecret: string
17
- center?: string
18
- accessToken?: string
19
- redirectUrl?: string
20
- }
21
-
22
- export class Operato {
23
- private config: OperatoConfig
24
-
25
- constructor(config: OperatoConfig) {
26
- this.config = {
27
- ...config
28
- }
29
- }
30
-
31
- buildAuthURL(state) {
32
- // TODO make scopes properly
33
- const { appKey, redirectUrl } = this.config
34
- // return `http://${center}.${host}/oauth/authorize?response_type=code&client_id=${appKey}&scope=${scopes}&redirect_uri=${redirectUrl}&state=${state}`
35
- return `${protocol}://${host}/oauth/authorize?response_type=code&client_id=${appKey}&scope=warehouse&redirect_uri=${redirectUrl}&state=${state}`
36
- }
37
-
38
- async get(center: any, path: string, data: any) {
39
- const qs = Object.entries(data)
40
- .map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`)
41
- .join('&')
42
-
43
- const endpoint = `${protocol}://${host}/api${path}${qs ? '?' + qs : ''}`
44
- debug('endpoint', endpoint)
45
-
46
- const response = await fetch(endpoint, {
47
- headers: {
48
- 'Content-Type': 'application/json',
49
- 'x-access-token': center.accessToken,
50
- 'x-things-factory-domain': center.centerId
51
- }
52
- })
53
-
54
- const result = await response.json()
55
- debug('response result', result)
56
-
57
- return result
58
- }
59
-
60
- async post(center: any, path: string, data: any = {}) {
61
- debug('data', data)
62
-
63
- const jsondata = JSON.stringify(data)
64
-
65
- const endpoint = `${protocol}://${host}/api${path}`
66
-
67
- const response = await fetch(endpoint, {
68
- method: 'post',
69
- headers: {
70
- 'Content-Type': 'application/json',
71
- 'x-access-token': center.accessToken,
72
- 'x-things-factory-domain': center.centerId
73
- },
74
- body: jsondata
75
- })
76
-
77
- if (response.ok) {
78
- return await response.json()
79
- } else {
80
- const text = await response.text()
81
- debug('response result', text)
82
- throw response
83
- }
84
- }
85
-
86
- public static async refreshAccessToken(fulfillmentCenter) {
87
- const requestBody = {
88
- refreshToken: fulfillmentCenter.refreshToken
89
- }
90
-
91
- const refreshResponse = await fetch(`${protocol}://${host}/oauth/refresh-token`, {
92
- method: 'post',
93
- headers: {
94
- 'Content-Type': 'application/json'
95
- },
96
- body: JSON.stringify(requestBody)
97
- })
98
-
99
- if (!refreshResponse.ok) {
100
- throw new Error(`get operato information failed: ${await refreshResponse.text()}`)
101
- }
102
-
103
- const body = await refreshResponse.json()
104
- const {
105
- accessToken /* token used to call the API */,
106
- id_token /* token containing user identity details (only returned if OpenID Connect scopes are requested) */,
107
- expires_in /* amount of seconds until the access token expires */,
108
- token_type: tokenType /* must be Bearer */,
109
- refreshToken
110
- /* token used to refresh the access token once it has expired (only returned if the offline_access scope is requested).
111
- */
112
- } = body
113
-
114
- const { exp } = parseJwt(accessToken)
115
-
116
- var patch = {
117
- accessToken,
118
- refreshToken,
119
- tokenType,
120
- expiresIn: new Date(exp * 1000)
121
- }
122
-
123
- const repository = getRepository(FulfillmentCenter)
124
-
125
- return await repository.save({
126
- ...fulfillmentCenter,
127
- ...patch
128
- })
129
- }
130
- }
@@ -1,51 +0,0 @@
1
- import { Operato } from './operato'
2
-
3
- import { config } from '@things-factory/env'
4
- const operatoConfig = config.get('fulfillmentIntegrationOperato', {})
5
- const { appKey, appSecret } = operatoConfig
6
-
7
- function substitute(path, obj) {
8
- var props = []
9
- var re = /{([^}]+)}/g
10
- var text
11
-
12
- while ((text = re.exec(path))) {
13
- props.push(text[1])
14
- }
15
-
16
- var result = path
17
- props.forEach(prop => {
18
- let value = obj[prop.trim()]
19
- result = result.replace(`{${prop}}`, value === undefined ? '' : value)
20
- })
21
-
22
- return result
23
- }
24
-
25
- export const _action = async ({ center, method = 'get', path, request }) => {
26
- const client = new Operato({
27
- center: center.centerId,
28
- appKey,
29
- appSecret,
30
- accessToken: center.accessToken
31
- })
32
-
33
- const { resource = {}, payload = {} } = request
34
-
35
- path = substitute(path, resource)
36
-
37
- return await client[method](center, path, payload)
38
- }
39
-
40
- export const action = async ({ center, method = 'get', path, request }) => {
41
- try {
42
- return await _action({ center, method, path, request })
43
- } catch (ex) {
44
- if (ex.status === 401) {
45
- var refreshed = await Operato.refreshAccessToken(center)
46
- return await _action({ center: refreshed, method, path, request })
47
- } else {
48
- throw ex
49
- }
50
- }
51
- }
@@ -1,17 +0,0 @@
1
- export function updateReleaseGoodDetails() {
2
- return {
3
- method: 'post',
4
- path: '/unstable/warehouse/{warehouseId}/update-release-order-details',
5
- denormalize(req) {
6
- var { customerBizplaceId, releaseOrder, shippingOrder } = req
7
-
8
- return {
9
- payload: { releaseOrder, shippingOrder },
10
- resource: { warehouseId: customerBizplaceId }
11
- }
12
- },
13
- normalize(res) {
14
- return res
15
- }
16
- }
17
- }