@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.
- 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 -72
- package/lib/graphqlHelper.ts +329 -185
- 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 +35 -16
- package/src/resolvers/checkout.js +171 -94
- package/src/resolvers/checkout.ts +214 -104
- 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 -278
- 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
|
};
|