@webresto/graphql 1.3.7 → 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
  };