-
Notifications
You must be signed in to change notification settings - Fork 0
/
fund.controller.ts
110 lines (103 loc) · 2.92 KB
/
fund.controller.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
import mongoose from "mongoose";
import {
Body,
Delete,
Get,
HttpCode,
InternalServerError,
JsonController,
OnUndefined,
Param,
Post
} from "routing-controllers";
import {Fund} from "../interfaces/fund.interface";
import {IUser, UserReq} from "../interfaces/user.interface";
import User from "../models/user";
@JsonController()
export class FundController {
@Get("/")
public async getHealthCheck() {
// @ts-ignore
const mongoState = mongoose.STATES[mongoose.connection.readyState];
return {
dbState: mongoState,
health: "ok"
};
}
@Get("/users")
public async getAllUsers() {
try {
const users = await User.find({});
return users.map((u) => u.toJSON());
} catch (err) {
throw new InternalServerError(err);
}
}
@Get("/summary")
public async sumUpFunds() {
try {
const sums = await User.aggregate([
{
$project: {
summary: {
$divide: [
{
$sum: "$funds.value"
}, 2
]
},
user: "$username"
}
}
]);
return {
creditor: sums.find((elem) =>
elem.summary === Math.max(...sums.map((maxElem) =>
parseFloat(maxElem.summary))
)
).user,
diff: sums.reduce((prev, next) =>
Math.abs(prev.summary - next.summary))
};
} catch (err) {
throw new InternalServerError(err);
}
}
@Get("/funds")
public async getUserExpenses() {
try {
const user = await User.findOne({email: "email"});
return user.toJSON();
} catch (err) {
throw new InternalServerError(err);
}
}
@HttpCode(201)
@Post("/funds")
public async addExpense(@Body() fund: Fund) {
try {
await User.findOneAndUpdate(
{email: "email"},
{$push: {funds: fund}}
);
const obj = await User.findOne({email: "email"});
return obj.toJSON();
} catch (err) {
throw new InternalServerError(err);
}
}
@Delete("/funds/:name")
@HttpCode(204)
public async removeExpense(@Param("name") name: string): Promise<void> {
try {
await User.findOneAndUpdate(
{email: "email"},
{$pull: {funds: {name}}}
);
const obj = await User.findOne({email: "email"});
return obj.toJSON();
} catch (err) {
throw new InternalServerError(err);
}
}
}