@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.
- package/.gitattributes +2 -0
- package/.gitlab-ci.yml +18 -0
- package/.vscode/extensions.json +5 -0
- package/docs/actions.md +25 -0
- package/docs/authorization.md +215 -0
- package/docs/captcha.md +71 -0
- package/docs/device-id.md +30 -0
- package/docs/messages.md +10 -0
- package/docs/user.md +54 -0
- package/index.d.ts +0 -1
- package/index.js +6 -2
- package/index.ts +2 -2
- package/lib/afterHook.js +8 -0
- package/lib/afterHook.ts +9 -0
- package/lib/bindTranslations.d.ts +1 -0
- package/lib/bindTranslations.js +40 -0
- package/lib/bindTranslations.ts +39 -0
- package/lib/defaults.d.ts +1 -0
- package/lib/defaults.js +49 -10
- package/lib/defaults.ts +55 -0
- package/lib/eventHelper.d.ts +14 -5
- package/lib/eventHelper.js +28 -9
- package/lib/eventHelper.ts +41 -8
- package/lib/getRecomended.d.ts +1 -0
- package/lib/getRecomended.js +29 -0
- package/lib/getRecomended.ts +31 -0
- package/lib/graphqlHelper.d.ts +3 -4
- package/lib/graphqlHelper.js +184 -73
- package/lib/graphqlHelper.ts +329 -186
- package/lib/jwt.d.ts +10 -0
- package/lib/jwt.js +43 -0
- package/lib/jwt.ts +61 -0
- package/package.json +13 -6
- package/src/additionalResolvers.d.ts +72 -9
- package/src/additionalResolvers.js +93 -24
- package/src/additionalResolvers.ts +105 -34
- package/src/graphql.d.ts +5 -3
- package/src/graphql.js +170 -37
- package/src/graphql.ts +210 -60
- package/src/resolvers/bonusProgram.d.ts +32 -0
- package/src/resolvers/bonusProgram.js +65 -0
- package/src/resolvers/bonusProgram.ts +79 -0
- package/src/resolvers/captcha.d.ts +11 -0
- package/src/resolvers/captcha.js +19 -0
- package/src/resolvers/captcha.ts +16 -0
- package/src/resolvers/checkout.d.ts +43 -14
- package/src/resolvers/checkout.js +172 -122
- package/src/resolvers/checkout.ts +218 -142
- package/src/resolvers/dishAndModifier.js +8 -4
- package/src/resolvers/dishAndModifier.ts +4 -0
- package/src/resolvers/error.d.ts +9 -0
- package/src/resolvers/error.js +21 -0
- package/src/resolvers/error.ts +21 -0
- package/src/resolvers/menu.d.ts +9 -0
- package/src/resolvers/menu.js +12 -0
- package/src/resolvers/menu.ts +10 -0
- package/src/resolvers/order.d.ts +527 -0
- package/src/resolvers/order.js +349 -0
- package/src/resolvers/order.ts +435 -0
- package/src/resolvers/paymentMethod.js +7 -3
- package/src/resolvers/paymentMethod.ts +9 -5
- package/src/resolvers/pickupPoint.d.ts +1 -0
- package/src/resolvers/pickupPoint.js +24 -0
- package/src/resolvers/pickupPoint.ts +23 -0
- package/src/resolvers/recomended.d.ts +13 -0
- package/src/resolvers/recomended.js +80 -0
- package/src/resolvers/recomended.ts +86 -0
- package/src/resolvers/restrictions.d.ts +37 -1
- package/src/resolvers/restrictions.js +100 -15
- package/src/resolvers/restrictions.ts +106 -14
- package/src/resolvers/streets.d.ts +1 -1
- package/src/resolvers/streets.js +1 -4
- package/src/resolvers/streets.ts +1 -3
- package/src/resolvers/subscriptions.d.ts +4 -4
- package/src/resolvers/subscriptions.js +49 -12
- package/src/resolvers/subscriptions.ts +59 -14
- package/src/resolvers/telemetry.d.ts +14 -0
- package/src/resolvers/telemetry.js +25 -0
- package/src/resolvers/telemetry.ts +24 -0
- package/src/resolvers/user.d.ts +82 -0
- package/src/resolvers/user.js +416 -0
- package/src/resolvers/user.ts +621 -0
- package/src/resolvers/userLocation.d.ts +53 -0
- package/src/resolvers/userLocation.js +74 -0
- package/src/resolvers/userLocation.ts +125 -0
- package/src/resolvers/userOTPrequest.d.ts +21 -0
- package/src/resolvers/userOTPrequest.js +57 -0
- package/src/resolvers/userOTPrequest.ts +75 -0
- package/test/e2e_helper.js +157 -0
- package/test/e2e_helper.ts +212 -0
- package/test/fixture/config/i18n.js +7 -20
- package/test/fixture/config/locales/de.json +1 -0
- package/test/fixture/config/locales/en.json +10 -0
- package/test/fixture/config/locales/es.json +3 -0
- package/test/fixture/config/locales/fr.json +1 -0
- package/test/fixture/config/log.js +1 -1
- package/test/fixture/package.json +5 -6
- package/test/fixture/patches/rttc+10.0.1.patch +17 -0
- package/test/integration/captcha.test.js +20 -0
- package/test/integration/captcha.test.ts +25 -0
- package/test/integration/dish.test.js +35 -0
- package/test/integration/dish.test.ts +43 -0
- package/test/integration/graphql.test.js +5 -2
- package/test/integration/graphql.test.ts +2 -4
- package/test/integration/images.test.js +35 -0
- package/test/integration/images.test.ts +40 -0
- package/test/integration/locale.test.js +26 -0
- package/test/integration/locale.test.ts +32 -0
- package/test/integration/order.test.js +56 -43
- package/test/integration/order.test.ts +59 -59
- package/test/integration/subscriptions.test.js +136 -0
- package/test/integration/subscriptions.test.ts +162 -0
- package/test/integration/user.test.js +249 -0
- package/test/integration/user.test.ts +299 -0
- package/test/unit/first.test.js +4 -2
- package/test/unit/first.test.ts +1 -1
- package/test/unit/get-recomended.test.js +56 -0
- package/test/unit/get-recomended.test.ts +63 -0
- package/translations/de.json +2 -0
- package/translations/en.json +3 -0
- package/translations/es.json +3 -0
- package/translations/fr.json +2 -0
- package/translations/ru.json +36 -0
- package/tsconfig.json +20 -5
- package/types/global.d.ts +30 -0
- package/types/global.js +2 -0
- package/types/global.ts +31 -0
- package/types/primitives.d.ts +19 -0
- package/types/references.d.ts +1 -0
- package/types/restoGraphQLConfig.d.ts +13 -0
- package/lib/afterHook.ts___graphql-transport-ws +0 -138
- package/lib/afterHook.ts___graphql-ws +0 -133
- package/lib/errorWrapper.d.ts +0 -4
- package/lib/errorWrapper.js +0 -13
- package/lib/errorWrapper.ts +0 -12
- package/notes.md +0 -1976
- package/src/resolvers/cart.d.ts +0 -343
- package/src/resolvers/cart.js +0 -196
- package/src/resolvers/cart.ts +0 -277
- package/test/fixture/config/connections.js +0 -9
- package/test/integration/sails_not_crash.test.js +0 -3
- 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
|
-
|
|
6
|
-
if (
|
|
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 (
|
|
13
|
-
const rows = await Group.find({
|
|
14
|
-
|
|
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.
|
|
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
|
-
|
|
24
|
-
if (
|
|
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 (
|
|
31
|
-
const rows = await Dish.find({
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
67
|
-
return
|
|
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 (
|
|
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 (
|
|
136
|
-
return await Dish.find(
|
|
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: () =>
|
|
3
|
-
getServer: () =>
|
|
4
|
+
getPubsub: () => PubSub;
|
|
5
|
+
getServer: () => ApolloServer;
|
|
4
6
|
addAdditionalResolver: (resolver: any) => void;
|
|
5
|
-
init: () => Promise<
|
|
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
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
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
|
-
|
|
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 (
|
|
32
|
+
if (sails.config.restographql?.whiteListAutoGen)
|
|
33
33
|
helper.setWhiteList(sails.config.restographql.whiteListAutoGen);
|
|
34
|
-
if (
|
|
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:
|
|
40
|
+
phone: InputPhone
|
|
42
41
|
mail: String
|
|
43
42
|
name: String!
|
|
44
43
|
}
|
|
45
|
-
input
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
+
emitter.on("core-order-after-count", "graphql", function (order) {
|
|
110
179
|
pubsub.publish("order-changed", order);
|
|
111
180
|
});
|
|
112
|
-
|
|
181
|
+
emitter.on("send-message", "graphql", function ({ orderId, message }) {
|
|
113
182
|
pubsub.publish("message", { orderId, message });
|
|
114
183
|
});
|
|
115
|
-
|
|
184
|
+
emitter.on("core-dish-after-update", "graphql", function (record) {
|
|
116
185
|
pubsub.publish("dish-changed", record);
|
|
117
186
|
});
|
|
118
|
-
|
|
187
|
+
emitter.on("core-maintenance-enabled", "graphql", function (record) {
|
|
119
188
|
pubsub.publish("maintenance", record);
|
|
120
189
|
});
|
|
121
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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[
|
|
226
|
+
exContext["pubsub"] = pubsub;
|
|
138
227
|
return exContext;
|
|
139
228
|
},
|
|
140
229
|
},
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|