-
Notifications
You must be signed in to change notification settings - Fork 0
/
editShop.ts
121 lines (109 loc) · 3.51 KB
/
editShop.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import {
MutationCreateShopArgs,
MutationEditShopArgs,
} from "src/graphQL/types/types.js";
import { Context } from "../../../../../apollo/context.js";
import checkConstants from "../../../../controllers/checkConstants.js";
import checkFirebaseErrors from "../../../../controllers/checkFirebaseErrors.js";
import { checkPostCode } from "../../../../controllers/checkPostCode.js";
import { createPostCode } from "../../../../controllers/createPostCode.js";
import { reverseGeocoding } from "../../../../controllers/reverseGeocoding.js";
import Shop from "../../../../schemas/Shop.model.js";
import Product from "../../../../schemas/Product.model.js";
import businessById from "../../../../../src/controllers/queries/businessById.js";
import lodash from "lodash";
import Business from "src/schemas/Business.model.js";
import { greaterOrEqualThanZero } from "../../../../../src/controllers/greaterOrEqualThanZero.js";
import customError from "../../../../../src/controllers/errors/customError.js";
export const editShop = async (
_: any,
{ id, options }: MutationEditShopArgs,
{ req, admin }: Context
) => {
//token operations
let token: any = {
user_id: "prova",
isBusiness: true,
mongoId: "641f209eca22d34c3ca1ec1f",
};
if (process.env.NODE_ENV !== "development") {
try {
token = await admin.auth().verifyIdToken(req.headers.authorization);
} catch (e) {
checkFirebaseErrors(e);
}
}
//check if token is business
if (!token.isBusiness && process.env.NODE_ENV !== "development") {
throw Object.assign(new Error("Error"), {
extensions: {
customCode: "403",
customPath: "token",
customMessage: "token's owner is not a business",
},
});
}
if (options.minimumAmountForFreeShipping != null) {
if (!greaterOrEqualThanZero(options.minimumAmountForFreeShipping)) {
customError({
code: "400",
path: "minimum amount for free shipping",
message:
"the minimum amount for free shipping must be greater or equal than 0",
});
}
}
//get the business
const business = await businessById(token.mongoId);
//get the shop
const shop = await Shop.findByIdAndUpdate(id, options);
if (!shop) {
customError({
code: "404",
path: "id",
message: "shop not found",
});
}
//get the new address if inputted
if (options.address != null) {
let { center, city, postCode }: any = await reverseGeocoding(
(options.address.location as any).coordinates[0],
(options.address.location as any).coordinates[1]
);
const postCodeExists = await checkPostCode(postCode);
if (!postCodeExists) {
createPostCode(postCode, city, center);
}
(options.address as any).postcode = postCode;
}
//edit all products of the shop
const shopInfoProduct = lodash.merge(
{
profilePhoto: shop.profilePhoto,
name: shop.name,
city: shop.address.city,
status: shop.status,
id: shop.id,
businessId: shop.businessId,
businessStatus: shop.businessStatus,
},
{
...(options.name != null && { name: options.name }),
...(options.profilePhoto != null && {
profilePhoto: options.profilePhoto,
}),
...(options.address != null && { city: options.address.city }),
...(options.status != null && { status: options.status }),
}
);
//todo execute this only if teh ShopInfo changed
await Product.updateMany(
{
"shopInfo.id": id,
},
{
shopInfo: shopInfoProduct,
}
);
return true;
};