@webresto/graphql 1.3.6 → 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 -73
  29. package/lib/graphqlHelper.ts +329 -186
  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 +43 -14
  47. package/src/resolvers/checkout.js +172 -122
  48. package/src/resolvers/checkout.ts +218 -142
  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 -277
  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
@@ -2,56 +2,119 @@ const DataLoader = require('dataloader');
2
2
 
3
3
  export const additionalResolver = {
4
4
  GroupModifier: {
5
- group: async (parent, args, context, info) => {
6
- if (!parent.modifierId) return;
5
+ modifierId: async (parent: { modifierId?: string; id?: string /** here id means rmsID */}, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
6
+ if (parent.modifierId) return parent.modifierId;
7
+
7
8
  if (!context.dataloaders) context.dataloaders = new WeakMap();
8
9
  const dataloaders = context.dataloaders;
9
10
 
10
11
  let dl = dataloaders.get(info.fieldNodes);
11
12
  if (!dl) {
12
- dl = new DataLoader(async (ids: any) => {
13
- const rows = await Group.find({id: ids});
14
- const sortedInIdsOrder = ids.map(id => rows.find(x => x.id === id));
13
+ dl = new DataLoader(async (id: any) => {
14
+ const rows = await Group.find({
15
+ rmsId: id, isDeleted: false
16
+ });
17
+ const sortedInIdsOrder = id.map((id: string) => rows.find(x => {
18
+ return x.rmsId === id
19
+ }));
15
20
  return sortedInIdsOrder;
16
21
  });
17
22
  dataloaders.set(info.fieldNodes, dl);
18
23
  }
19
- return dl.load(parent.modifierId);
24
+ return (await dl.load(parent.id)).id;
20
25
  },
26
+ group: async (parent: { modifierId?: string; id?: string /** here id means rmsID */ }, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
27
+ if (!parent.modifierId && !parent.id) return;
28
+ if (!context.dataloaders) context.dataloaders = new WeakMap();
29
+ const dataloaders = context.dataloaders;
30
+
31
+ let dl = dataloaders.get(info.fieldNodes);
32
+ if (!dl) {
33
+ dl = new DataLoader(async (ids: any) => {
34
+ const rows = await Group.find({
35
+ where: {
36
+ or: [{id: ids, isDeleted: false}, {rmsId: ids, isDeleted: false}] }
37
+ }
38
+ );
39
+ const sortedInIdsOrder = ids.map((id: string) => rows.find(x => x.id === id));
40
+ return sortedInIdsOrder;
41
+ });
42
+ dataloaders.set(info.fieldNodes, dl);
43
+ }
44
+ return await dl.load(parent.modifierId ? parent.modifierId : parent.id);
45
+ }
21
46
  },
22
47
  Modifier: {
23
- dish: async (parent, args, context, info) => {
24
- if (!parent.modifierId) return;
48
+ modifierId: async (parent: { modifierId?: string; id?: string /** here id means rmsID */}, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
49
+ if (parent.modifierId) return parent.modifierId;
50
+
25
51
  if (!context.dataloaders) context.dataloaders = new WeakMap();
26
52
  const dataloaders = context.dataloaders;
27
53
 
28
54
  let dl = dataloaders.get(info.fieldNodes);
29
55
  if (!dl) {
30
- dl = new DataLoader(async (ids: any) => {
31
- const rows = await Dish.find({id: ids, balance: { "!=": 0 }, isDeleted: false});
32
- const sortedInIdsOrder = ids.map(id => rows.find(x => x.id === id));
56
+ dl = new DataLoader(async (id: any) => {
57
+ const rows = await Dish.find({
58
+ rmsId: id, balance: { "!=": 0 }, isDeleted: false
59
+ });
60
+ const sortedInIdsOrder = id.map((id: string) => rows.find(x => {
61
+ return x.rmsId === id
62
+ }));
63
+ return sortedInIdsOrder;
64
+ });
65
+ dataloaders.set(info.fieldNodes, dl);
66
+ }
67
+ return (await dl.load(parent.id)).id;
68
+ },
69
+ dish: async (parent: { modifierId?: string; id?: string /** here id means rmsID */}, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
70
+ if (!parent.modifierId && !parent.id) return;
71
+ if (!context.dataloaders) context.dataloaders = new WeakMap();
72
+ const dataloaders = context.dataloaders;
73
+
74
+ let dl = dataloaders.get(info.fieldNodes);
75
+ if (!dl) {
76
+ dl = new DataLoader(async (id: any) => {
77
+ const rows = await Dish.find({ where:
78
+ {or: [
79
+ {id: id, balance: { "!=": 0 }, isDeleted: false},
80
+ {rmsId: id, balance: { "!=": 0 }, isDeleted: false}
81
+ ]}
82
+ });
83
+ const sortedInIdsOrder = id.map((id: string) => rows.find(x => {
84
+ return x.id === id ? x.id === id : x.rmsId === id ? x.rmsId === id : false
85
+ }));
33
86
  return sortedInIdsOrder;
34
87
  });
35
- // ложим инстанс дата-лоадера в WeakMap для повторного использования
36
88
  dataloaders.set(info.fieldNodes, dl);
37
89
  }
38
- // юзаем метод `load` из нашего дата-лоадера
39
- return dl.load(parent.modifierId);
40
- // return await Dish.findOne({id: parent.modifierId}).populateAll();
90
+ return await dl.load(parent.modifierId ? parent.modifierId : parent.id);
41
91
  }
42
92
  },
43
93
 
44
94
  OrderModifier: {
45
- dish: async (parent, args, context, info) => {
46
- return (await Dish.find({id: parent.id, balance: { "!=": 0 }, isDeleted: false}).populateAll())[0];
95
+ dish: async (parent: { id: string; modifierId: string}, args: any, context: any, info: any) => {
96
+ if (!parent.id && !parent.modifierId) return null
97
+ return (await Dish.find({ where:
98
+ {or: [
99
+ {id: parent.id, balance: { "!=": 0 }, isDeleted: false},
100
+ {rmsId: parent.id, balance: { "!=": 0 }, isDeleted: false}
101
+ ]}
102
+ // @ts-ignore //TODO: Deprecated populateAll
103
+ }).populateAll())[0];
47
104
  },
48
- group: async (parent, args) => {
49
- return (await Group.find({id: parent.groupId, isDeleted: false}).populateAll())[0];
105
+ group: async (parent: { id: string, groupId: string; }, args: any) => {
106
+ if (!parent.id && !parent.groupId) return null
107
+ return (await Group.find(
108
+ {where: {
109
+ or: [{id: parent.groupId, isDeleted: false}, {rmsId: parent.id, isDeleted: false}] }
110
+ }
111
+ // @ts-ignore //TODO: Deprecated populateAll
112
+ ).populateAll())[0];
50
113
  }
51
114
  },
52
115
 
53
116
  Dish: {
54
- parentGroup: async (parent, args, context, info) => {
117
+ parentGroup: async (parent: { parentGroup: any; }, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
55
118
  if (!parent.parentGroup) return;
56
119
  if (!context.dataloaders) context.dataloaders = new WeakMap();
57
120
  const dataloaders = context.dataloaders;
@@ -63,14 +126,22 @@ export const additionalResolver = {
63
126
 
64
127
  let dl = dataloaders.get(info.fieldNodes);
65
128
  if (!dl) {
66
- dl = new DataLoader(async (id: any) => {
67
- return await Group.find(id);
129
+ dl = new DataLoader(async (ids: any) => {
130
+ // Waterline can return data not by ids array sorting
131
+ return (await Group.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
68
132
  });
69
133
  dataloaders.set(info.fieldNodes, dl);
70
134
  }
71
135
  return await dl.load(parent.parentGroup);
72
136
  },
73
- images: async (parent, args, context, info) => {
137
+ images: async (parent: { id: any; }, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
138
+
139
+ const sortImages = (images) => {
140
+ return images.sort((a, b) => {
141
+ return (+new Date(b.uploadDate) - +new Date(a.uploadDate));
142
+ });
143
+ };
144
+
74
145
  if (!parent.id) return;
75
146
  if (!context.dataloaders) context.dataloaders = new WeakMap();
76
147
  const dataloaders = context.dataloaders;
@@ -79,16 +150,16 @@ export const additionalResolver = {
79
150
  if (!dl) {
80
151
  dl = new DataLoader(async (ids: any) => {
81
152
  const rows = await Dish.find({id: ids}).populate('images');
82
- const images = ids.map(id => rows.find(x => x.id === id)?.images);
153
+ const images = ids.map((id: string) => rows.find(x => x.id === id)?.images);
83
154
  return images;
84
155
  });
85
156
  dataloaders.set(info.fieldNodes, dl);
86
157
  }
87
- return await dl.load(parent.id);
158
+ return sortImages(await dl.load(parent.id));
88
159
  }
89
160
  },
90
161
  Group: {
91
- parentGroup: async (parent, args, context, info) => {
162
+ parentGroup: async (parent: { parentGroup: any; }, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
92
163
  if (!parent.parentGroup) return;
93
164
  if (!context.dataloaders) context.dataloaders = new WeakMap();
94
165
  const dataloaders = context.dataloaders;
@@ -100,8 +171,8 @@ export const additionalResolver = {
100
171
 
101
172
  let dl = dataloaders.get(info.fieldNodes);
102
173
  if (!dl) {
103
- dl = new DataLoader(async (id: any) => {
104
- return await Group.find(id);
174
+ dl = new DataLoader(async (ids: any) => {
175
+ return (await Group.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
105
176
  });
106
177
  dataloaders.set(info.fieldNodes, dl);
107
178
  }
@@ -109,18 +180,17 @@ export const additionalResolver = {
109
180
  }
110
181
  },
111
182
  Order: {
112
- dishes: async (parent, args, context, info) => {
183
+ dishes: async (parent: { dishes: any; id: any; }, args: any, context: any, info: any) => {
113
184
  if (typeof parent.dishes === "object") {
114
185
  return parent.dishes;
115
186
  }
116
187
 
117
188
  return await OrderDish.find({order: parent.id});
118
-
119
189
  },
120
190
 
121
191
  },
122
192
  OrderDish: {
123
- dish: async (parent, args, context, info) => {
193
+ dish: async (parent: { dish: any; }, args: any, context: { dataloaders: WeakMap<object, any>; }, info: { fieldNodes: any; }) => {
124
194
 
125
195
  if (!parent.dish) return;
126
196
  if (!context.dataloaders) context.dataloaders = new WeakMap();
@@ -132,13 +202,14 @@ export const additionalResolver = {
132
202
 
133
203
  let dl = dataloaders.get(info.fieldNodes);
134
204
  if (!dl) {
135
- dl = new DataLoader(async (dishId: string) => {
136
- return await Dish.find({id: dishId}).sort('id ASC');
205
+ dl = new DataLoader(async (ids: any) => {
206
+ return (await Dish.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
137
207
  });
138
208
  dataloaders.set(info.fieldNodes, dl);
139
209
  }
140
210
  return await dl.load(parent.dish);
141
211
  },
142
212
 
143
- },
213
+ }
144
214
  }
215
+
package/src/graphql.d.ts CHANGED
@@ -1,7 +1,9 @@
1
+ import { ApolloServer } from "apollo-server-express";
2
+ import { PubSub } from "apollo-server";
1
3
  declare const _default: {
2
- getPubsub: () => any;
3
- getServer: () => any;
4
+ getPubsub: () => PubSub;
5
+ getServer: () => ApolloServer;
4
6
  addAdditionalResolver: (resolver: any) => void;
5
- init: () => Promise<any>;
7
+ init: () => Promise<ApolloServer>;
6
8
  };
7
9
  export default _default;
package/src/graphql.js CHANGED
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const helper = require("../lib/graphqlHelper");
4
- const getEmitter_1 = require("@webresto/core/libs/getEmitter");
5
4
  const _ = require("lodash");
6
5
  const additionalResolvers_1 = require("./additionalResolvers");
7
- const { ApolloServer } = require('apollo-server-express');
8
- const fs = require('fs');
9
- const path = require('path');
10
- const { PubSub } = require('apollo-server');
11
- const pubsub = new PubSub();
6
+ const langParser = require("accept-language-parser");
7
+ const apollo_server_express_1 = require("apollo-server-express");
8
+ const fs = require("fs");
9
+ const path = require("path");
10
+ var i18nFactory = require('i18n-2');
11
+ const apollo_server_1 = require("apollo-server");
12
+ const pubsub = new apollo_server_1.PubSub();
12
13
  sails.graphql = { pubsub };
13
14
  let server;
14
15
  const AdditionalResolvers = {};
@@ -19,8 +20,7 @@ exports.default = {
19
20
  _.merge(AdditionalResolvers, resolver);
20
21
  },
21
22
  init: async function () {
22
- var _a, _b;
23
- let resolversApiPath = path.resolve(__dirname, './resolvers');
23
+ let resolversApiPath = path.resolve(__dirname, "./resolvers");
24
24
  if (fs.existsSync(resolversApiPath)) {
25
25
  helper.addDirResolvers(resolversApiPath);
26
26
  }
@@ -29,20 +29,19 @@ exports.default = {
29
29
  helper.addDirResolvers(resolversApiPath);
30
30
  }
31
31
  helper.addAllSailsModels();
32
- if ((_a = sails.config.restographql) === null || _a === void 0 ? void 0 : _a.whiteListAutoGen)
32
+ if (sails.config.restographql?.whiteListAutoGen)
33
33
  helper.setWhiteList(sails.config.restographql.whiteListAutoGen);
34
- if ((_b = sails.config.restographql) === null || _b === void 0 ? void 0 : _b.blackList)
34
+ if (sails.config.restographql?.blackList)
35
35
  helper.addToBlackList(sails.config.restographql.blackList);
36
36
  // console.dir(autoGenerate, {depth: null});
37
37
  _.merge(AdditionalResolvers, additionalResolvers_1.additionalResolver);
38
38
  helper.addType(`
39
-
40
39
  input Customer {
41
- phone: Phone
40
+ phone: InputPhone
42
41
  mail: String
43
42
  name: String!
44
43
  }
45
- input Phone {
44
+ input InputPhone {
46
45
  code: String!
47
46
  number: String!
48
47
  additionalNumber: String
@@ -61,11 +60,13 @@ exports.default = {
61
60
  doorphone: String
62
61
  }
63
62
  type Message {
63
+ id: String
64
64
  title: String
65
65
  type: String
66
66
  message: String
67
67
  }
68
68
  type Action {
69
+ id: String
69
70
  type: String
70
71
  data: Json
71
72
  }
@@ -74,16 +75,63 @@ exports.default = {
74
75
  message: Message
75
76
  action: Action
76
77
  }
78
+ type Response {
79
+ message: Message
80
+ action: Action
81
+ }
77
82
  type GetOrderResponse {
78
83
  order: Order
79
84
  customData: Json
80
85
  }
81
- type Restrictions {
82
- workTime: Json
83
- periodPossibleForOrder: Json
84
- timezone: Json
85
- deliveryDescription: Json
86
- minDeliveryTime: Json
86
+
87
+ type UserCustomField {
88
+ id: String
89
+ type: String
90
+ label: String
91
+ enum: [String]
92
+ description: String
93
+ required: Boolean
94
+ regex: String
95
+ }
96
+
97
+
98
+ type Phone {
99
+ code: String
100
+ number: String
101
+ additionalNumber: String
102
+ }
103
+ type CaptchaJob {
104
+ id: String
105
+ task: String
106
+ }
107
+ type PromotionState {
108
+ type: String
109
+ message: String
110
+ state: Json
111
+ }
112
+
113
+ """Solved captcha"""
114
+ input Captcha {
115
+ "Captcha job ID"
116
+ id: String!
117
+ "Resolved captcha"
118
+ solution: String!
119
+ }
120
+
121
+ """Country"""
122
+ type Country {
123
+ phoneCode: String
124
+ iso: String
125
+ name: String
126
+ nativeCountryName: String
127
+ language: [String]
128
+ currency: String
129
+ currencySymbol: String
130
+ currencyISO: String
131
+ currencyUnit: String
132
+ currencyDenomination: Int
133
+ phoneMask: [String]
134
+ flag: String
87
135
  }
88
136
  `);
89
137
  // helper.addToBlackList(["createdAt", "updatedAt"]);
@@ -99,59 +147,144 @@ exports.default = {
99
147
  _root: String
100
148
  }`);
101
149
  /**
102
- * Discount fields global support
103
- */
150
+ * Discount fields global support
151
+ */
104
152
  helper.addCustomField("Dish", "discountAmount: Float");
105
153
  helper.addCustomField("Dish", "discountType: String");
154
+ /**
155
+ * @deprecated ???
156
+ */
106
157
  helper.addCustomField("Dish", "oldPrice: Float");
158
+ helper.addCustomField("Dish", "salePrice: Float");
107
159
  helper.addCustomField("Group", "discount: String");
160
+ /**
161
+ * Types of complex order fields
162
+ */
163
+ helper.addType(`#graphql
164
+ type OrderDeliveryState {
165
+ "Time it will take for delivery"
166
+ deliveryTimeMinutes: Int
167
+ "If disabled, then delivery is not allowed and will be processed"
168
+ allowed: Boolean
169
+ "Cost of delivery"
170
+ cost: Float
171
+ "ID of the service that will be on the delivery receipt"
172
+ item: String
173
+ "Server message for current delivery"
174
+ message: String
175
+ }`);
176
+ helper.addToReplaceList("Order.delivery", "delivery: OrderDeliveryState");
108
177
  const { typeDefs, resolvers } = helper.getSchema();
109
- getEmitter_1.default().on('core-order-after-count', 'graphql', function (order) {
178
+ emitter.on("core-order-after-count", "graphql", function (order) {
110
179
  pubsub.publish("order-changed", order);
111
180
  });
112
- getEmitter_1.default().on("send-message", "graphql", function ({ orderId, message }) {
181
+ emitter.on("send-message", "graphql", function ({ orderId, message }) {
113
182
  pubsub.publish("message", { orderId, message });
114
183
  });
115
- getEmitter_1.default().on("core-dish-after-update", "graphql", function (record) {
184
+ emitter.on("core-dish-after-update", "graphql", function (record) {
116
185
  pubsub.publish("dish-changed", record);
117
186
  });
118
- getEmitter_1.default().on("core-maintenance-enabled", "graphql", function (record) {
187
+ emitter.on("core-maintenance-enabled", "graphql", function (record) {
119
188
  pubsub.publish("maintenance", record);
120
189
  });
121
- getEmitter_1.default().on("core-maintenance-disabled", "graphql", function () {
190
+ emitter.on("core-maintenance-disabled", "graphql", function () {
122
191
  pubsub.publish("maintenance", null);
123
192
  });
124
193
  let apolloServer;
125
194
  try {
126
- apolloServer = new ApolloServer({
195
+ apolloServer = new apollo_server_express_1.ApolloServer({
127
196
  typeDefs,
197
+ introspection: true,
198
+ playground: true,
128
199
  resolvers: [resolvers, AdditionalResolvers],
129
200
  subscriptions: {
130
201
  onConnect: (connectionParams, webSocket) => {
131
202
  let exContext = {};
132
203
  if (connectionParams) {
133
- if (!connectionParams['authorization'] && connectionParams['Authorization'])
134
- connectionParams['authorization'] = connectionParams['Authorization'];
135
- exContext['connectionParams'] = connectionParams;
204
+ /**
205
+ * Authorization
206
+ */
207
+ if (!connectionParams["authorization"] && connectionParams["Authorization"]) {
208
+ connectionParams["authorization"] = connectionParams["Authorization"];
209
+ }
210
+ if (connectionParams["x-device-id"] || connectionParams["X-Device-Id"]) {
211
+ connectionParams["deviceId"] = connectionParams["x-device-id"] ? connectionParams["x-device-id"] : connectionParams["X-Device-Id"];
212
+ }
213
+ exContext["connectionParams"] = connectionParams;
214
+ /**
215
+ * Accept-Language
216
+ */
217
+ connectionParams["locale"] = sails.config.i18n.defaultLocale;
218
+ const acceptLanguge = connectionParams["Accept-Language"] ?? connectionParams["accept-language"] ?? false;
219
+ if (acceptLanguge) {
220
+ connectionParams["locale"] = langParser.parse(acceptLanguge)[0]?.code ?? sails.config.i18n.defaultLocale;
221
+ }
222
+ const i18n = new i18nFactory({ ...sails.config.i18n, directory: sails.config.i18n.localesDirectory, extension: ".json" });
223
+ i18n.setLocale(connectionParams["locale"]);
224
+ exContext["i18n"] = i18n;
136
225
  }
137
- exContext['pubsub'] = pubsub;
226
+ exContext["pubsub"] = pubsub;
138
227
  return exContext;
139
228
  },
140
229
  },
141
- context: async ({ req, connection }) => {
142
- if (connection) {
230
+ formatError: (error) => {
231
+ const graphQLFormattedError = {
232
+ message: `${error.path}: ${error.message}`,
233
+ ...process.env.NODE_ENV !== "production" && {
234
+ locations: error.extensions.exception.stacktrace,
235
+ path: error.path
236
+ },
237
+ };
238
+ return graphQLFormattedError;
239
+ },
240
+ context: ({ req, connection }) => {
241
+ if (connection && connection.context) {
143
242
  return connection.context;
144
243
  }
145
244
  else {
146
- return { ...req };
245
+ const headers = {};
246
+ if (req?.rawHeaders) {
247
+ for (let i = 0; i < req.rawHeaders.length; i += 2) {
248
+ const name = req.rawHeaders[i];
249
+ const value = req.rawHeaders[i + 1];
250
+ headers[name.toLowerCase()] = value;
251
+ }
252
+ }
253
+ if (headers["x-device-id"] || headers["X-Device-Id"]) {
254
+ headers["deviceId"] = headers["x-device-id"] ? headers["x-device-id"] : headers["X-Device-Id"];
255
+ }
256
+ if (!headers["authorization"] && headers["Authorization"]) {
257
+ headers["authorization"] = headers["Authorization"];
258
+ }
259
+ // set context locale
260
+ headers["locale"] = sails.config.i18n.defaultLocale;
261
+ const acceptLanguge = headers["Accept-Language"] ?? headers["accept-language"] ?? false;
262
+ if (acceptLanguge) {
263
+ headers["locale"] = (langParser.parse(acceptLanguge))[0]?.code ?? sails.config.i18n.defaultLocale;
264
+ }
265
+ const i18n = new i18nFactory({ ...sails.config.i18n, directory: sails.config.i18n.localesDirectory, extension: ".json" });
266
+ i18n.setLocale(headers["locale"]);
267
+ return { ...req, connectionParams: headers, i18n: i18n };
147
268
  }
148
- }
269
+ },
149
270
  });
150
271
  }
151
272
  catch (error) {
152
- console.error("GraphQL start error: ", error);
273
+ if (error.locations && error.locations[0].line) {
274
+ typeDefs.split("\n").forEach((item, i) => {
275
+ if (Math.abs(error.locations[0].line - i) < 10) {
276
+ console.log(i, `|`, item);
277
+ if (error.locations[0].line - 1 === i) {
278
+ console.log("_______________");
279
+ }
280
+ }
281
+ });
282
+ console.log(`ERROR LINE: ${error.locations[0].line} `, typeDefs.split("\n", -1)[error.locations[0].line - 1]);
283
+ }
284
+ console.error(JSON.stringify(error));
285
+ throw error;
153
286
  }
154
287
  server = apolloServer;
155
288
  return apolloServer;
156
- }
289
+ },
157
290
  };