@things-factory/operato-hub 4.3.76 → 4.3.79-alpha.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 (168) hide show
  1. package/dist-server/middlewares/business-middleware.js +4 -1
  2. package/dist-server/middlewares/business-middleware.js.map +1 -1
  3. package/dist-server/middlewares/store-middleware.js.map +1 -1
  4. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js +3 -2
  5. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js.map +1 -1
  6. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js +5 -2
  7. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js.map +1 -1
  8. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +4 -2
  9. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  10. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js +94 -0
  11. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js.map +1 -0
  12. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js +208 -0
  13. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js.map +1 -0
  14. package/dist-server/routers/api/restful-apis/v1/company/add-product.js +65 -0
  15. package/dist-server/routers/api/restful-apis/v1/company/add-product.js.map +1 -0
  16. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js +97 -0
  17. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js.map +1 -0
  18. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js +50 -0
  19. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js.map +1 -0
  20. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js +63 -0
  21. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js.map +1 -0
  22. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js +110 -0
  23. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js.map +1 -0
  24. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js +52 -0
  25. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js.map +1 -0
  26. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js +90 -0
  27. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js.map +1 -0
  28. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js +99 -0
  29. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js.map +1 -0
  30. package/dist-server/routers/api/restful-apis/v1/company/index.js +14 -0
  31. package/dist-server/routers/api/restful-apis/v1/company/index.js.map +1 -0
  32. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js +65 -0
  33. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js.map +1 -0
  34. package/dist-server/routers/api/restful-apis/v1/index.js +2 -31
  35. package/dist-server/routers/api/restful-apis/v1/index.js.map +1 -1
  36. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js +29 -0
  37. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js.map +1 -0
  38. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js +40 -0
  39. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js.map +1 -0
  40. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js +23 -0
  41. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js.map +1 -0
  42. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js +32 -0
  43. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js.map +1 -0
  44. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js +53 -0
  45. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js.map +1 -0
  46. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js +31 -0
  47. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js.map +1 -0
  48. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js +71 -0
  49. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js.map +1 -0
  50. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js +201 -0
  51. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js.map +1 -0
  52. package/dist-server/routers/api/restful-apis/v1/utils/params.js +293 -0
  53. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -0
  54. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js +90 -0
  55. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js.map +1 -0
  56. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js +277 -0
  57. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js.map +1 -0
  58. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +810 -0
  59. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -0
  60. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js +116 -0
  61. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js.map +1 -0
  62. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +140 -0
  63. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -0
  64. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js +100 -0
  65. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js.map +1 -0
  66. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +78 -0
  67. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -0
  68. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js +96 -0
  69. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js.map +1 -0
  70. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js +244 -0
  71. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js.map +1 -0
  72. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js +96 -0
  73. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js.map +1 -0
  74. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +94 -0
  75. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -0
  76. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +112 -0
  77. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -0
  78. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +13 -0
  79. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -0
  80. package/package.json +54 -54
  81. package/server/middlewares/business-middleware.ts +5 -1
  82. package/server/middlewares/store-middleware.ts +1 -0
  83. package/server/routers/api/restful-apis/unstable/add-draft-release-order.ts +3 -2
  84. package/server/routers/api/restful-apis/unstable/add-inbound-order.ts +5 -2
  85. package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -2
  86. package/server/routers/api/restful-apis/v1/company/add-contact-points.ts +94 -0
  87. package/server/routers/api/restful-apis/v1/company/add-marketplace-order.ts +242 -0
  88. package/server/routers/api/restful-apis/v1/company/add-product.ts +78 -0
  89. package/server/routers/api/restful-apis/v1/company/cancel-marketplace-order.ts +102 -0
  90. package/server/routers/api/restful-apis/v1/company/get-bizplace-list.ts +56 -0
  91. package/server/routers/api/restful-apis/v1/company/get-contact-point-list.ts +69 -0
  92. package/server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.ts +118 -0
  93. package/server/routers/api/restful-apis/v1/company/get-marketplace-store-list.ts +58 -0
  94. package/server/routers/api/restful-apis/v1/company/get-partner-list.ts +97 -0
  95. package/server/routers/api/restful-apis/v1/company/get-product-list.ts +105 -0
  96. package/server/routers/api/restful-apis/v1/company/index.ts +11 -0
  97. package/server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.ts +70 -0
  98. package/server/routers/api/restful-apis/v1/index.ts +2 -31
  99. package/server/routers/api/restful-apis/v1/middlewares/business-middleware.ts +31 -0
  100. package/server/routers/api/restful-apis/v1/middlewares/index.ts +26 -0
  101. package/server/routers/api/restful-apis/v1/middlewares/logging-middleware.ts +24 -0
  102. package/server/routers/api/restful-apis/v1/middlewares/store-middleware.ts +34 -0
  103. package/server/routers/api/restful-apis/v1/middlewares/validation-middleware.ts +50 -0
  104. package/server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.ts +31 -0
  105. package/server/routers/api/restful-apis/v1/utils/error-util.ts +70 -0
  106. package/server/routers/api/restful-apis/v1/utils/expected-parameters.ts +199 -0
  107. package/server/routers/api/restful-apis/v1/utils/params.ts +291 -0
  108. package/server/routers/api/restful-apis/v1/utils/validate-util.ts +74 -0
  109. package/server/routers/api/restful-apis/v1/warehouse/add-inbound-order.ts +361 -0
  110. package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +1000 -0
  111. package/server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.ts +139 -0
  112. package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +144 -0
  113. package/server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.ts +109 -0
  114. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +74 -0
  115. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.ts +99 -0
  116. package/server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.ts +295 -0
  117. package/server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.ts +99 -0
  118. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +97 -0
  119. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +116 -0
  120. package/server/routers/api/restful-apis/v1/warehouse/index.ts +10 -0
  121. package/dist-server/routers/api/restful-apis/v1/bizplace.js +0 -45
  122. package/dist-server/routers/api/restful-apis/v1/bizplace.js.map +0 -1
  123. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js +0 -103
  124. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js.map +0 -1
  125. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js +0 -47
  126. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js.map +0 -1
  127. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js +0 -124
  128. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js.map +0 -1
  129. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js +0 -164
  130. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js.map +0 -1
  131. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js +0 -120
  132. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js.map +0 -1
  133. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js +0 -115
  134. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js.map +0 -1
  135. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js +0 -125
  136. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js.map +0 -1
  137. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js +0 -88
  138. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js.map +0 -1
  139. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js +0 -79
  140. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js.map +0 -1
  141. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js +0 -110
  142. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js.map +0 -1
  143. package/dist-server/routers/api/restful-apis/v1/get-partners.js +0 -23
  144. package/dist-server/routers/api/restful-apis/v1/get-partners.js.map +0 -1
  145. package/dist-server/routers/api/restful-apis/v1/get-products.js +0 -210
  146. package/dist-server/routers/api/restful-apis/v1/get-products.js.map +0 -1
  147. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js +0 -122
  148. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js.map +0 -1
  149. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js +0 -191
  150. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js.map +0 -1
  151. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js +0 -20
  152. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js.map +0 -1
  153. package/server/routers/api/restful-apis/v1/bizplace.ts +0 -45
  154. package/server/routers/api/restful-apis/v1/get-contact-point-list.ts +0 -110
  155. package/server/routers/api/restful-apis/v1/get-delivery-order-detail.ts +0 -46
  156. package/server/routers/api/restful-apis/v1/get-delivery-order-list.ts +0 -121
  157. package/server/routers/api/restful-apis/v1/get-delivery-orders.ts +0 -178
  158. package/server/routers/api/restful-apis/v1/get-goods-received-notes.ts +0 -134
  159. package/server/routers/api/restful-apis/v1/get-inbound-order-detail.ts +0 -128
  160. package/server/routers/api/restful-apis/v1/get-inbound-order-list.ts +0 -126
  161. package/server/routers/api/restful-apis/v1/get-inventory-overall-product-group.ts +0 -99
  162. package/server/routers/api/restful-apis/v1/get-marketplace-store-list.ts +0 -81
  163. package/server/routers/api/restful-apis/v1/get-onhand-inventories.ts +0 -125
  164. package/server/routers/api/restful-apis/v1/get-partners.ts +0 -24
  165. package/server/routers/api/restful-apis/v1/get-products.ts +0 -216
  166. package/server/routers/api/restful-apis/v1/get-release-order-detail.ts +0 -134
  167. package/server/routers/api/restful-apis/v1/get-release-order-list.ts +0 -198
  168. package/server/routers/api/restful-apis/v1/get-warehouses.ts +0 -18
@@ -0,0 +1,242 @@
1
+ import { getConnection, EntityManager, IsNull, SelectQueryBuilder } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+
5
+ import { businessMiddleware } from '../middlewares/business-middleware'
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { expectedParams, reqParams } from '../utils/expected-parameters'
8
+ import { validateFilter, validateReqParams } from '../utils/validate-util'
9
+ import { v4 as uuidv4 } from 'uuid'
10
+
11
+ import { MarketplaceStore } from '@things-factory/integration-marketplace'
12
+ import { Product, ProductBundle, ProductBundleSetting } from '@things-factory/product-base'
13
+
14
+ import {
15
+ MarketplaceOrder as MarketplaceOrderEntity,
16
+ MarketplaceOrderItem as MarketplaceOrderItemEntity,
17
+ MarketplaceOrderShipping as MarketplaceOrderShippingEntity,
18
+ MarketplaceOrderShippingItem as MarketplaceOrderShippingItemEntity,
19
+ MarketplaceProductVariation as MarketplaceProductVariationEntity,
20
+ NoGenerator
21
+ } from '@things-factory/marketplace-base'
22
+ import { loggingMiddleware } from '../middlewares/logging-middleware'
23
+
24
+ router.post('/v1/company/add-marketplace-order', businessMiddleware, loggingMiddleware, async (context, next) => {
25
+ try {
26
+ validateReqParams(context.request.body, reqParams.addMplaceOrder)
27
+ validateFilter(context.request.body, expectedParams.addMplaceOrder)
28
+ validateReqParams(context.request.body.data, reqParams.addMplaceData)
29
+ validateFilter(context.request.body.data, expectedParams.addMplaceData)
30
+ for (const mplaceOrderItem of context.request.body.data.marketplaceOrderItems) {
31
+ validateReqParams(mplaceOrderItem, reqParams.addMplaceOrderDataMplaceOrderItems)
32
+ validateFilter(mplaceOrderItem, expectedParams.addMplaceDataMplaceOrderItems)
33
+ validateReqParams(mplaceOrderItem.marketplaceProductVariation, reqParams.addMplaceDataMplaceProductVar)
34
+ validateFilter(mplaceOrderItem.marketplaceProductVariation, expectedParams.addMplaceDataMplaceProductVar)
35
+ validateReqParams(mplaceOrderItem.marketplaceOrderShipping, reqParams.addMplaceDataMplaceOrderShipping)
36
+ validateFilter(mplaceOrderItem.marketplaceOrderShipping, expectedParams.addMplaceDataMplaceOrderShipping)
37
+ }
38
+
39
+ await getConnection().transaction(async (tx: EntityManager) => {
40
+ const { user, domain } = context.state
41
+ const marketplaceOrder = context.request.body.data
42
+
43
+ const marketplaceStore: MarketplaceStore = await tx.getRepository(MarketplaceStore).findOne({
44
+ where: { name: context.request.body.storeId, domain }
45
+ })
46
+ if (!marketplaceStore) throw new ApiError('E01', 'storeId')
47
+
48
+ let marketplaceOrderItems: MarketplaceOrderItemEntity[] = []
49
+
50
+ let newMarketplaceOrder: MarketplaceOrderEntity = Object.assign({}, marketplaceOrder)
51
+ const itemCount: number = marketplaceOrder.marketplaceOrderItems?.length
52
+
53
+ const currentDate = new Date()
54
+ newMarketplaceOrder.name = `MO-${currentDate.getFullYear()}${
55
+ currentDate.getMonth() + 1
56
+ }${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}`
57
+ newMarketplaceOrder.itemCount = itemCount
58
+ newMarketplaceOrder.marketplaceStore = marketplaceStore
59
+ newMarketplaceOrder.domain = domain
60
+ newMarketplaceOrder.creator = user
61
+ newMarketplaceOrder = await tx.getRepository(MarketplaceOrderEntity).save(newMarketplaceOrder)
62
+
63
+ let newMarketplaceOrderShipping: MarketplaceOrderShippingEntity
64
+ if (marketplaceOrder?.marketplaceOrderShipping) {
65
+ const marketplaceOrderShipping: any = marketplaceOrder.marketplaceOrderShipping
66
+ newMarketplaceOrderShipping = Object.assign({}, marketplaceOrderShipping)
67
+ newMarketplaceOrderShipping.name = marketplaceOrderShipping?.shippingId
68
+ ? marketplaceOrderShipping.shippingId
69
+ : NoGenerator.orderShipping()
70
+ newMarketplaceOrderShipping.transporter =
71
+ marketplaceOrderShipping?.transporter === '' ? null : marketplaceOrderShipping.transporter
72
+ newMarketplaceOrderShipping.ownTransporter =
73
+ marketplaceOrderShipping?.transporter === '' ? null : marketplaceOrderShipping.transporter
74
+ newMarketplaceOrderShipping.marketplaceStore = marketplaceStore
75
+ newMarketplaceOrderShipping.orderNoRef = newMarketplaceOrder.orderNo
76
+ newMarketplaceOrderShipping.subOrderNoRef = newMarketplaceOrder.orderNo
77
+ newMarketplaceOrderShipping.domain = domain
78
+ newMarketplaceOrderShipping.creator = user
79
+ newMarketplaceOrderShipping = await tx
80
+ .getRepository(MarketplaceOrderShippingEntity)
81
+ .save(newMarketplaceOrderShipping)
82
+ }
83
+
84
+ marketplaceOrderItems = await Promise.all(
85
+ marketplaceOrder?.marketplaceOrderItems.map(async orderItem => {
86
+ let marketplaceOrderItem: MarketplaceOrderItemEntity = Object.assign({}, orderItem)
87
+
88
+ const marketplaceProductVariation = orderItem.marketplaceProductVariation
89
+ const qb: SelectQueryBuilder<MarketplaceProductVariationEntity> = await tx
90
+ .getRepository(MarketplaceProductVariationEntity)
91
+ .createQueryBuilder('mpv')
92
+ .leftJoin('mpv.marketplaceProduct', 'mp')
93
+ .leftJoin('mp.marketplaceStore', 'ms')
94
+ .where('mpv.domain_id = :domainId')
95
+ .andWhere('mpv.variation_id = :variationId')
96
+ .andWhere('ms.id = :marketplaceStoreId')
97
+ .setParameters({
98
+ domainId: domain.id,
99
+ variationId: marketplaceProductVariation.variationId,
100
+ marketplaceStoreId: marketplaceStore.id
101
+ })
102
+
103
+ let foundVariation: MarketplaceProductVariationEntity = await qb.getOne()
104
+
105
+ if (!foundVariation) {
106
+ let newVariation: MarketplaceProductVariationEntity = Object.assign({}, marketplaceProductVariation)
107
+ newVariation.status = 'ACTIVE'
108
+ newVariation.domain = domain
109
+
110
+ await tx.getRepository(MarketplaceProductVariationEntity).save(newVariation)
111
+ foundVariation = newVariation
112
+ }
113
+
114
+ marketplaceOrderItem.marketplaceProductVariation = foundVariation
115
+ marketplaceOrderItem.name = orderItem.orderItemId
116
+ marketplaceOrderItem.marketplaceOrder = newMarketplaceOrder
117
+ marketplaceOrderItem.domain = domain
118
+ marketplaceOrderItem.creator = user
119
+
120
+ return marketplaceOrderItem
121
+ })
122
+ )
123
+
124
+ marketplaceOrderItems = await tx.getRepository(MarketplaceOrderItemEntity).save(marketplaceOrderItems)
125
+
126
+ await Promise.all(
127
+ marketplaceOrderItems.map(async marketplaceOrderItem => {
128
+ const marketplaceProductVariation = marketplaceOrderItem.marketplaceProductVariation
129
+
130
+ let product: Product = await tx.getRepository(Product).findOne({
131
+ where: { domain: marketplaceStore.domain, sku: marketplaceProductVariation.sku, deletedAt: IsNull() },
132
+ relations: ['productDetails']
133
+ })
134
+
135
+ let productBundle: ProductBundle
136
+ if (!product) {
137
+ productBundle = await tx.getRepository(ProductBundle).findOne({
138
+ where: { domain: marketplaceStore.domain, sku: marketplaceProductVariation.sku },
139
+ relations: ['productBundleSettings', 'productBundleSettings.product']
140
+ })
141
+ }
142
+
143
+ let existingMarketplaceOrderShippingItems: MarketplaceOrderShippingItemEntity[] = await tx
144
+ .getRepository(MarketplaceOrderShippingItemEntity)
145
+ .find({
146
+ where: { domain: marketplaceStore.domain, marketplaceOrderItem }
147
+ })
148
+
149
+ if (existingMarketplaceOrderShippingItems && existingMarketplaceOrderShippingItems?.length) {
150
+ } else {
151
+ if (productBundle) {
152
+ const productBundleSettings: ProductBundleSetting[] = productBundle.productBundleSettings
153
+ let marketplaceOrderShippingItems: MarketplaceOrderShippingItemEntity[] = []
154
+ productBundleSettings.map(productBundleSetting => {
155
+ let marketplaceOrderShippingItem: MarketplaceOrderShippingItemEntity =
156
+ new MarketplaceOrderShippingItemEntity()
157
+ marketplaceOrderShippingItem.name = uuidv4()
158
+ marketplaceOrderShippingItem.qty = marketplaceOrderItem.qty * productBundleSetting.bundleQty
159
+ marketplaceOrderShippingItem.domain = marketplaceStore.domain
160
+ marketplaceOrderShippingItem.marketplaceOrderItem = marketplaceOrderItem
161
+ marketplaceOrderShippingItem.marketplaceOrderShipping = newMarketplaceOrderShipping
162
+ marketplaceOrderShippingItem.product = productBundleSetting.product
163
+
164
+ marketplaceOrderShippingItems.push(marketplaceOrderShippingItem)
165
+ })
166
+
167
+ await tx.getRepository(MarketplaceOrderShippingItemEntity).save(marketplaceOrderShippingItems)
168
+ } else {
169
+ let marketplaceOrderShippingItem: MarketplaceOrderShippingItemEntity =
170
+ new MarketplaceOrderShippingItemEntity()
171
+ marketplaceOrderShippingItem.name = uuidv4()
172
+ marketplaceOrderShippingItem.qty = marketplaceOrderItem.qty
173
+ marketplaceOrderShippingItem.domain = marketplaceStore.domain
174
+ marketplaceOrderShippingItem.marketplaceOrderItem = marketplaceOrderItem
175
+ marketplaceOrderShippingItem.marketplaceOrderShipping = newMarketplaceOrderShipping
176
+ marketplaceOrderShippingItem.product = product ? product : null
177
+
178
+ await tx.getRepository(MarketplaceOrderShippingItemEntity).save(marketplaceOrderShippingItem)
179
+ }
180
+ }
181
+ })
182
+ )
183
+
184
+ let marketplaceOrderItemsData = []
185
+ for (const item of marketplaceOrderItems) {
186
+ const datapoint = {
187
+ marketplaceOrderVariation: {
188
+ variationId: item.marketplaceProductVariation.variationId,
189
+ sku: item.marketplaceProductVariation.sku,
190
+ variationSku: item.marketplaceProductVariation.variationSku,
191
+ variationName: item.marketplaceProductVariation.variationName
192
+ },
193
+ marketplaceOrderShipping: {
194
+ attentionTo: item.marketplaceOrderShipping.attentionTo,
195
+ address1: item.marketplaceOrderShipping.address1,
196
+ address2: item.marketplaceOrderShipping.address2,
197
+ address3: item.marketplaceOrderShipping.address3,
198
+ address4: item.marketplaceOrderShipping.address4,
199
+ address5: item.marketplaceOrderShipping.address5,
200
+ state: item.marketplaceOrderShipping.state,
201
+ city: item.marketplaceOrderShipping.city,
202
+ postCode: item.marketplaceOrderShipping.postCode,
203
+ country: item.marketplaceOrderShipping.country,
204
+ phone1: item.marketplaceOrderShipping.phone1,
205
+ phone2: item.marketplaceOrderShipping.phone2,
206
+ email: item.marketplaceOrderShipping.email,
207
+ freightType: item.marketplaceOrderShipping.freightType,
208
+ parcelType: item.marketplaceOrderShipping.parcelType,
209
+ deliveryMethod: item.marketplaceOrderShipping.deliveryMethod,
210
+ totalWeight: item.marketplaceOrderShipping.totalWeight,
211
+ totalVolume: item.marketplaceOrderShipping.totalVolume,
212
+ transporter: item.marketplaceOrderShipping.transporter
213
+ }
214
+ }
215
+ marketplaceOrderItemsData.push(datapoint)
216
+ }
217
+ const data = {
218
+ orderNo: newMarketplaceOrder.orderNo,
219
+ itemCount,
220
+ paymentMethod: newMarketplaceOrder.paymentMethod,
221
+ remark: newMarketplaceOrder.remark,
222
+ giftOption: newMarketplaceOrder.giftOption,
223
+ orderCreatedAt: newMarketplaceOrder.orderCreatedAt,
224
+ orderUpdatedAt: newMarketplaceOrder.orderUpdatedAt,
225
+ marketplaceOrderItems: marketplaceOrderItemsData,
226
+ orderItemId: newMarketplaceOrder.orderItemId,
227
+ qty: newMarketplaceOrder.qty,
228
+ cancelBy: newMarketplaceOrder.cancelBy,
229
+ returnStatus: newMarketplaceOrder.returnStatus,
230
+ packageId: newMarketplaceOrder.packageId,
231
+ status: newMarketplaceOrder.status
232
+ }
233
+
234
+ context.body = {
235
+ data
236
+ }
237
+ })
238
+ } catch (e) {
239
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
240
+ else throwInternalServerError(context, e)
241
+ }
242
+ })
@@ -0,0 +1,78 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { Bizplace } from '@things-factory/biz-base'
5
+ import { Product, ProductDetail } from '@things-factory/product-base'
6
+
7
+ import { businessMiddleware } from '../middlewares/business-middleware'
8
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
9
+ import { expectedParams, reqParams } from '../utils/expected-parameters'
10
+ import { validateFilter, validateReqParams } from '../utils/validate-util'
11
+ import _ from 'lodash'
12
+ import { loggingMiddleware } from '../middlewares/logging-middleware'
13
+
14
+ router.post('/v1/company/add-products', businessMiddleware, loggingMiddleware, async (context, next) => {
15
+ try {
16
+ if (!_.has(context.request.body, 'data')) throw new ApiError('E03', 'data')
17
+ if (!Array.isArray(context.request.body.data)) throw new ApiError('E01', 'data field is not an array')
18
+ for (const datapoint of context.request.data) {
19
+ validateReqParams(datapoint, reqParams.addProductsData)
20
+ validateFilter(datapoint, expectedParams.addProductsData)
21
+ validateReqParams(datapoint.productDetails, reqParams.addProductsDataProductDetails)
22
+ validateFilter(datapoint.productDetails, expectedParams.addProductsDataProductDetails)
23
+ }
24
+
25
+ const products = context.request.body.data
26
+ const { user, domain } = context.state
27
+
28
+ // find bizplace
29
+ const bizplace = await getRepository(Bizplace).findOne({
30
+ where: {
31
+ domain: context.state.domain
32
+ },
33
+ relations: ['domain']
34
+ })
35
+
36
+ // save product
37
+ await Promise.all(
38
+ products.map(async p => {
39
+ const product = p
40
+ const productDetails = p.productDetails
41
+
42
+ product.domain = domain
43
+ product.bizplace = bizplace
44
+ product.creator = user
45
+ product.updater = user
46
+ delete product.productDetails
47
+
48
+ const result = await getRepository(Product).save(products)
49
+
50
+ const newProduct = result[0]
51
+
52
+ // save product details
53
+ await Promise.all(
54
+ productDetails.map(async pd => {
55
+ const productDetails = pd
56
+ await getRepository(ProductDetail).save({
57
+ ...productDetails,
58
+ name: productDetails.gtin,
59
+ product: newProduct,
60
+ childProductDetail: null,
61
+ childQty: 0,
62
+ domain: domain,
63
+ creator: user,
64
+ updater: user
65
+ })
66
+ })
67
+ )
68
+ })
69
+ )
70
+
71
+ context.body = {
72
+ data: context.request.body
73
+ }
74
+ } catch (e) {
75
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
76
+ else throwInternalServerError(context, e)
77
+ }
78
+ })
@@ -0,0 +1,102 @@
1
+ import { getConnection, EntityManager } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { Domain } from '@things-factory/shell'
5
+ import { MarketplaceOrder, MarketplaceOrderItem } from '@things-factory/marketplace-base'
6
+ import { MarketplaceStore } from '@things-factory/integration-marketplace'
7
+
8
+ import { businessMiddleware } from '../middlewares/business-middleware'
9
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
10
+ import { expectedParams, reqParams } from '../utils/expected-parameters'
11
+ import { validateFilter, validateReqParams } from '../utils/validate-util'
12
+ import { User } from '@things-factory/auth-base'
13
+ import { Bizplace, getCustomerBizplaces } from '@things-factory/biz-base'
14
+ import { FulfillmentAPI, FulfillmentCenter } from '@things-factory/integration-fulfillment'
15
+ import { loggingMiddleware } from '../middlewares/logging-middleware'
16
+
17
+ router.post('/v1/company/cancel-marketplace-order', businessMiddleware, loggingMiddleware, async (context, next) => {
18
+ try {
19
+ validateReqParams(context.request.body, reqParams.requireDataKey)
20
+ validateFilter(context.request.body, expectedParams.requireDataKey)
21
+ validateReqParams(context.request.body.data, reqParams.cancelMarketplaceOrder)
22
+ validateFilter(context.request.body.data, expectedParams.cancelMarketplaceOrder)
23
+
24
+ const { orderNo, remark, cancelBy } = context.request.body.data
25
+ const { domain, user }: { domain: Domain; user: User } = context.state
26
+
27
+ await getConnection().transaction(async (tx: EntityManager) => {
28
+ const marketplaceStore: MarketplaceStore = await tx.getRepository(MarketplaceStore).findOne({
29
+ where: { name: context.request.body.data.storeId, domain: context.state.business.domain }
30
+ })
31
+ if (!marketplaceStore) throw new ApiError('E01', 'storeId does not exist')
32
+
33
+ let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
34
+ where: { domain, orderNo, marketplaceStore },
35
+ relations: ['fulfillmentCenter', 'marketplaceStore', 'marketplaceOrderItems']
36
+ })
37
+ if (!marketplaceOrder) throw new ApiError('E01', 'orderNo is invalid')
38
+
39
+ let marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems.map(orderItem => {
40
+ let marketplaceOrderItem: MarketplaceOrderItem = Object.assign({}, orderItem)
41
+ marketplaceOrderItem.reason = remark
42
+ marketplaceOrderItem.status = 'cancelled'
43
+ marketplaceOrderItem.updater = user
44
+ marketplaceOrderItem.cancelBy = cancelBy
45
+
46
+ return marketplaceOrderItem
47
+ })
48
+ await tx.getRepository(MarketplaceOrderItem).save(marketplaceOrderItems)
49
+
50
+ marketplaceOrder.status = 'cancelled'
51
+ marketplaceOrder.remark = remark
52
+ marketplaceOrder.updater = user
53
+ marketplaceOrder = await tx.getRepository(MarketplaceOrder).save(marketplaceOrder)
54
+
55
+ const cancelStatuses: string[] = ['cancelled', 'canceled']
56
+ if (cancelStatuses.includes(marketplaceOrder.status) && marketplaceOrder?.releaseOrderId) {
57
+ if (marketplaceOrder.isSplitted) {
58
+ const fulfillmentCenter: FulfillmentCenter = marketplaceOrder.fulfillmentCenter
59
+ const centerId: string = fulfillmentCenter.centerId
60
+ const warehouseDomain: Domain = await tx.getRepository(Domain).findOne({ where: { subdomain: centerId } })
61
+ const customerBizplaces: Bizplace[] = await getCustomerBizplaces(warehouseDomain)
62
+ const customerBizplaceId: string = customerBizplaces[0].id
63
+
64
+ const { items: releaseOrders }: any = await FulfillmentAPI.getOutboundOrders(fulfillmentCenter, {
65
+ customerBizplaceId,
66
+ refNo: marketplaceOrder.orderNo
67
+ })
68
+ if (releaseOrders?.length) {
69
+ for (var a = 0; a < releaseOrders.length; a++) {
70
+ const releaseOrderId: string = releaseOrders[a].id
71
+ await FulfillmentAPI.cancelReleaseOrder(fulfillmentCenter, { customerBizplaceId, releaseOrderId })
72
+ }
73
+ }
74
+ } else {
75
+ const releaseOrderId: string = marketplaceOrder.releaseOrderId
76
+ const fulfillmentCenter: FulfillmentCenter = marketplaceOrder.fulfillmentCenter
77
+ const centerId: string = fulfillmentCenter.centerId
78
+
79
+ const warehouseDomain: Domain = await tx.getRepository(Domain).findOne({ where: { subdomain: centerId } })
80
+ const customerBizplaces: Bizplace[] = await getCustomerBizplaces(warehouseDomain)
81
+ const customerBizplaceId: string = customerBizplaces[0].id
82
+ await FulfillmentAPI.cancelReleaseOrder(fulfillmentCenter, { customerBizplaceId, releaseOrderId })
83
+ }
84
+ }
85
+ const data = {
86
+ orderNo: marketplaceOrder.orderNo,
87
+ status: marketplaceOrder.status,
88
+ remark: marketplaceOrder.remark,
89
+ cancelBy: cancelBy || null,
90
+ createdAt: marketplaceOrder.createdAt,
91
+ updatedAt: marketplaceOrder.updatedAt
92
+ }
93
+
94
+ context.body = {
95
+ data
96
+ }
97
+ })
98
+ } catch (e) {
99
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
100
+ else throwInternalServerError(context, e)
101
+ }
102
+ })
@@ -0,0 +1,56 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { Bizplace } from '@things-factory/biz-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { validateLimitOffset } from '../utils/validate-util'
8
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
9
+
10
+ router.get(
11
+ '/v1/company/get-bizplace-list',
12
+ businessMiddleware,
13
+ validationMiddleware,
14
+ loggingMiddleware,
15
+ async (context, next) => {
16
+ try {
17
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
18
+
19
+ // get bizplaces for that company
20
+ const companyId = context.state.business.id
21
+ const [bizplaces, totalCount]: Bizplace[] = await getRepository(Bizplace).findAndCount({
22
+ where: { company: companyId },
23
+ relations: ['domain'],
24
+ skip: offset,
25
+ take: limit,
26
+ order: { createdAt: 'DESC' }
27
+ })
28
+
29
+ // create and format data response
30
+ let data = []
31
+ for (const bizplace of bizplaces) {
32
+ const datapoint = {
33
+ bizplace: {
34
+ id: bizplace.id,
35
+ name: bizplace.name,
36
+ description: bizplace.description,
37
+ address: bizplace.address,
38
+ postalCode: bizplace.postalCode
39
+ },
40
+ extType: bizplace.domain.extType
41
+ }
42
+ data.push(datapoint)
43
+ }
44
+
45
+ context.body = {
46
+ data,
47
+ totalCount,
48
+ limit,
49
+ offset
50
+ }
51
+ } catch (e) {
52
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
53
+ else throwInternalServerError(context, e)
54
+ }
55
+ }
56
+ )
@@ -0,0 +1,69 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { ContactPoint } from '@things-factory/biz-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { validateLimitOffset } from '../utils/validate-util'
8
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
9
+
10
+ router.get(
11
+ '/v1/company/get-contact-point-list',
12
+ businessMiddleware,
13
+ validationMiddleware,
14
+ loggingMiddleware,
15
+ async (context, next) => {
16
+ try {
17
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
18
+
19
+ // get contact points for that bizplace
20
+ // optional query parameter filter
21
+ let filter = { ...context.query }
22
+ // map query field to database column
23
+ filter['bizplace'] = filter['bizplaceId']
24
+ delete filter['bizplaceId']
25
+ delete filter['limit']
26
+ delete filter['offset']
27
+ const [contactPoints, totalCount]: ContactPoint[] = await getRepository(ContactPoint).findAndCount({
28
+ where: filter,
29
+ relations: ['bizplace'],
30
+ skip: offset,
31
+ take: limit,
32
+ order: { createdAt: 'DESC' }
33
+ })
34
+
35
+ // create and format data response
36
+ let data = []
37
+ for (const contactPoint of contactPoints) {
38
+ const datapoint = {
39
+ bizplace: {
40
+ id: contactPoint.bizplace.id,
41
+ name: contactPoint.bizplace.name
42
+ },
43
+ name: contactPoint.name,
44
+ companyName: contactPoint.companyName,
45
+ email: contactPoint.email,
46
+ fax: contactPoint.fax,
47
+ phone: contactPoint.phone,
48
+ accountNo: contactPoint.accountNo,
49
+ address: contactPoint.address,
50
+ address2: contactPoint.address2,
51
+ city: contactPoint.city,
52
+ postCode: contactPoint.postCode,
53
+ type: contactPoint.type
54
+ }
55
+ data.push(datapoint)
56
+ }
57
+
58
+ context.body = {
59
+ data,
60
+ totalCount,
61
+ limit,
62
+ offset
63
+ }
64
+ } catch (e) {
65
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
66
+ else throwInternalServerError(context, e)
67
+ }
68
+ }
69
+ )
@@ -0,0 +1,118 @@
1
+ import { getRepository, Between } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { MarketplaceOrderShipping } from '@things-factory/marketplace-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { validateFromToDate, validateLimitOffset } from '../utils/validate-util'
8
+ import _ from 'lodash'
9
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
10
+
11
+ router.get(
12
+ '/v1/company/get-marketplace-order-shipping-list',
13
+ businessMiddleware,
14
+ validationMiddleware,
15
+ loggingMiddleware,
16
+ async (context, next) => {
17
+ try {
18
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
19
+ const { fromDate, toDate } = validateFromToDate(context.query.fromDate, context.query.toDate)
20
+
21
+ let filter = { ...context.query }
22
+ const domainId = context.state.domain.id
23
+ filter.marketplaceStore = {}
24
+ filter.marketplaceStore.name = filter.storeId
25
+ filter.domain = domainId
26
+
27
+ // map optional fields to db columns
28
+ if (_.has(filter, 'shippingNo')) {
29
+ filter['name'] = filter['shippingNo']
30
+ delete filter['shippingNo']
31
+ }
32
+ if (_.has(filter, 'orderNo')) {
33
+ filter['orderNoRef'] = filter['orderNo']
34
+ delete filter['orderNo']
35
+ }
36
+
37
+ filter['createdAt'] = Between(fromDate, toDate)
38
+
39
+ delete filter['storeId']
40
+ delete filter['fromDate']
41
+ delete filter['toDate']
42
+ delete filter['limit']
43
+ delete filter['offset']
44
+ // get marketplace order shippings for that domain
45
+ const [marketplaceOrderShippings, totalCount]: MarketplaceOrderShipping[] = await getRepository(
46
+ MarketplaceOrderShipping
47
+ ).findAndCount({
48
+ where: filter,
49
+ relations: [
50
+ 'marketplaceStore',
51
+ 'marketplaceOrderShippingItems',
52
+ 'marketplaceOrderShippingItems.marketplaceOrderItem',
53
+ 'marketplaceOrderShippingItems.marketplaceOrderItem.marketplaceProductVariation'
54
+ ],
55
+ skip: offset,
56
+ take: limit,
57
+ order: { createdAt: 'DESC' }
58
+ })
59
+
60
+ // create and format data response
61
+ let data = []
62
+ for (const marketplaceOrderShipping of marketplaceOrderShippings) {
63
+ const datapoint = {
64
+ attentionTo: marketplaceOrderShipping.attentionTo,
65
+ address1: marketplaceOrderShipping.address1,
66
+ address2: marketplaceOrderShipping.address2,
67
+ address3: marketplaceOrderShipping.address3,
68
+ address4: marketplaceOrderShipping.address4,
69
+ address5: marketplaceOrderShipping.address5,
70
+ state: marketplaceOrderShipping.state,
71
+ city: marketplaceOrderShipping.city,
72
+ postCode: marketplaceOrderShipping.postCode,
73
+ country: marketplaceOrderShipping.country,
74
+ phone1: marketplaceOrderShipping.phone1,
75
+ phone2: marketplaceOrderShipping.phone2,
76
+ email: marketplaceOrderShipping.email,
77
+ freightType: marketplaceOrderShipping.freightType,
78
+ parcelType: marketplaceOrderShipping.parcelType,
79
+ deliveryMethod: marketplaceOrderShipping.deliveryMethod,
80
+ totalWeight: marketplaceOrderShipping.totalWeight,
81
+ totalVolume: marketplaceOrderShipping.totalVolume,
82
+ transporter: marketplaceOrderShipping.transporter,
83
+ marketplaceStore: {
84
+ name: marketplaceOrderShipping.marketplaceStore.name,
85
+ storeId: marketplaceOrderShipping.marketplaceStore.id
86
+ },
87
+ marketplaceOrderItems: marketplaceOrderShipping.marketplaceOrderShippingItems.map(mposi => {
88
+ return {
89
+ marketplaceProductVariation: {
90
+ variationId: mposi.marketplaceOrderItem.marketplaceProductVariation.variationId,
91
+ sku: mposi.marketplaceOrderItem.marketplaceProductVariation.sku,
92
+ variationSku: mposi.marketplaceOrderItem.marketplaceProductVariation.variationSku,
93
+ variationName: mposi.marketplaceOrderItem.marketplaceProductVariation.name
94
+ },
95
+ orderItemId: mposi.marketplaceOrderItem.id,
96
+ qty: mposi.marketplaceOrderItem.qty,
97
+ cancelBy: mposi.marketplaceOrderItem.cancelBy,
98
+ returnStatus: mposi.marketplaceOrderItem.returnStatus,
99
+ packageId: mposi.marketplaceOrderItem.packageId,
100
+ status: mposi.marketplaceOrderItem.status
101
+ }
102
+ })
103
+ }
104
+ data.push(datapoint)
105
+ }
106
+
107
+ context.body = {
108
+ data,
109
+ totalCount,
110
+ limit,
111
+ offset
112
+ }
113
+ } catch (e) {
114
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
115
+ else throwInternalServerError(context, e)
116
+ }
117
+ }
118
+ )