@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,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const graphqlHelper_1 = require("../../lib/graphqlHelper");
4
+ graphqlHelper_1.default.addType(`#graphql
5
+ type Telemetry {
6
+ "System uptime in seconds"
7
+ uptime: Float
8
+ i18n: String
9
+ locale: String
10
+ }
11
+ `);
12
+ exports.default = {
13
+ Query: {
14
+ telemetry: {
15
+ def: 'telemetry: Telemetry',
16
+ fn: () => ({})
17
+ }
18
+ },
19
+ Telemetry: {
20
+ uptime: () => process.uptime(),
21
+ //@ts-ignore
22
+ i18n: (parent, args, context, info) => context.i18n.__('Status here'),
23
+ locale: (parent, args, context, info) => context.connectionParams.locale
24
+ }
25
+ };
@@ -0,0 +1,24 @@
1
+ import graphqlHelper from "../../lib/graphqlHelper";
2
+ graphqlHelper.addType(`#graphql
3
+ type Telemetry {
4
+ "System uptime in seconds"
5
+ uptime: Float
6
+ i18n: String
7
+ locale: String
8
+ }
9
+ `);
10
+
11
+ export default {
12
+ Query: {
13
+ telemetry: {
14
+ def: 'telemetry: Telemetry',
15
+ fn: () => ({})
16
+ }
17
+ },
18
+ Telemetry: {
19
+ uptime: () => process.uptime(),
20
+ //@ts-ignore
21
+ i18n: (parent, args, context, info) => context.i18n.__('Status here'),
22
+ locale: (parent, args, context, info) => context.connectionParams.locale
23
+ }
24
+ }
@@ -0,0 +1,82 @@
1
+ import { Phone } from "@webresto/core/models/User";
2
+ import User from "@webresto/core/models/User";
3
+ import { ResolvedCaptcha } from "@webresto/core/adapters/captcha/CaptchaAdapter";
4
+ import { Response } from "../../types/primitives";
5
+ interface UserResponse extends Response {
6
+ user: User | undefined;
7
+ }
8
+ interface InputUser {
9
+ firstName: string;
10
+ lastName: string;
11
+ birthday: string;
12
+ customData: {
13
+ [key: string]: string | boolean | number;
14
+ };
15
+ customFields: {
16
+ [key: string]: string | boolean | number;
17
+ };
18
+ }
19
+ type RegistrationPayload = {
20
+ login: string;
21
+ phone: Phone;
22
+ password: string;
23
+ otp: string;
24
+ firstName: string;
25
+ lastName: string;
26
+ customFields: {
27
+ [key: string]: string | boolean | number;
28
+ };
29
+ captcha: ResolvedCaptcha;
30
+ };
31
+ declare const _default: {
32
+ Mutation: {
33
+ login: {
34
+ def: string;
35
+ fn: (parent: any, payload: any, context: any, info: any) => Promise<UserResponse>;
36
+ };
37
+ restorePassword: {
38
+ def: string;
39
+ fn: (parent: any, payload: any, context: any) => Promise<UserResponse>;
40
+ };
41
+ registration: {
42
+ def: string;
43
+ fn: (parent: any, payload: RegistrationPayload, context: any, info: any) => Promise<UserResponse>;
44
+ };
45
+ logout: {
46
+ def: string;
47
+ fn: (parent: any, payload: {
48
+ deviceId: any;
49
+ }, context: {
50
+ connectionParams: {
51
+ authorization: string;
52
+ };
53
+ i18n: any;
54
+ }) => Promise<Response>;
55
+ };
56
+ logoutFromAllDevices: {
57
+ def: string;
58
+ fn: (parent: any, payload: any, context: any) => Promise<Response>;
59
+ };
60
+ favoriteDish: {
61
+ def: string;
62
+ fn: (parent: any, payload: {
63
+ dishId: string;
64
+ }, context: {
65
+ connectionParams: {
66
+ authorization: string;
67
+ };
68
+ }) => Promise<boolean>;
69
+ };
70
+ userUpdate: {
71
+ def: string;
72
+ fn: (parent: any, payload: {
73
+ user: InputUser;
74
+ }, context: any) => Promise<UserResponse>;
75
+ };
76
+ userDelete: {
77
+ def: string;
78
+ fn: (parent: any, payload: any, context: any, info: any) => Promise<Response>;
79
+ };
80
+ };
81
+ };
82
+ export default _default;
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // const userAuth = sails.config.restographql.authService;
4
+ const jwt_1 = require("../../lib/jwt");
5
+ const adapters_1 = require("@webresto/core/adapters");
6
+ let captchaAdapter = adapters_1.Captcha.getAdapter();
7
+ const graphqlHelper_1 = require("../../lib/graphqlHelper");
8
+ graphqlHelper_1.default.addType(`#graphql
9
+ type UserResponse {
10
+ user: User
11
+ message: Message
12
+ action: Action
13
+ }
14
+
15
+ input InputUser {
16
+ firstName: String
17
+ lastName: String
18
+ birthday: String
19
+ customData: Json
20
+ customFields: Json
21
+ }
22
+ `);
23
+ exports.default = {
24
+ Mutation: {
25
+ login: {
26
+ def: `#graphql
27
+ """ login method """
28
+ login(
29
+ login: String!,
30
+
31
+ "(required when login field is phone)"
32
+ phone: InputPhone,
33
+
34
+ "(only when passwordPolicy is required )"
35
+ password: String,
36
+
37
+ "(from otpRequest)"
38
+ otp: String,
39
+
40
+ "(solved captcha for label 'quickAccessByOTP:%login%')"
41
+ captcha: Captcha!
42
+ ): UserResponse`,
43
+ fn: async (parent, payload, context, info) => {
44
+ // TODO: this is copied from restrictions need make it from one place
45
+ if (!(await captchaAdapter).check(payload.captcha, `login:${payload.login}`))
46
+ throw `bad captcha`;
47
+ // Define password policy
48
+ let passwordPolicy = (await Settings.get("PASSWORD_POLICY"));
49
+ if (!passwordPolicy)
50
+ passwordPolicy = "from_otp";
51
+ let loginOTPRequired = await Settings.get("LOGIN_OTP_REQUIRED");
52
+ if (!loginOTPRequired)
53
+ loginOTPRequired = false;
54
+ let loginField = await Settings.get("LOGIN_FIELD");
55
+ if (!loginField)
56
+ loginField = "phone";
57
+ if (passwordPolicy === "required" && !payload.password) {
58
+ throw `password is required`;
59
+ }
60
+ if (loginOTPRequired && !payload.otp) {
61
+ throw `OTP is required`;
62
+ }
63
+ // It shoul have or Password or OTP at one time
64
+ if (!payload.otp && !payload.password) {
65
+ throw `or Password or OTP required`;
66
+ }
67
+ if (!context.connectionParams.deviceId) {
68
+ throw `Missed deviceId`;
69
+ }
70
+ // Check phone TODO: move in User
71
+ if ((await Settings.get("LOGIN_FIELD")) === undefined ||
72
+ (await Settings.get("LOGIN_FIELD")) === "phone") {
73
+ if (!payload.phone) {
74
+ throw `Phone is required, when login field is phone`;
75
+ }
76
+ else {
77
+ let genLogin = (payload.phone.code +
78
+ payload.phone.number +
79
+ payload.phone.additionalNumber).replace(/\D/g, "");
80
+ if (genLogin !== payload.login) {
81
+ throw `Login is: js (payload.phone.code+payload.phone.number+payload.phone.additionalNumber).replace(/\D/g, '')`;
82
+ }
83
+ }
84
+ }
85
+ let userDevice = await User.login(payload.login, payload.phone, context.connectionParams.deviceId, "DEVICE NAME", payload.password, payload.otp, context.connectionParams["user-agent"], "IP_");
86
+ let authData = {
87
+ userId: userDevice.user,
88
+ deviceId: userDevice.id,
89
+ sessionId: userDevice.sessionId,
90
+ };
91
+ const JWTtoken = await jwt_1.JWTAuth.sign(authData);
92
+ let message = {
93
+ deviceId: context.connectionParams.deviceId,
94
+ title: context.i18n.__("Success"),
95
+ type: "info",
96
+ message: context.i18n.__("Authorization"),
97
+ };
98
+ let user = await User.findOne({ id: userDevice.user });
99
+ context.connectionParams.authorization = JWTtoken;
100
+ let action = {
101
+ deviceId: context.connectionParams.deviceId,
102
+ type: "Authorization",
103
+ data: {
104
+ token: JWTtoken,
105
+ },
106
+ };
107
+ // Here should be Emmiter for midificate Action And Message
108
+ return {
109
+ user: user,
110
+ message: message,
111
+ action: action,
112
+ };
113
+ },
114
+ },
115
+ restorePassword: {
116
+ def: `#graphql
117
+ """ Password restore method """
118
+ restorePassword(
119
+ login: String!,
120
+
121
+ "(required when login field is phone)"
122
+ phone: InputPhone,
123
+
124
+ password: String!,
125
+
126
+ "(from otpRequest)"
127
+ otp: String!,
128
+
129
+ "(solved captcha for label 'quickAccessByOTP:%login%')"
130
+ captcha: Captcha!
131
+ ): UserResponse`,
132
+ fn: async (parent, payload, context) => {
133
+ if (!context.connectionParams.deviceId) {
134
+ throw `Missed deviceId`;
135
+ }
136
+ // Check password policy
137
+ let passwordPolicy = (await Settings.get("PASSWORD_POLICY"));
138
+ if (!passwordPolicy)
139
+ passwordPolicy = "from_otp";
140
+ // It shoul have or Password or OTP at one time
141
+ if (!payload.otp || !payload.password) {
142
+ throw `Password and OTP required`;
143
+ }
144
+ let userDevice;
145
+ let user = await User.findOne({ login: payload.login });
146
+ if (user && user.verified) {
147
+ userDevice = await User.login(payload.login, payload.phone, context.connectionParams.deviceId, "DEVICE NAME", null, payload.otp, context.connectionParams["user-agent"], "0.0.0.0");
148
+ await User.setPassword(user.id, payload.password, null, true, null);
149
+ }
150
+ else {
151
+ return {
152
+ user: null,
153
+ message: {
154
+ deviceId: context.connectionParams.deviceId,
155
+ title: context.i18n.__("User not found"),
156
+ type: "error",
157
+ message: context.i18n.__("Check login please"),
158
+ },
159
+ action: null,
160
+ };
161
+ }
162
+ let authData = {
163
+ userId: userDevice.user,
164
+ deviceId: userDevice.id,
165
+ sessionId: userDevice.sessionId,
166
+ };
167
+ const JWTtoken = await jwt_1.JWTAuth.sign(authData);
168
+ let message = {
169
+ deviceId: context.connectionParams.deviceId,
170
+ title: context.i18n.__("Success"),
171
+ type: "info",
172
+ message: context.i18n.__("Password was cahanged"),
173
+ };
174
+ let action = {
175
+ deviceId: context.connectionParams.deviceId,
176
+ type: "Authorization",
177
+ data: {
178
+ token: JWTtoken,
179
+ },
180
+ };
181
+ // Here should be Emmiter for midificate Action And Message
182
+ return {
183
+ user: user,
184
+ message: message,
185
+ action: action,
186
+ };
187
+ },
188
+ },
189
+ registration: {
190
+ def: `#graphql
191
+ registration(
192
+
193
+ "loginField from UserRestrictions, When (UserRestrictions.loginField=phone) you must send concatenate [otp+number] (only digits)"
194
+ login: String!,
195
+
196
+ "required when loginField=phone, it will checks with login field"
197
+ phone: InputPhone
198
+
199
+ password: String,
200
+
201
+ "otp from otpRequest"
202
+ otp: String!
203
+
204
+ firstName: String,
205
+ lastName: String,
206
+
207
+ "Is object {} with all required fields from UserRestrictions.customFields. Is required if custom required fields was defined"
208
+ customFields: Json,
209
+
210
+ "Solved captcha for label 'registration:%login%'"
211
+ captcha: Captcha!
212
+ ): UserResponse`,
213
+ fn: async (parent, payload, context, info) => {
214
+ if (!context.connectionParams.deviceId) {
215
+ throw `Missed deviceId`;
216
+ }
217
+ try {
218
+ if (!(await captchaAdapter).check(payload.captcha, `registration:${payload.login}`))
219
+ throw `bad captcha`;
220
+ if (!payload.password && !payload.otp) {
221
+ throw `(password || otp) is required`;
222
+ }
223
+ // Define password policy
224
+ let passwordPolicy = (await Settings.get("PASSWORD_POLICY"));
225
+ if (!passwordPolicy)
226
+ passwordPolicy = "from_otp";
227
+ if ((await Settings.get("FIRSTNAME_REQUIRED")) &&
228
+ !payload.firstName) {
229
+ throw `firstName is required`;
230
+ }
231
+ if (passwordPolicy === "required" && !payload.password) {
232
+ throw `password is required`;
233
+ }
234
+ else if (passwordPolicy === "disabled" &&
235
+ payload.password) {
236
+ throw `Found password but passwordPolicy is: disabled`;
237
+ }
238
+ if ((await Settings.get("LOGIN_FIELD")) === undefined ||
239
+ (await Settings.get("LOGIN_FIELD")) === "phone") {
240
+ if (!payload.phone) {
241
+ throw `Phone is required, when login field is phone`;
242
+ }
243
+ else {
244
+ let genLogin = (payload.phone.code +
245
+ payload.phone.number +
246
+ payload.phone.additionalNumber).replace(/\D/g, "");
247
+ if (genLogin !== payload.login) {
248
+ throw `Login is: js (payload.phone.code+payload.phone.number+payload.phone.additionalNumber).replace(/\D/g, '')`;
249
+ }
250
+ }
251
+ }
252
+ if (payload.otp &&
253
+ !(await OneTimePassword.check(payload.login, payload.otp))) {
254
+ throw "OTP check failed";
255
+ }
256
+ let newUser = await User.create({
257
+ phone: payload.phone,
258
+ login: payload.login,
259
+ firstName: payload.firstName,
260
+ }).fetch();
261
+ if (passwordPolicy === "required") {
262
+ newUser = await User.setPassword(newUser.id, payload.password, null, true);
263
+ }
264
+ else if (passwordPolicy === "from_otp") {
265
+ newUser = await User.setPassword(newUser.id, payload.otp, null, true);
266
+ }
267
+ let message = {
268
+ deviceId: context.connectionParams.deviceId,
269
+ title: context.i18n.__("Success"),
270
+ type: "info",
271
+ message: context.i18n.__("New user created"),
272
+ };
273
+ // let action: Action = {
274
+ // type: "GoTo",
275
+ // data: {
276
+ // "section": "login",
277
+ // "delaySeconds": 5
278
+ // }
279
+ // }
280
+ return {
281
+ user: newUser,
282
+ message: message,
283
+ action: null,
284
+ };
285
+ }
286
+ catch (error) {
287
+ sails.log.error(error);
288
+ throw new Error(error);
289
+ }
290
+ },
291
+ },
292
+ // Authentication required
293
+ logout: {
294
+ def: `#graphql
295
+ logout(
296
+ "Optional field if not pass logout from current device",
297
+ deviceId: String
298
+ ): Response`,
299
+ fn: async (parent, payload, context) => {
300
+ const auth = await jwt_1.JWTAuth.verify(context.connectionParams.authorization);
301
+ let deviceId;
302
+ if (!payload.deviceId) {
303
+ deviceId = auth.deviceId;
304
+ }
305
+ else {
306
+ let ud = await UserDevice.findOne({ name: payload.deviceId });
307
+ deviceId = ud.id;
308
+ }
309
+ if (!(await UserDevice.checkSession(auth.sessionId, auth.userId, {
310
+ lastIP: "IP",
311
+ userAgent: context.connectionParams["user-agent"],
312
+ }))) {
313
+ throw `Authentication failed`;
314
+ }
315
+ await UserDevice.update({ id: deviceId }, { isLogined: false });
316
+ let message = {
317
+ deviceId: deviceId,
318
+ title: context.i18n.__("Success"),
319
+ type: "info",
320
+ message: context.i18n.__("Logout"),
321
+ };
322
+ let action = undefined;
323
+ // Here should be Emmiter for midificate Action And Message
324
+ return {
325
+ message: message,
326
+ action: action,
327
+ };
328
+ },
329
+ },
330
+ logoutFromAllDevices: {
331
+ def: `logoutFromAllDevices: Response`,
332
+ fn: async (parent, payload, context) => {
333
+ const auth = await jwt_1.JWTAuth.verify(context.connectionParams.authorization);
334
+ if (!(await UserDevice.checkSession(auth.sessionId, auth.userId, {
335
+ lastIP: "IP",
336
+ userAgent: context.connectionParams["user-agent"],
337
+ }))) {
338
+ throw `Authentication failed`;
339
+ }
340
+ UserDevice.update({ user: auth.userId }, { isLogined: false });
341
+ let message = {
342
+ deviceId: null,
343
+ title: context.i18n.__("Success"),
344
+ type: "info",
345
+ message: context.i18n.__("Logout from all devices"),
346
+ };
347
+ let action = undefined;
348
+ // Here should be Emmiter for midificate Action And Message
349
+ return {
350
+ message: message,
351
+ action: action,
352
+ };
353
+ },
354
+ },
355
+ // Authentication required
356
+ favoriteDish: {
357
+ def: `#graphql
358
+ favoriteDish(
359
+ dishId: String!
360
+ ): Boolean`,
361
+ fn: async (parent, payload, context) => {
362
+ const auth = await jwt_1.JWTAuth.verify(context.connectionParams.authorization);
363
+ await User.handleFavoriteDish(auth.userId, payload.dishId);
364
+ return true;
365
+ },
366
+ },
367
+ // Authentication required
368
+ userUpdate: {
369
+ def: `#graphql
370
+ userUpdate(
371
+ user: InputUser!
372
+ ): UserResponse`,
373
+ fn: async (parent, payload, context) => {
374
+ const auth = await jwt_1.JWTAuth.verify(context.connectionParams.authorization);
375
+ let user = await User.updateOne({ id: auth.userId }, payload.user);
376
+ let message = {
377
+ deviceId: null,
378
+ title: context.i18n.__("Success"),
379
+ type: "info",
380
+ message: context.i18n.__("User was updated"),
381
+ };
382
+ // Here should be Emmiter for midificate Action And Message
383
+ return {
384
+ user: user,
385
+ message: message,
386
+ action: null,
387
+ };
388
+ },
389
+ },
390
+ userDelete: {
391
+ def: `#graphql
392
+ """User delete method """
393
+ userDelete(
394
+
395
+ "(from otpRequest userDelete:%login%)"
396
+ otp: String!,
397
+ ): Response`,
398
+ fn: async (parent, payload, context, info) => {
399
+ const auth = await jwt_1.JWTAuth.verify(context.connectionParams.authorization);
400
+ await User.delete(auth.userId, payload.otp);
401
+ let message = {
402
+ deviceId: null,
403
+ title: context.i18n.__("Success"),
404
+ type: "info",
405
+ message: context.i18n.__("The user will be deleted"),
406
+ };
407
+ let action = null;
408
+ // Here should be Emmiter for midificate Action And Message
409
+ return {
410
+ message: message,
411
+ action: action,
412
+ };
413
+ },
414
+ },
415
+ },
416
+ };