@things-factory/integration-pos 8.0.39 → 9.0.0-9.0.0-beta.59.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.
Files changed (46) hide show
  1. package/dist-server/engine/index.d.ts +2 -2
  2. package/dist-server/engine/index.js +2 -2
  3. package/dist-server/engine/index.js.map +1 -1
  4. package/dist-server/tsconfig.tsbuildinfo +1 -1
  5. package/package.json +13 -13
  6. package/server/controllers/index.ts +0 -3
  7. package/server/controllers/pos-api/decorators.ts +0 -44
  8. package/server/controllers/pos-api/index.ts +0 -40
  9. package/server/controllers/xilnex/apis/get-outlet.ts +0 -14
  10. package/server/controllers/xilnex/apis/get-outlets.ts +0 -20
  11. package/server/controllers/xilnex/apis/index.ts +0 -1
  12. package/server/controllers/xilnex/index.ts +0 -8
  13. package/server/controllers/xilnex/platform-action.ts +0 -42
  14. package/server/controllers/xilnex/xilnex.ts +0 -123
  15. package/server/engine/connector/index.ts +0 -1
  16. package/server/engine/connector/pos-connector.ts +0 -33
  17. package/server/engine/index.ts +0 -2
  18. package/server/engine/task/index.ts +0 -1
  19. package/server/engine/task/pos-api.ts +0 -64
  20. package/server/entities/index.ts +0 -5
  21. package/server/entities/pos-store.ts +0 -76
  22. package/server/graphql/index.ts +0 -7
  23. package/server/graphql/resolvers/index.ts +0 -6
  24. package/server/graphql/resolvers/pos/create-pos-store.ts +0 -16
  25. package/server/graphql/resolvers/pos/delete-pos-store.ts +0 -20
  26. package/server/graphql/resolvers/pos/delete-pos-stores.ts +0 -25
  27. package/server/graphql/resolvers/pos/index.ts +0 -25
  28. package/server/graphql/resolvers/pos/pos-store.ts +0 -14
  29. package/server/graphql/resolvers/pos/pos-stores.ts +0 -15
  30. package/server/graphql/resolvers/pos/update-multiple-pos-stores.ts +0 -44
  31. package/server/graphql/resolvers/pos/update-pos-store.ts +0 -18
  32. package/server/graphql/resolvers/pos/xilnex/deactivate-xilnex-store.ts +0 -28
  33. package/server/graphql/resolvers/pos/xilnex/generate-xilnex-access-token.ts +0 -30
  34. package/server/graphql/resolvers/pos/xilnex/index.ts +0 -9
  35. package/server/graphql/resolvers/pos-api/index.ts +0 -8
  36. package/server/graphql/resolvers/pos-api/pos-outlet.ts +0 -24
  37. package/server/graphql/types/index.ts +0 -19
  38. package/server/graphql/types/pos/index.ts +0 -44
  39. package/server/graphql/types/pos/new-pos-store.ts +0 -11
  40. package/server/graphql/types/pos/pos-store-list.ts +0 -8
  41. package/server/graphql/types/pos/pos-store-patch.ts +0 -13
  42. package/server/graphql/types/pos/pos-store.ts +0 -20
  43. package/server/graphql/types/pos-api/pos-outlet.ts +0 -43
  44. package/server/index.ts +0 -9
  45. package/server/migrations/index.ts +0 -9
  46. package/server/routes.ts +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-pos",
3
- "version": "8.0.39",
3
+ "version": "9.0.0-9.0.0-beta.59.0",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -25,17 +25,17 @@
25
25
  "test": "DEBUG=things-factory:* NODE_ENV=development npx mocha -r ts-node/register ./test/**/*spec.ts"
26
26
  },
27
27
  "dependencies": {
28
- "@operato/data-grist": "^8.0.0",
29
- "@things-factory/apptool-ui": "^8.0.38",
30
- "@things-factory/auth-ui": "^8.0.38",
31
- "@things-factory/biz-base": "^8.0.38",
32
- "@things-factory/code-ui": "^8.0.38",
33
- "@things-factory/context-ui": "^8.0.38",
34
- "@things-factory/i18n-base": "^8.0.38",
35
- "@things-factory/integration-ui": "^8.0.39",
36
- "@things-factory/more-ui": "^8.0.38",
37
- "@things-factory/resource-ui": "^8.0.38",
38
- "@things-factory/setting-ui": "^8.0.38",
28
+ "@operato/data-grist": "^9.0.0-beta",
29
+ "@things-factory/apptool-ui": "^9.0.0-9.0.0-beta.59.0",
30
+ "@things-factory/auth-ui": "^9.0.0-9.0.0-beta.59.0",
31
+ "@things-factory/biz-base": "^9.0.0-9.0.0-beta.59.0",
32
+ "@things-factory/code-ui": "^9.0.0-9.0.0-beta.59.0",
33
+ "@things-factory/context-ui": "^9.0.0-9.0.0-beta.59.0",
34
+ "@things-factory/i18n-base": "^9.0.0-9.0.0-beta.59.0",
35
+ "@things-factory/integration-ui": "^9.0.0-9.0.0-beta.59.0",
36
+ "@things-factory/more-ui": "^9.0.0-9.0.0-beta.59.0",
37
+ "@things-factory/resource-ui": "^9.0.0-9.0.0-beta.59.0",
38
+ "@things-factory/setting-ui": "^9.0.0-9.0.0-beta.59.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": "f5e1a4c04bceec2d731a46f1ef88976839d04dac"
52
+ "gitHead": "cf6ee84b991f469a4e71198b0e6314b45e9e10b8"
53
53
  }
@@ -1,3 +0,0 @@
1
- import './xilnex'
2
-
3
- export * from './pos-api'
@@ -1,44 +0,0 @@
1
- import Debug from 'debug'
2
- const debug = Debug('things-factory:integration-pos:pos-api-decorator')
3
-
4
- import { PosStore } 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 (store: PosStore, request) {
12
- const POSAPI = this
13
-
14
- var { platform } = store
15
-
16
- var { action: platformAction, apis } = POSAPI.getPlatform(platform)
17
-
18
- var m = apis[method.name]
19
- if (!m) {
20
- throw Error(`POS 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 = await denormalize(request || {}, { store })
32
- debug('request', denormalized)
33
-
34
- var response = await action.apply(this, [
35
- { store, method: httpMethod, path, request: denormalized, platformAction }
36
- ])
37
-
38
- debug('response', response)
39
-
40
- return await normalize(response, { store })
41
- }
42
-
43
- return descriptor
44
- }
@@ -1,40 +0,0 @@
1
- import { getRepository } from '@things-factory/shell'
2
-
3
- import { PosStore } from '../../entities'
4
- import { api } from './decorators'
5
-
6
- export const POS_STORE_STATUS = {
7
- ACTIVE: 'active',
8
- INACTIVE: 'inactive',
9
- TERMINATED: 'terminated'
10
- }
11
-
12
- export class POSAPI {
13
- static platforms = {}
14
-
15
- static registerPlatform(name, action, apis) {
16
- POSAPI.platforms[name] = {
17
- action,
18
- apis
19
- }
20
- }
21
-
22
- static getPlatform(name) {
23
- return POSAPI.platforms[name]
24
- }
25
-
26
- static async getPosStore(id) {
27
- const repository = getRepository(PosStore)
28
- // return await repository.find(id)
29
- return await repository.findOne({
30
- where: { id },
31
- relations: ['domain']
32
- })
33
- }
34
-
35
- @api
36
- static getOutlets(store, req): any {}
37
-
38
- @api
39
- static getOutlet(store, req): any {}
40
- }
@@ -1,14 +0,0 @@
1
- export function getOutlet() {
2
- return {
3
- method: 'get',
4
- path: '/outlet/{outletNo}',
5
- denormalize(req) {
6
- return {}
7
- },
8
- normalize(res) {
9
- return {
10
- ...res
11
- }
12
- }
13
- }
14
- }
@@ -1,20 +0,0 @@
1
- const debug = require('debug')('things-factory:integration-pos:xilnex:get-outlets')
2
-
3
- export function getOutlets() {
4
- return {
5
- method: 'get',
6
- path: '/outlets',
7
- denormalize(req) {
8
- return {}
9
- },
10
- normalize(res) {
11
- debug('response data', res)
12
- const { outlets } = res
13
-
14
- return {
15
- items: outlets,
16
- total: outlets.length
17
- }
18
- }
19
- }
20
- }
@@ -1 +0,0 @@
1
- export * from './get-outlets'
@@ -1,8 +0,0 @@
1
- export * from './xilnex'
2
-
3
- import { action } from './platform-action'
4
- import { POSAPI } from '../pos-api'
5
-
6
- import * as APIS from './apis'
7
-
8
- POSAPI.registerPlatform('xilnex', action, APIS)
@@ -1,42 +0,0 @@
1
- import { Xilnex } from './xilnex'
2
-
3
- import { config } from '@things-factory/env'
4
- const xilnexConfig = config.get('posIntegrationXilnex', {})
5
- const { apiKey, apiSecret } = xilnexConfig
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 ({ store, method = 'get', path, request }) => {
26
- const client = new Xilnex({
27
- store: store.storeId,
28
- accessToken: store.accessToken,
29
- storeId: store.storeId
30
- })
31
-
32
- const { resource = {}, payload = {} } = request
33
-
34
- path = substitute(path, resource)
35
-
36
- var response = await client[method](path, payload)
37
- if (!response.ok) {
38
- throw response.error
39
- }
40
-
41
- return response.data
42
- }
@@ -1,123 +0,0 @@
1
- import fetch from 'node-fetch'
2
- import Debug from 'debug'
3
-
4
- const debug = Debug('things-factory:integration-pos:xilnex')
5
-
6
- export type XilnexConfig = {
7
- store: string
8
- accessToken?: string,
9
- storeId: string
10
- }
11
-
12
- export class Xilnex {
13
- private config: XilnexConfig
14
-
15
- constructor(config: XilnexConfig) {
16
- this.config = {
17
- ...config
18
- }
19
- }
20
-
21
- async get(path: string, data: any) {
22
- const { store, accessToken, storeId: appid } = this.config
23
-
24
- const qs = Object.entries(data)
25
- .map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`)
26
- .join('&')
27
-
28
- const endpoint = `https://api.xilnex.com/logic/v2${path}${qs ? '?' + qs : ''}`
29
- debug('endpoint', endpoint)
30
-
31
- const response = await fetch(endpoint, {
32
- headers: {
33
- 'appid': appid,
34
- 'token': accessToken,
35
- 'auth': '5'
36
- }
37
- })
38
-
39
- const result = await response.json()
40
- debug('response result', result)
41
-
42
- return result
43
- }
44
-
45
- async post(path: string, data: any = {}) {
46
- const { store, accessToken, storeId: appid } = this.config
47
-
48
- debug('data', data)
49
-
50
- const jsondata = JSON.stringify(data)
51
-
52
- const endpoint = `https://api.xilnex.com/logic/v2${path}`
53
-
54
- const response = await fetch(endpoint, {
55
- method: 'post',
56
- headers: {
57
- 'appid': appid,
58
- 'token': accessToken,
59
- 'auth': '5',
60
- 'Content-Type': 'application/json'
61
- },
62
- body: jsondata
63
- })
64
-
65
- const result = await response.json()
66
- debug('response result', result)
67
-
68
- return result
69
- }
70
-
71
-
72
- async put(path: string, data: any = {}) {
73
- const { store, accessToken, storeId: appid } = this.config
74
-
75
- debug('data', data)
76
-
77
- const jsondata = JSON.stringify(data)
78
-
79
- const endpoint = `https://api.xilnex.com/logic/v2${path}`
80
-
81
- const response = await fetch(endpoint, {
82
- method: 'put',
83
- headers: {
84
- 'appid': appid,
85
- 'token': accessToken,
86
- 'auth': '5',
87
- 'Content-Type': 'application/json'
88
- },
89
- body: jsondata
90
- })
91
-
92
- const result = await response.json()
93
- debug('response result', result)
94
-
95
- return result
96
- }
97
-
98
- async delete(path: string, data: any = {}) {
99
- const { store, accessToken, storeId: appid } = this.config
100
-
101
- debug('data', data)
102
-
103
- const jsondata = JSON.stringify(data)
104
-
105
- const endpoint = `https://api.xilnex.com/logic/v2${path}`
106
-
107
- const response = await fetch(endpoint, {
108
- method: 'delete',
109
- headers: {
110
- 'appid': appid,
111
- 'token': accessToken,
112
- 'auth': '5',
113
- 'Content-Type': 'application/json'
114
- },
115
- body: jsondata
116
- })
117
-
118
- const result = await response.json()
119
- debug('response result', result)
120
-
121
- return result
122
- }
123
- }
@@ -1 +0,0 @@
1
- import './pos-connector'
@@ -1,33 +0,0 @@
1
- import { ConnectionManager, Connector, Connection } from '@things-factory/integration-base'
2
-
3
- export class POSConnector implements Connector {
4
- async ready(connectionConfigs) {
5
- await Promise.all(connectionConfigs.map(this.connect))
6
-
7
- ConnectionManager.logger.info('pos-connector connections are ready')
8
- }
9
-
10
- async connect(connection) {
11
- const { domain, name, endpoint } = connection
12
-
13
- ConnectionManager.addConnectionInstance(connection, { ...connection })
14
-
15
- ConnectionManager.logger.info(`pos-connector connection(${name}:${connection.endpoint}) is connected`)
16
- }
17
-
18
- async disconnect(connection: Connection) {
19
- ConnectionManager.removeConnectionInstance(connection)
20
-
21
- ConnectionManager.logger.info(`pos-connector connection(${connection.name}) is disconnected`)
22
- }
23
-
24
- get parameterSpec() {
25
- return []
26
- }
27
-
28
- get taskPrefixes() {
29
- return ['pos']
30
- }
31
- }
32
-
33
- ConnectionManager.registerConnector('pos-connector', new POSConnector())
@@ -1,2 +0,0 @@
1
- import './connector'
2
- import './task'
@@ -1 +0,0 @@
1
- import './pos-api'
@@ -1,64 +0,0 @@
1
- import { ConnectionManager, TaskRegistry } from '@things-factory/integration-base'
2
- import { getRepository } from '@things-factory/shell'
3
- import { access } from '@things-factory/utils'
4
-
5
- import { POSAPI as API } from '../../controllers/pos-api'
6
- import { PosStore } from '../../entities'
7
-
8
- async function POSAPI(step, { logger, data, domain }) {
9
- var {
10
- connection,
11
- params: { store: name, api, accessor }
12
- } = step
13
-
14
- var client = ConnectionManager.getConnectionInstanceByName(domain, connection) || {}
15
- if (!client) {
16
- throw new Error(`no connection : ${connection}`)
17
- }
18
-
19
- if (!api) {
20
- throw new Error(`no api defined`)
21
- }
22
-
23
- const repository = getRepository(PosStore)
24
- const store: PosStore = await repository.findOne({
25
- where: { domain: { id: domain.id }, name }
26
- })
27
-
28
- if (!store) {
29
- throw new Error(`no store defined`)
30
- }
31
-
32
- var result = await API[api](store, accessor ? access(accessor, data) : {})
33
-
34
- return {
35
- data: result
36
- }
37
- }
38
-
39
- POSAPI.parameterSpec = [
40
- {
41
- type: 'entity-selector',
42
- name: 'store',
43
- label: 'store',
44
- property: {
45
- queryName: 'stores',
46
- valueKey: 'name'
47
- }
48
- },
49
- {
50
- type: 'select',
51
- name: 'api',
52
- label: 'api',
53
- property: {
54
- options: ['', 'getPOSInvoices']
55
- }
56
- },
57
- {
58
- type: 'string',
59
- name: 'accessor',
60
- label: 'accessor'
61
- }
62
- ]
63
-
64
- TaskRegistry.registerTaskHandler('pos-api', POSAPI)
@@ -1,5 +0,0 @@
1
- import { PosStore } from './pos-store'
2
-
3
- export const entities = [PosStore]
4
-
5
- export { PosStore }
@@ -1,76 +0,0 @@
1
- import { User } from '@things-factory/auth-base'
2
- import { Domain } from '@things-factory/shell'
3
- import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
4
-
5
- @Entity()
6
- @Index(
7
- 'ix_pos-store_0',
8
- (store: PosStore) => [store.domain, store.name], { unique: true }
9
- )
10
- export class PosStore {
11
- @PrimaryGeneratedColumn('uuid')
12
- id: string
13
-
14
- @ManyToOne(type => Domain)
15
- domain: Domain
16
-
17
- @Column()
18
- platform: string
19
-
20
- @Column({
21
- nullable: true
22
- })
23
- storeId: string
24
-
25
- @Column()
26
- countryCode: string
27
-
28
- @Column({
29
- nullable: true
30
- })
31
- status: string
32
-
33
- @Column()
34
- name: string
35
-
36
- @Column({
37
- nullable: true
38
- })
39
- accessInfo: string
40
-
41
- @Column({
42
- nullable: true
43
- })
44
- accessToken: string
45
-
46
- @Column({
47
- nullable: true
48
- })
49
- refreshToken: string
50
-
51
- @Column({
52
- nullable: true
53
- })
54
- store: string
55
-
56
- @Column({
57
- nullable: true
58
- })
59
- description: string
60
-
61
- @CreateDateColumn()
62
- createdAt: Date
63
-
64
- @UpdateDateColumn()
65
- updatedAt: Date
66
-
67
- @ManyToOne(type => User, {
68
- nullable: true
69
- })
70
- creator: User
71
-
72
- @ManyToOne(type => User, {
73
- nullable: true
74
- })
75
- updater: User
76
- }
@@ -1,7 +0,0 @@
1
- import * as typeDefs from './types'
2
- import * as resolvers from './resolvers'
3
-
4
- export const schema = {
5
- typeDefs,
6
- resolvers
7
- }
@@ -1,6 +0,0 @@
1
- import * as POS from './pos'
2
- import * as POSAPI from './pos-api'
3
-
4
- export const queries = [POS.Query, POSAPI.Query] as any
5
-
6
- export const mutations = [POS.Mutation, POSAPI.Mutation]
@@ -1,16 +0,0 @@
1
- import { getRepository } from '@things-factory/shell'
2
-
3
- import { POS_STORE_STATUS } from '../../../controllers'
4
- import { PosStore } from '../../../entities'
5
-
6
- export const createPosStore = {
7
- async createPosStore(_: any, { store }, context: ResolverContext): Promise<PosStore> {
8
- return await getRepository(PosStore).save({
9
- status: POS_STORE_STATUS.INACTIVE,
10
- ...store,
11
- domain: context.state.domain,
12
- creator: context.state.user,
13
- updater: context.state.user
14
- })
15
- }
16
- }
@@ -1,20 +0,0 @@
1
- import { getRepository } from '@things-factory/shell'
2
-
3
- import { POS_STORE_STATUS } from '../../../controllers'
4
- import { PosStore } from '../../../entities'
5
-
6
- export const deletePosStore = {
7
- async deletePosStore(_: any, { name }, context: ResolverContext) {
8
- const foundStore: PosStore = await getRepository(PosStore).findOne({
9
- where: { domain: { id: context.state.domain.id }, name }
10
- })
11
-
12
- await getRepository(PosStore).save({
13
- ...foundStore,
14
- status: POS_STORE_STATUS.TERMINATED,
15
- updater: context.state.user
16
- })
17
-
18
- return true
19
- }
20
- }
@@ -1,25 +0,0 @@
1
- import { In } from 'typeorm'
2
-
3
- import { getRepository } from '@things-factory/shell'
4
-
5
- import { POS_STORE_STATUS } from '../../../controllers'
6
- import { PosStore } from '../../../entities'
7
-
8
- export const deletePosStores = {
9
- async deletePosStores(_: any, { names }, context: ResolverContext) {
10
- let foundStores: PosStore[] = await getRepository(PosStore).find({
11
- where: { domain: { id: context.state.domain.id }, name: In(names) }
12
- })
13
-
14
- const updatedPosStore = foundStores.map((store: PosStore) => {
15
- return {
16
- ...store,
17
- status: POS_STORE_STATUS.TERMINATED,
18
- updater: context.state.user
19
- }
20
- })
21
-
22
- await getRepository(PosStore).save(updatedPosStore)
23
- return true
24
- }
25
- }
@@ -1,25 +0,0 @@
1
- import { posStoreResolver } from './pos-store'
2
- import { posStoresResolver } from './pos-stores'
3
-
4
- import { updateMultiplePosStore } from './update-multiple-pos-stores'
5
- import { updatePosStore } from './update-pos-store'
6
- import { createPosStore } from './create-pos-store'
7
- import { deletePosStore } from './delete-pos-store'
8
- import { deletePosStores } from './delete-pos-stores'
9
-
10
- import * as Xilnex from './xilnex'
11
-
12
- export const Query = {
13
- ...posStoresResolver,
14
- ...posStoreResolver,
15
- ...Xilnex.Query
16
- } as any
17
-
18
- export const Mutation = {
19
- ...updatePosStore,
20
- ...updateMultiplePosStore,
21
- ...createPosStore,
22
- ...deletePosStore,
23
- ...deletePosStores,
24
- ...Xilnex.Mutation
25
- }
@@ -1,14 +0,0 @@
1
- import { getRepository } from '@things-factory/shell'
2
-
3
- import { PosStore } from '../../../entities'
4
-
5
- export const posStoreResolver = {
6
- async posStore(_: any, { id }, context: ResolverContext): Promise<PosStore> {
7
- const repository = getRepository(PosStore)
8
-
9
- return await getRepository(PosStore).findOne({
10
- where: { domain: { id: context.state.domain.id }, id },
11
- relations: ['domain', 'creator', 'updater']
12
- })
13
- }
14
- }
@@ -1,15 +0,0 @@
1
- import { convertListParams, getRepository, ListParam } from '@things-factory/shell'
2
-
3
- import { PosStore } from '../../../entities'
4
-
5
- export const posStoresResolver = {
6
- async posStores(_: any, params: ListParam, context: ResolverContext): Promise<{ items: PosStore[]; total: number }> {
7
- const { domain } = context.state
8
- const convertedParams = convertListParams(params, { domain })
9
- const [items, total] = await getRepository(PosStore).findAndCount({
10
- ...convertedParams,
11
- relations: ['domain', 'creator', 'updater']
12
- })
13
- return { items, total }
14
- }
15
- }