@webresto/graphql 1.3.7 → 1.4.0
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 +15 -7
- 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
package/lib/jwt.d.ts
ADDED
package/lib/jwt.js
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.JWTAuth = void 0;
|
4
|
+
const jwt = require("jsonwebtoken");
|
5
|
+
class JWTAuth {
|
6
|
+
static sign(authData) {
|
7
|
+
return jwt.sign({
|
8
|
+
data: authData
|
9
|
+
}, process.env.JWT_SECRET, { expiresIn: parseInt(process.env.JWT_TOKEN_EXPIRES_IN) ?? 15 * 24 * 60 * 60 });
|
10
|
+
}
|
11
|
+
static async verify(token) {
|
12
|
+
if (!token) {
|
13
|
+
throw `Verify JWT token is: ${token}`;
|
14
|
+
}
|
15
|
+
let decoded;
|
16
|
+
try {
|
17
|
+
let jwtData = (jwt.verify(token, process.env.JWT_SECRET));
|
18
|
+
decoded = jwtData.data;
|
19
|
+
}
|
20
|
+
catch (err) {
|
21
|
+
sails.log.error(`JWT verify error: `, err);
|
22
|
+
throw err;
|
23
|
+
}
|
24
|
+
if (decoded.userId && decoded.deviceId && decoded.sessionId) {
|
25
|
+
if (await User.findOne({ id: decoded.userId })) {
|
26
|
+
let device = await UserDevice.findOne({ where: { id: decoded.deviceId, user: decoded.userId, sessionId: decoded.sessionId } });
|
27
|
+
if (!device || device.isLogined !== true) {
|
28
|
+
throw `Logined device not found`;
|
29
|
+
}
|
30
|
+
else {
|
31
|
+
return decoded;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
else {
|
35
|
+
throw `no user with id ${decoded.userId}`;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
else {
|
39
|
+
throw `JWT decoded user or device not found`;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
exports.JWTAuth = JWTAuth;
|
package/lib/jwt.ts
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
import User from "@webresto/core/models/User"
|
2
|
+
import UserDevice from "@webresto/core/models/UserDevice"
|
3
|
+
|
4
|
+
import * as jwt from 'jsonwebtoken'
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
// GEN SECRET
|
9
|
+
type AuthData = {
|
10
|
+
userId: string
|
11
|
+
deviceId: string
|
12
|
+
sessionId: string
|
13
|
+
}
|
14
|
+
|
15
|
+
type JWTData = {
|
16
|
+
data: AuthData
|
17
|
+
iat: number
|
18
|
+
exp: number
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
export class JWTAuth {
|
23
|
+
public static sign(authData: AuthData): string {
|
24
|
+
return jwt.sign({
|
25
|
+
data: authData
|
26
|
+
}, process.env.JWT_SECRET, { expiresIn: parseInt(process.env.JWT_TOKEN_EXPIRES_IN) ?? 15 * 24 * 60 * 60 });
|
27
|
+
|
28
|
+
}
|
29
|
+
|
30
|
+
public static async verify(token: string): Promise<AuthData>{
|
31
|
+
|
32
|
+
if (!token) {
|
33
|
+
throw `Verify JWT token is: ${token}`
|
34
|
+
}
|
35
|
+
|
36
|
+
let decoded: AuthData;
|
37
|
+
try {
|
38
|
+
let jwtData = (jwt.verify(token, process.env.JWT_SECRET)) as JWTData
|
39
|
+
decoded = jwtData.data
|
40
|
+
} catch(err) {
|
41
|
+
sails.log.error(`JWT verify error: `, err)
|
42
|
+
throw err
|
43
|
+
}
|
44
|
+
|
45
|
+
if(decoded.userId && decoded.deviceId && decoded.sessionId) {
|
46
|
+
if (await User.findOne({id: decoded.userId})) {
|
47
|
+
|
48
|
+
let device = await UserDevice.findOne({where: {id: decoded.deviceId, user: decoded.userId, sessionId: decoded.sessionId}});
|
49
|
+
if(!device || device.isLogined !== true) {
|
50
|
+
throw `Logined device not found`
|
51
|
+
} else {
|
52
|
+
return decoded;
|
53
|
+
}
|
54
|
+
} else {
|
55
|
+
throw `no user with id ${decoded.userId}`
|
56
|
+
}
|
57
|
+
} else {
|
58
|
+
throw `JWT decoded user or device not found`
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
package/package.json
CHANGED
@@ -2,34 +2,42 @@
|
|
2
2
|
"author": {
|
3
3
|
"name": "Webresto"
|
4
4
|
},
|
5
|
-
"bundleDependencies":
|
5
|
+
"bundleDependencies": [],
|
6
6
|
"dependencies": {
|
7
|
+
"accept-language-parser": "^1.5.0",
|
7
8
|
"apollo-fetch": "^0.7.0",
|
8
|
-
"apollo-server": "^2.
|
9
|
+
"apollo-server": "^2.26.1",
|
9
10
|
"dataloader": "^2.0.0",
|
11
|
+
"fix-esm": "^1.0.1",
|
10
12
|
"graphql": "^15.5.0",
|
13
|
+
"jsonwebtoken": "^9.0.0",
|
11
14
|
"waterline-criteria": "^2.0.0"
|
12
15
|
},
|
13
16
|
"devDependencies": {
|
14
17
|
"@42pub/typed-sails": "^1.0.0",
|
18
|
+
"@apollo/client": "^3.7.3",
|
19
|
+
"@types/accept-language-parser": "^1.5.3",
|
15
20
|
"@types/bluebird": "^3.5.32",
|
16
21
|
"@types/bluebird-global": "^3.5.12",
|
17
22
|
"@types/body-parser": "^1.19.0",
|
18
23
|
"@types/chai": "^4.2.11",
|
19
24
|
"@types/express": "^4.17.7",
|
20
25
|
"@types/faker": "^4.1.12",
|
26
|
+
"@types/jsonwebtoken": "^9.0.0",
|
21
27
|
"@types/lodash": "^4.14.157",
|
22
28
|
"@types/mocha": "^8.0.2",
|
23
29
|
"@types/node": "^14.14.35",
|
24
|
-
"@types/uuid": "^8.0.0",
|
25
30
|
"@types/waterline": "^0.13.4",
|
26
|
-
"@webresto/core": "^1.
|
31
|
+
"@webresto/core": "^1.3.27-alpha",
|
27
32
|
"chai": "^4.2.0",
|
33
|
+
"cross-fetch": "^3.1.5",
|
34
|
+
"crypto-puzzle": "^4.0.0",
|
28
35
|
"dotenv": "^16.0.0",
|
29
36
|
"faker": "^4.1.0",
|
30
37
|
"mocha": "^8.1.1",
|
31
38
|
"ts-node": "^10.7.0",
|
32
|
-
"typescript": "^3.9.7"
|
39
|
+
"typescript": "^3.9.7",
|
40
|
+
"i18n-2": "^0.7.3"
|
33
41
|
},
|
34
42
|
"deprecated": false,
|
35
43
|
"description": "Webresto graphql api",
|
@@ -56,9 +64,9 @@
|
|
56
64
|
},
|
57
65
|
"scripts": {
|
58
66
|
"gendoc": "apidoc -o apidoc/ && apidoc-markdown2 -p apidoc -o docs/api.md",
|
59
|
-
"test": "mocha -r ts-node/register test/bootstrap.ts './test/{,!(fixture)/**}/*.test.ts' --exit",
|
67
|
+
"test": "mocha -r ts-node/register test/bootstrap.ts './test/{,!(fixture)/**}/*.test.ts' --exit --grep=${PATTERN}",
|
60
68
|
"test:js": "mocha test/bootstrap.js './test/{,!(fixture)/**}/*.test.js' --exit",
|
61
69
|
"test:init": "cd ./test/fixture && npm i --no-package-lock --prefix ./ && cd -"
|
62
70
|
},
|
63
|
-
"version": "1.
|
71
|
+
"version": "1.4.0"
|
64
72
|
}
|
@@ -1,25 +1,88 @@
|
|
1
1
|
export declare const additionalResolver: {
|
2
2
|
GroupModifier: {
|
3
|
-
|
3
|
+
modifierId: (parent: {
|
4
|
+
modifierId?: string;
|
5
|
+
id?: string; /** here id means rmsID */
|
6
|
+
}, args: any, context: {
|
7
|
+
dataloaders: WeakMap<object, any>;
|
8
|
+
}, info: {
|
9
|
+
fieldNodes: any;
|
10
|
+
}) => Promise<any>;
|
11
|
+
group: (parent: {
|
12
|
+
modifierId?: string;
|
13
|
+
id?: string; /** here id means rmsID */
|
14
|
+
}, args: any, context: {
|
15
|
+
dataloaders: WeakMap<object, any>;
|
16
|
+
}, info: {
|
17
|
+
fieldNodes: any;
|
18
|
+
}) => Promise<any>;
|
4
19
|
};
|
5
20
|
Modifier: {
|
6
|
-
|
21
|
+
modifierId: (parent: {
|
22
|
+
modifierId?: string;
|
23
|
+
id?: string; /** here id means rmsID */
|
24
|
+
}, args: any, context: {
|
25
|
+
dataloaders: WeakMap<object, any>;
|
26
|
+
}, info: {
|
27
|
+
fieldNodes: any;
|
28
|
+
}) => Promise<any>;
|
29
|
+
dish: (parent: {
|
30
|
+
modifierId?: string;
|
31
|
+
id?: string; /** here id means rmsID */
|
32
|
+
}, args: any, context: {
|
33
|
+
dataloaders: WeakMap<object, any>;
|
34
|
+
}, info: {
|
35
|
+
fieldNodes: any;
|
36
|
+
}) => Promise<any>;
|
7
37
|
};
|
8
38
|
OrderModifier: {
|
9
|
-
dish: (parent:
|
10
|
-
|
39
|
+
dish: (parent: {
|
40
|
+
id: string;
|
41
|
+
modifierId: string;
|
42
|
+
}, args: any, context: any, info: any) => Promise<any>;
|
43
|
+
group: (parent: {
|
44
|
+
id: string;
|
45
|
+
groupId: string;
|
46
|
+
}, args: any) => Promise<any>;
|
11
47
|
};
|
12
48
|
Dish: {
|
13
|
-
parentGroup: (parent:
|
14
|
-
|
49
|
+
parentGroup: (parent: {
|
50
|
+
parentGroup: any;
|
51
|
+
}, args: any, context: {
|
52
|
+
dataloaders: WeakMap<object, any>;
|
53
|
+
}, info: {
|
54
|
+
fieldNodes: any;
|
55
|
+
}) => Promise<any>;
|
56
|
+
images: (parent: {
|
57
|
+
id: any;
|
58
|
+
}, args: any, context: {
|
59
|
+
dataloaders: WeakMap<object, any>;
|
60
|
+
}, info: {
|
61
|
+
fieldNodes: any;
|
62
|
+
}) => Promise<any>;
|
15
63
|
};
|
16
64
|
Group: {
|
17
|
-
parentGroup: (parent:
|
65
|
+
parentGroup: (parent: {
|
66
|
+
parentGroup: any;
|
67
|
+
}, args: any, context: {
|
68
|
+
dataloaders: WeakMap<object, any>;
|
69
|
+
}, info: {
|
70
|
+
fieldNodes: any;
|
71
|
+
}) => Promise<any>;
|
18
72
|
};
|
19
73
|
Order: {
|
20
|
-
dishes: (parent:
|
74
|
+
dishes: (parent: {
|
75
|
+
dishes: any;
|
76
|
+
id: any;
|
77
|
+
}, args: any, context: any, info: any) => Promise<any>;
|
21
78
|
};
|
22
79
|
OrderDish: {
|
23
|
-
dish: (parent:
|
80
|
+
dish: (parent: {
|
81
|
+
dish: any;
|
82
|
+
}, args: any, context: {
|
83
|
+
dataloaders: WeakMap<object, any>;
|
84
|
+
}, info: {
|
85
|
+
fieldNodes: any;
|
86
|
+
}) => Promise<any>;
|
24
87
|
};
|
25
88
|
};
|
@@ -4,8 +4,29 @@ exports.additionalResolver = void 0;
|
|
4
4
|
const DataLoader = require('dataloader');
|
5
5
|
exports.additionalResolver = {
|
6
6
|
GroupModifier: {
|
7
|
+
modifierId: async (parent, args, context, info) => {
|
8
|
+
if (parent.modifierId)
|
9
|
+
return parent.modifierId;
|
10
|
+
if (!context.dataloaders)
|
11
|
+
context.dataloaders = new WeakMap();
|
12
|
+
const dataloaders = context.dataloaders;
|
13
|
+
let dl = dataloaders.get(info.fieldNodes);
|
14
|
+
if (!dl) {
|
15
|
+
dl = new DataLoader(async (id) => {
|
16
|
+
const rows = await Group.find({
|
17
|
+
rmsId: id, isDeleted: false
|
18
|
+
});
|
19
|
+
const sortedInIdsOrder = id.map((id) => rows.find(x => {
|
20
|
+
return x.rmsId === id;
|
21
|
+
}));
|
22
|
+
return sortedInIdsOrder;
|
23
|
+
});
|
24
|
+
dataloaders.set(info.fieldNodes, dl);
|
25
|
+
}
|
26
|
+
return (await dl.load(parent.id)).id;
|
27
|
+
},
|
7
28
|
group: async (parent, args, context, info) => {
|
8
|
-
if (!parent.modifierId)
|
29
|
+
if (!parent.modifierId && !parent.id)
|
9
30
|
return;
|
10
31
|
if (!context.dataloaders)
|
11
32
|
context.dataloaders = new WeakMap();
|
@@ -13,43 +34,85 @@ exports.additionalResolver = {
|
|
13
34
|
let dl = dataloaders.get(info.fieldNodes);
|
14
35
|
if (!dl) {
|
15
36
|
dl = new DataLoader(async (ids) => {
|
16
|
-
const rows = await Group.find({
|
17
|
-
|
37
|
+
const rows = await Group.find({
|
38
|
+
where: {
|
39
|
+
or: [{ id: ids, isDeleted: false }, { rmsId: ids, isDeleted: false }]
|
40
|
+
}
|
41
|
+
});
|
42
|
+
const sortedInIdsOrder = ids.map((id) => rows.find(x => x.id === id));
|
18
43
|
return sortedInIdsOrder;
|
19
44
|
});
|
20
45
|
dataloaders.set(info.fieldNodes, dl);
|
21
46
|
}
|
22
|
-
return dl.load(parent.modifierId);
|
23
|
-
}
|
47
|
+
return await dl.load(parent.modifierId ? parent.modifierId : parent.id);
|
48
|
+
}
|
24
49
|
},
|
25
50
|
Modifier: {
|
51
|
+
modifierId: async (parent, args, context, info) => {
|
52
|
+
if (parent.modifierId)
|
53
|
+
return parent.modifierId;
|
54
|
+
if (!context.dataloaders)
|
55
|
+
context.dataloaders = new WeakMap();
|
56
|
+
const dataloaders = context.dataloaders;
|
57
|
+
let dl = dataloaders.get(info.fieldNodes);
|
58
|
+
if (!dl) {
|
59
|
+
dl = new DataLoader(async (id) => {
|
60
|
+
const rows = await Dish.find({
|
61
|
+
rmsId: id, balance: { "!=": 0 }, isDeleted: false
|
62
|
+
});
|
63
|
+
const sortedInIdsOrder = id.map((id) => rows.find(x => {
|
64
|
+
return x.rmsId === id;
|
65
|
+
}));
|
66
|
+
return sortedInIdsOrder;
|
67
|
+
});
|
68
|
+
dataloaders.set(info.fieldNodes, dl);
|
69
|
+
}
|
70
|
+
return (await dl.load(parent.id)).id;
|
71
|
+
},
|
26
72
|
dish: async (parent, args, context, info) => {
|
27
|
-
if (!parent.modifierId)
|
73
|
+
if (!parent.modifierId && !parent.id)
|
28
74
|
return;
|
29
75
|
if (!context.dataloaders)
|
30
76
|
context.dataloaders = new WeakMap();
|
31
77
|
const dataloaders = context.dataloaders;
|
32
78
|
let dl = dataloaders.get(info.fieldNodes);
|
33
79
|
if (!dl) {
|
34
|
-
dl = new DataLoader(async (
|
35
|
-
const rows = await Dish.find({
|
36
|
-
|
80
|
+
dl = new DataLoader(async (id) => {
|
81
|
+
const rows = await Dish.find({ where: { or: [
|
82
|
+
{ id: id, balance: { "!=": 0 }, isDeleted: false },
|
83
|
+
{ rmsId: id, balance: { "!=": 0 }, isDeleted: false }
|
84
|
+
] }
|
85
|
+
});
|
86
|
+
const sortedInIdsOrder = id.map((id) => rows.find(x => {
|
87
|
+
return x.id === id ? x.id === id : x.rmsId === id ? x.rmsId === id : false;
|
88
|
+
}));
|
37
89
|
return sortedInIdsOrder;
|
38
90
|
});
|
39
|
-
// ложим инстанс дата-лоадера в WeakMap для повторного использования
|
40
91
|
dataloaders.set(info.fieldNodes, dl);
|
41
92
|
}
|
42
|
-
|
43
|
-
return dl.load(parent.modifierId);
|
44
|
-
// return await Dish.findOne({id: parent.modifierId}).populateAll();
|
93
|
+
return await dl.load(parent.modifierId ? parent.modifierId : parent.id);
|
45
94
|
}
|
46
95
|
},
|
47
96
|
OrderModifier: {
|
48
97
|
dish: async (parent, args, context, info) => {
|
49
|
-
|
98
|
+
if (!parent.id && !parent.modifierId)
|
99
|
+
return null;
|
100
|
+
return (await Dish.find({ where: { or: [
|
101
|
+
{ id: parent.id, balance: { "!=": 0 }, isDeleted: false },
|
102
|
+
{ rmsId: parent.id, balance: { "!=": 0 }, isDeleted: false }
|
103
|
+
] }
|
104
|
+
// @ts-ignore //TODO: Deprecated populateAll
|
105
|
+
}).populateAll())[0];
|
50
106
|
},
|
51
107
|
group: async (parent, args) => {
|
52
|
-
|
108
|
+
if (!parent.id && !parent.groupId)
|
109
|
+
return null;
|
110
|
+
return (await Group.find({ where: {
|
111
|
+
or: [{ id: parent.groupId, isDeleted: false }, { rmsId: parent.id, isDeleted: false }]
|
112
|
+
}
|
113
|
+
}
|
114
|
+
// @ts-ignore //TODO: Deprecated populateAll
|
115
|
+
).populateAll())[0];
|
53
116
|
}
|
54
117
|
},
|
55
118
|
Dish: {
|
@@ -65,14 +128,20 @@ exports.additionalResolver = {
|
|
65
128
|
}
|
66
129
|
let dl = dataloaders.get(info.fieldNodes);
|
67
130
|
if (!dl) {
|
68
|
-
dl = new DataLoader(async (
|
69
|
-
return
|
131
|
+
dl = new DataLoader(async (ids) => {
|
132
|
+
// Waterline can return data not by ids array sorting
|
133
|
+
return (await Group.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
|
70
134
|
});
|
71
135
|
dataloaders.set(info.fieldNodes, dl);
|
72
136
|
}
|
73
137
|
return await dl.load(parent.parentGroup);
|
74
138
|
},
|
75
139
|
images: async (parent, args, context, info) => {
|
140
|
+
const sortImages = (images) => {
|
141
|
+
return images.sort((a, b) => {
|
142
|
+
return (+new Date(b.uploadDate) - +new Date(a.uploadDate));
|
143
|
+
});
|
144
|
+
};
|
76
145
|
if (!parent.id)
|
77
146
|
return;
|
78
147
|
if (!context.dataloaders)
|
@@ -82,12 +151,12 @@ exports.additionalResolver = {
|
|
82
151
|
if (!dl) {
|
83
152
|
dl = new DataLoader(async (ids) => {
|
84
153
|
const rows = await Dish.find({ id: ids }).populate('images');
|
85
|
-
const images = ids.map(id =>
|
154
|
+
const images = ids.map((id) => rows.find(x => x.id === id)?.images);
|
86
155
|
return images;
|
87
156
|
});
|
88
157
|
dataloaders.set(info.fieldNodes, dl);
|
89
158
|
}
|
90
|
-
return await dl.load(parent.id);
|
159
|
+
return sortImages(await dl.load(parent.id));
|
91
160
|
}
|
92
161
|
},
|
93
162
|
Group: {
|
@@ -103,8 +172,8 @@ exports.additionalResolver = {
|
|
103
172
|
}
|
104
173
|
let dl = dataloaders.get(info.fieldNodes);
|
105
174
|
if (!dl) {
|
106
|
-
dl = new DataLoader(async (
|
107
|
-
return await Group.find(id);
|
175
|
+
dl = new DataLoader(async (ids) => {
|
176
|
+
return (await Group.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
|
108
177
|
});
|
109
178
|
dataloaders.set(info.fieldNodes, dl);
|
110
179
|
}
|
@@ -131,12 +200,12 @@ exports.additionalResolver = {
|
|
131
200
|
}
|
132
201
|
let dl = dataloaders.get(info.fieldNodes);
|
133
202
|
if (!dl) {
|
134
|
-
dl = new DataLoader(async (
|
135
|
-
return await Dish.find(
|
203
|
+
dl = new DataLoader(async (ids) => {
|
204
|
+
return (await Dish.find(ids)).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
|
136
205
|
});
|
137
206
|
dataloaders.set(info.fieldNodes, dl);
|
138
207
|
}
|
139
208
|
return await dl.load(parent.dish);
|
140
209
|
},
|
141
|
-
}
|
210
|
+
}
|
142
211
|
};
|