@webresto/graphql 1.3.7 → 1.3.8

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 (142) hide show
  1. package/.gitattributes +2 -0
  2. package/.gitlab-ci.yml +18 -0
  3. package/.vscode/extensions.json +5 -0
  4. package/docs/actions.md +25 -0
  5. package/docs/authorization.md +215 -0
  6. package/docs/captcha.md +71 -0
  7. package/docs/device-id.md +30 -0
  8. package/docs/messages.md +10 -0
  9. package/docs/user.md +54 -0
  10. package/index.d.ts +0 -1
  11. package/index.js +6 -2
  12. package/index.ts +2 -2
  13. package/lib/afterHook.js +8 -0
  14. package/lib/afterHook.ts +9 -0
  15. package/lib/bindTranslations.d.ts +1 -0
  16. package/lib/bindTranslations.js +40 -0
  17. package/lib/bindTranslations.ts +39 -0
  18. package/lib/defaults.d.ts +1 -0
  19. package/lib/defaults.js +49 -10
  20. package/lib/defaults.ts +55 -0
  21. package/lib/eventHelper.d.ts +14 -5
  22. package/lib/eventHelper.js +28 -9
  23. package/lib/eventHelper.ts +41 -8
  24. package/lib/getRecomended.d.ts +1 -0
  25. package/lib/getRecomended.js +29 -0
  26. package/lib/getRecomended.ts +31 -0
  27. package/lib/graphqlHelper.d.ts +3 -4
  28. package/lib/graphqlHelper.js +184 -72
  29. package/lib/graphqlHelper.ts +329 -185
  30. package/lib/jwt.d.ts +10 -0
  31. package/lib/jwt.js +43 -0
  32. package/lib/jwt.ts +61 -0
  33. package/package.json +13 -6
  34. package/src/additionalResolvers.d.ts +72 -9
  35. package/src/additionalResolvers.js +93 -24
  36. package/src/additionalResolvers.ts +105 -34
  37. package/src/graphql.d.ts +5 -3
  38. package/src/graphql.js +170 -37
  39. package/src/graphql.ts +210 -60
  40. package/src/resolvers/bonusProgram.d.ts +32 -0
  41. package/src/resolvers/bonusProgram.js +65 -0
  42. package/src/resolvers/bonusProgram.ts +79 -0
  43. package/src/resolvers/captcha.d.ts +11 -0
  44. package/src/resolvers/captcha.js +19 -0
  45. package/src/resolvers/captcha.ts +16 -0
  46. package/src/resolvers/checkout.d.ts +35 -16
  47. package/src/resolvers/checkout.js +171 -94
  48. package/src/resolvers/checkout.ts +214 -104
  49. package/src/resolvers/dishAndModifier.js +8 -4
  50. package/src/resolvers/dishAndModifier.ts +4 -0
  51. package/src/resolvers/error.d.ts +9 -0
  52. package/src/resolvers/error.js +21 -0
  53. package/src/resolvers/error.ts +21 -0
  54. package/src/resolvers/menu.d.ts +9 -0
  55. package/src/resolvers/menu.js +12 -0
  56. package/src/resolvers/menu.ts +10 -0
  57. package/src/resolvers/order.d.ts +527 -0
  58. package/src/resolvers/order.js +349 -0
  59. package/src/resolvers/order.ts +435 -0
  60. package/src/resolvers/paymentMethod.js +7 -3
  61. package/src/resolvers/paymentMethod.ts +9 -5
  62. package/src/resolvers/pickupPoint.d.ts +1 -0
  63. package/src/resolvers/pickupPoint.js +24 -0
  64. package/src/resolvers/pickupPoint.ts +23 -0
  65. package/src/resolvers/recomended.d.ts +13 -0
  66. package/src/resolvers/recomended.js +80 -0
  67. package/src/resolvers/recomended.ts +86 -0
  68. package/src/resolvers/restrictions.d.ts +37 -1
  69. package/src/resolvers/restrictions.js +100 -15
  70. package/src/resolvers/restrictions.ts +106 -14
  71. package/src/resolvers/streets.d.ts +1 -1
  72. package/src/resolvers/streets.js +1 -4
  73. package/src/resolvers/streets.ts +1 -3
  74. package/src/resolvers/subscriptions.d.ts +4 -4
  75. package/src/resolvers/subscriptions.js +49 -12
  76. package/src/resolvers/subscriptions.ts +59 -14
  77. package/src/resolvers/telemetry.d.ts +14 -0
  78. package/src/resolvers/telemetry.js +25 -0
  79. package/src/resolvers/telemetry.ts +24 -0
  80. package/src/resolvers/user.d.ts +82 -0
  81. package/src/resolvers/user.js +416 -0
  82. package/src/resolvers/user.ts +621 -0
  83. package/src/resolvers/userLocation.d.ts +53 -0
  84. package/src/resolvers/userLocation.js +74 -0
  85. package/src/resolvers/userLocation.ts +125 -0
  86. package/src/resolvers/userOTPrequest.d.ts +21 -0
  87. package/src/resolvers/userOTPrequest.js +57 -0
  88. package/src/resolvers/userOTPrequest.ts +75 -0
  89. package/test/e2e_helper.js +157 -0
  90. package/test/e2e_helper.ts +212 -0
  91. package/test/fixture/config/i18n.js +7 -20
  92. package/test/fixture/config/locales/de.json +1 -0
  93. package/test/fixture/config/locales/en.json +10 -0
  94. package/test/fixture/config/locales/es.json +3 -0
  95. package/test/fixture/config/locales/fr.json +1 -0
  96. package/test/fixture/config/log.js +1 -1
  97. package/test/fixture/package.json +5 -6
  98. package/test/fixture/patches/rttc+10.0.1.patch +17 -0
  99. package/test/integration/captcha.test.js +20 -0
  100. package/test/integration/captcha.test.ts +25 -0
  101. package/test/integration/dish.test.js +35 -0
  102. package/test/integration/dish.test.ts +43 -0
  103. package/test/integration/graphql.test.js +5 -2
  104. package/test/integration/graphql.test.ts +2 -4
  105. package/test/integration/images.test.js +35 -0
  106. package/test/integration/images.test.ts +40 -0
  107. package/test/integration/locale.test.js +26 -0
  108. package/test/integration/locale.test.ts +32 -0
  109. package/test/integration/order.test.js +56 -43
  110. package/test/integration/order.test.ts +59 -59
  111. package/test/integration/subscriptions.test.js +136 -0
  112. package/test/integration/subscriptions.test.ts +162 -0
  113. package/test/integration/user.test.js +249 -0
  114. package/test/integration/user.test.ts +299 -0
  115. package/test/unit/first.test.js +4 -2
  116. package/test/unit/first.test.ts +1 -1
  117. package/test/unit/get-recomended.test.js +56 -0
  118. package/test/unit/get-recomended.test.ts +63 -0
  119. package/translations/de.json +2 -0
  120. package/translations/en.json +3 -0
  121. package/translations/es.json +3 -0
  122. package/translations/fr.json +2 -0
  123. package/translations/ru.json +36 -0
  124. package/tsconfig.json +20 -5
  125. package/types/global.d.ts +30 -0
  126. package/types/global.js +2 -0
  127. package/types/global.ts +31 -0
  128. package/types/primitives.d.ts +19 -0
  129. package/types/references.d.ts +1 -0
  130. package/types/restoGraphQLConfig.d.ts +13 -0
  131. package/lib/afterHook.ts___graphql-transport-ws +0 -138
  132. package/lib/afterHook.ts___graphql-ws +0 -133
  133. package/lib/errorWrapper.d.ts +0 -4
  134. package/lib/errorWrapper.js +0 -13
  135. package/lib/errorWrapper.ts +0 -12
  136. package/notes.md +0 -1976
  137. package/src/resolvers/cart.d.ts +0 -343
  138. package/src/resolvers/cart.js +0 -196
  139. package/src/resolvers/cart.ts +0 -278
  140. package/test/fixture/config/connections.js +0 -9
  141. package/test/integration/sails_not_crash.test.js +0 -3
  142. package/test/integration/sails_not_crash.test.ts +0 -3
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const checkExpression_1 = require("@webresto/core/libs/checkExpression");
4
+ const jwt_1 = require("../../lib/jwt");
5
+ const graphqlHelper_1 = require("@webresto/graphql/lib/graphqlHelper");
6
+ (0, graphqlHelper_1.addToReplaceList)("Order.promotionState", "promotionState: [PromotionState]");
7
+ (0, graphqlHelper_1.addToReplaceList)("Order.pickupPoint", "pickupPoint: PickupPoint");
8
+ const graphqlHelper_2 = require("../../lib/graphqlHelper");
9
+ graphqlHelper_2.default.addType(`#graphql
10
+ input InputOrderUpdate {
11
+ id: String!
12
+ trifleFrom: Int
13
+ comment: String
14
+ date: String
15
+ isSelfService: Boolean
16
+ paymentMethodId: String
17
+ promotionCodeString: String
18
+ }
19
+ `);
20
+ exports.default = {
21
+ Query: {
22
+ order: {
23
+ def: `#graphql
24
+ """ if orderId is not set, a new cart will be returned """
25
+ order(orderId: String, shortId: String, orderNumber: String): Order`,
26
+ fn: async function (parent, args, context) {
27
+ let order;
28
+ let criteria = {};
29
+ if (args.orderNumber) {
30
+ criteria["rmsOrderNumber"] = args.orderNumber;
31
+ criteria["sort"] = "createdAt DESC";
32
+ }
33
+ else if (args.orderId) {
34
+ criteria["id"] = args.orderId;
35
+ }
36
+ else if (args.shortId) {
37
+ criteria["shortId"] = args.shortId;
38
+ }
39
+ if (Object.keys(criteria).length !== 0) {
40
+ order = (await Order.find(criteria))[0];
41
+ }
42
+ if (!order) {
43
+ sails.log.silly("GQL > order resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
44
+ order = await getNewCart(context, args.orderId);
45
+ }
46
+ let fullOrder = await Order.populate(order.id);
47
+ emitter.emit("http-api:before-response-order", fullOrder);
48
+ return fullOrder;
49
+ },
50
+ },
51
+ },
52
+ Mutation: {
53
+ orderAddDish: {
54
+ def: "orderAddDish(orderId: String, dishId: String, amount: Int, modifiers: Json, comment: String, from: String, replace: Boolean, orderDishId: Int): Order",
55
+ fn: async function (parent, args, context) {
56
+ let order;
57
+ if (args.modifiers) {
58
+ args.modifiers.forEach((modifier) => {
59
+ if (modifier.amount === undefined || modifier.id === undefined) {
60
+ const error = `modifier required (amount, id) for dish: ${args.dishId} current values: id: ${modifier.id}, amount: ${modifier.amount}`;
61
+ sails.log(error);
62
+ throw new Error(error);
63
+ }
64
+ });
65
+ }
66
+ if (args.orderId)
67
+ order = await Order.findOne({ id: args.orderId });
68
+ if (!order) {
69
+ sails.log.silly("GQL > orderAddDish resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
70
+ order = await getNewCart(context, args.orderId);
71
+ }
72
+ const dish = await Dish.findOne({ id: args.dishId });
73
+ if (!dish && !args.replace)
74
+ throw `dish with id ${args.dishId} not found`;
75
+ if (dish && (0, checkExpression_1.default)(dish) === "promo") {
76
+ let additionalInfo;
77
+ try {
78
+ additionalInfo = JSON.parse(dish.additionalInfo);
79
+ }
80
+ catch (e) { }
81
+ if (additionalInfo && additionalInfo.defaultOrderDish) {
82
+ // Исключение на товар в каждую корзину
83
+ }
84
+ else {
85
+ const error = `"${dish.name}" not promo item`;
86
+ sails.log(error);
87
+ throw new Error(error);
88
+ }
89
+ }
90
+ try {
91
+ await Order.addDish(order.id, args.dishId, args.amount, args.modifiers === undefined ? [] : args.modifiers, args.comment, 'user', args.replace, args.orderDishId);
92
+ }
93
+ catch (error) {
94
+ if (await Settings.get("PASS_ORDERS_ERRORS") === "TRUE") {
95
+ throw error;
96
+ }
97
+ else {
98
+ // TODO: need think about it, it not clean
99
+ order = await getNewCart(context);
100
+ }
101
+ }
102
+ await Order.countCart({ id: order.id });
103
+ let fullOrder = await Order.populate(order.id);
104
+ emitter.emit("http-api:before-response-order-add-dish", fullOrder);
105
+ return fullOrder;
106
+ },
107
+ },
108
+ orderReplaceDish: {
109
+ def: "orderReplaceDish(orderId: String!, orderDishId: Int!, amount: Int, modifiers: Json, comment: String, from: String): Order",
110
+ fn: async (parent, args, context) => {
111
+ let order;
112
+ if (args.orderId)
113
+ order = await Order.findOne({ id: args.orderId });
114
+ if (!order) {
115
+ sails.log.silly("GQL > orderReplaceDish resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
116
+ order = await getNewCart(context, args.orderId);
117
+ }
118
+ if (order.paid || order.state === "ORDER") {
119
+ order = await getNewCart();
120
+ }
121
+ try {
122
+ await Order.addDish(order.id, args.dishId, args.amount, args.modifiers === undefined ? [] : args.modifiers, args.comment, args.from, args.replace, args.orderDishId);
123
+ }
124
+ catch (error) {
125
+ if (await Settings.get("PASS_ORDERS_ERRORS") === "TRUE") {
126
+ throw error;
127
+ }
128
+ else {
129
+ // TODO: need think about it, it not clean
130
+ order = await getNewCart(context);
131
+ }
132
+ }
133
+ await Order.countCart({ id: order.id });
134
+ let fullOrder = await Order.populate(order.id);
135
+ emitter.emit("http-api:before-response-order-replace-dish", fullOrder);
136
+ return fullOrder;
137
+ },
138
+ },
139
+ orderRemoveDish: {
140
+ def: "orderRemoveDish(id: String!, orderDishId: Int!, amount: Int): Order",
141
+ fn: async function (parent, args, context) {
142
+ let order;
143
+ order = await Order.findOne({ id: args.id });
144
+ if (!order) {
145
+ sails.log.silly("GQL > orderRemoveDish resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
146
+ order = await getNewCart(context, args.orderId);
147
+ }
148
+ if (order.paid || order.state === "ORDER") {
149
+ order = await getNewCart();
150
+ }
151
+ const orderDish = await OrderDish.findOne({ id: args.orderDishId });
152
+ try {
153
+ await Order.removeDish(order.id, orderDish, args.amount, false);
154
+ }
155
+ catch (error) {
156
+ if (await Settings.get("PASS_ORDERS_ERRORS") === "TRUE") {
157
+ throw error;
158
+ }
159
+ else {
160
+ // TODO: need think about it, it not clean
161
+ order = await getNewCart(context);
162
+ }
163
+ }
164
+ await Order.countCart({ id: order.id });
165
+ let fullOrder = await Order.populate(order.id);
166
+ emitter.emit("http-api:before-response-order-remove-dish", fullOrder);
167
+ return fullOrder;
168
+ },
169
+ },
170
+ orderSetDishAmount: {
171
+ def: "orderSetDishAmount(id: String, orderDishId: Int, amount: Int): Order",
172
+ fn: async function (parent, args, context) {
173
+ let order;
174
+ order = await Order.findOne(args.id);
175
+ if (!order) {
176
+ sails.log.silly("GQL > orderSetDishAmount resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
177
+ order = await getNewCart(context, args.orderId);
178
+ }
179
+ if (order.paid || order.state === "ORDER") {
180
+ order = await getNewCart();
181
+ }
182
+ let dish = await OrderDish.findOne(args.orderDishId).populate("dish");
183
+ if (!dish) {
184
+ const error = `OrderDish with id ${args.orderDishId} not found`;
185
+ sails.log.error(error);
186
+ throw new Error(error);
187
+ }
188
+ if (!dish.dish) {
189
+ const error = `Dish in OrderDish with id ${args.orderDishId} not found`;
190
+ sails.log.error(error);
191
+ throw new Error(error);
192
+ }
193
+ try {
194
+ await Order.setCount(order.id, dish, args.amount);
195
+ }
196
+ catch (error) {
197
+ if (await Settings.get("PASS_ORDERS_ERRORS") === "TRUE") {
198
+ throw error;
199
+ }
200
+ else {
201
+ // TODO: need think about it, it not clean
202
+ order = await getNewCart(context);
203
+ }
204
+ }
205
+ await Order.countCart({ id: order.id });
206
+ let fullOrder = await Order.populate(order.id);
207
+ emitter.emit("http-api:before-response-order-set-dish-amount", fullOrder);
208
+ return fullOrder;
209
+ },
210
+ },
211
+ orderSetDishComment: {
212
+ def: "orderSetDishComment(id: String, orderDishId: Int, comment: String): Order",
213
+ fn: async function (parent, args, context) {
214
+ let order;
215
+ const data = args;
216
+ const orderId = data.orderId;
217
+ const comment = data.comment || "";
218
+ const dishId = data.dishId;
219
+ if (!dishId) {
220
+ const error = "dishId is required";
221
+ sails.log.error(error);
222
+ throw new Error(error);
223
+ }
224
+ order = await Order.findOne(orderId);
225
+ if (!order) {
226
+ sails.log.silly("GQL > orderSetDishComment resolver error: ", `order with id ${args.orderId} not found. Trying make new cart.`);
227
+ order = await getNewCart(context, args.orderId);
228
+ }
229
+ if (order.paid || order.state === "ORDER") {
230
+ order = await getNewCart();
231
+ }
232
+ const dish = await OrderDish.findOne({ id: dishId }).populate("dish");
233
+ if (!dish) {
234
+ const error = `Dish with id ${dishId} not found`;
235
+ sails.log.error(error);
236
+ throw new Error(error);
237
+ }
238
+ await order.setComment(dish, comment);
239
+ await Order.countCart({ id: order.id });
240
+ let fullOrder = await Order.populate(order.id);
241
+ emitter.emit("http-api:before-response-order-set-dish-comment", fullOrder);
242
+ return fullOrder;
243
+ },
244
+ },
245
+ orderUpdate: {
246
+ def: '"""Experimental! allowed only for trifleFrom """ orderUpdate(order: InputOrderUpdate): Order',
247
+ fn: async function (parent, args, context) {
248
+ let order = args.order;
249
+ if (!order.id)
250
+ throw "order.id field is required";
251
+ let _order = await Order.findOne(order.id);
252
+ if (['CART', 'CHECKOUT', 'PAYMENT'].includes(_order.state) !== true) {
253
+ throw `Order in state [${order.state}] update not allowed`;
254
+ }
255
+ let orderToCartState = false;
256
+ if (Object.keys(order).length === 1) {
257
+ throw `no passed updates`;
258
+ }
259
+ const orderUpd = {};
260
+ if (order.trifleFrom) {
261
+ orderUpd['trifleFrom'] = order.trifleFrom;
262
+ }
263
+ if (order.comment) {
264
+ orderUpd['comment'] = order.comment;
265
+ }
266
+ if (order.date) {
267
+ orderUpd['date'] = order.date;
268
+ orderToCartState = true;
269
+ }
270
+ if (order.isSelfService) {
271
+ orderUpd['isSelfService'] = order.isSelfService;
272
+ orderToCartState = true;
273
+ }
274
+ if (order.paymentMethodId) {
275
+ orderUpd['paymentMethodId'] = order.paymentMethodId;
276
+ orderToCartState = true;
277
+ }
278
+ if (order.promotionCodeString || order.promotionCodeString === "") {
279
+ await Order.applyPromotionCode({ id: order.id }, order.promotionCodeString);
280
+ delete order.promotionCodeString;
281
+ }
282
+ if (Object.keys(order).length > 1) {
283
+ await Order.update({ id: order.id }, orderUpd);
284
+ }
285
+ // TODO: Need move logic update in Order Model
286
+ if (orderToCartState) {
287
+ await Order.next("CART");
288
+ }
289
+ let fullOrder = await Order.populate(order.id);
290
+ emitter.emit("http-api:before-response-order-update", fullOrder);
291
+ return fullOrder;
292
+ },
293
+ },
294
+ orderClone: {
295
+ def: 'orderClone(orderId: String!): Order',
296
+ fn: async function (parent, args, context) {
297
+ let orderId = args.orderId;
298
+ let newcart = await Order.clone({ id: orderId });
299
+ let fullOrder = await Order.populate({ id: newcart.id });
300
+ emitter.emit("http-api:before-response-order-update", fullOrder);
301
+ return fullOrder;
302
+ },
303
+ },
304
+ orderPromocodeApply: {
305
+ def: 'orderPromocodeApply(orderId: String!, promocode: String!): Order',
306
+ fn: async function (parent, args, context) {
307
+ let orderId = args.orderId;
308
+ let promocode = args.promocode;
309
+ await Order.applyPromotionCode({ id: orderId }, promocode);
310
+ let fullOrder = await Order.populate({ id: orderId });
311
+ emitter.emit("http-api:before-response-order-update", fullOrder);
312
+ return fullOrder;
313
+ },
314
+ },
315
+ orderPromocodeReset: {
316
+ def: 'orderPromocodeReset(orderId: String!): Order',
317
+ fn: async function (parent, args, context) {
318
+ let orderId = args.orderId;
319
+ let promocode = null;
320
+ await Order.applyPromotionCode({ id: orderId }, promocode);
321
+ let fullOrder = await Order.populate({ id: orderId });
322
+ emitter.emit("http-api:before-response-order-update", fullOrder);
323
+ return fullOrder;
324
+ },
325
+ },
326
+ },
327
+ };
328
+ // Generate new cart
329
+ async function getNewCart(context, orderId) {
330
+ if (!context.connectionParams.deviceId) {
331
+ throw `Missed deviceId`;
332
+ }
333
+ let userId = null;
334
+ if (context && context.connectionParams.authorization) {
335
+ userId = (await jwt_1.JWTAuth.verify(context.connectionParams.authorization)).userId;
336
+ }
337
+ let order;
338
+ let initOrder = {};
339
+ // Pass oredrId from frontend
340
+ if (orderId)
341
+ initOrder["id"] = orderId;
342
+ if (userId)
343
+ initOrder["user"] = userId;
344
+ initOrder.deviceId = context.connectionParams.deviceId;
345
+ emitter.emit("http-api:init-newcart", initOrder);
346
+ order = await Order.create(initOrder).fetch();
347
+ await emitter.emit("http-api:create-newcart", order);
348
+ return order;
349
+ }