-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathStrikeController.ts
More file actions
123 lines (109 loc) · 4.26 KB
/
StrikeController.ts
File metadata and controls
123 lines (109 loc) · 4.26 KB
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
122
123
import { Request, Response, NextFunction } from 'express';
import { TraineesRepository } from '../../repositories';
import { AuthenticatedUser, ResponseError, StrikeWithReporterID } from '../../models';
import { NotificationService } from '../../services';
import { validateStrike } from '../../models/Strike';
import { UserRepository } from '../../repositories/UserRepository';
export interface StrikeControllerType {
getStrikes(req: Request, res: Response, next: NextFunction): Promise<void>;
addStrike(req: Request, res: Response, next: NextFunction): Promise<void>;
updateStrike(req: Request, res: Response, next: NextFunction): Promise<void>;
deleteStrike(req: Request, res: Response, next: NextFunction): Promise<void>;
}
export class StrikeController implements StrikeControllerType {
constructor(
private readonly traineesRepository: TraineesRepository,
private readonly userRepository: UserRepository,
private readonly notificationService: NotificationService
) {}
async getStrikes(req: Request, res: Response, next: NextFunction) {
const trainee = await this.traineesRepository.getTrainee(String(req.params.id));
if (!trainee) {
res.status(404).send(new ResponseError('Trainee not found'));
return;
}
try {
const strikes = await this.traineesRepository.getStrikes(trainee.id);
res.status(200).json(strikes);
} catch (error: any) {
next(error);
}
}
async addStrike(req: Request, res: Response, next: NextFunction): Promise<void> {
const trainee = await this.traineesRepository.getTrainee(String(req.params.id));
if (!trainee) {
res.status(404).send(new ResponseError('Trainee not found'));
return;
}
const { reason, date, comments } = req.body;
const user = res.locals.user as AuthenticatedUser;
const reporterID = req.body.reporterID || user.id;
const newStrike = { reason, date, comments, reporterID } as StrikeWithReporterID;
// Validate new strike model before creation
try {
validateStrike(newStrike);
const reporter = await this.userRepository.findUserByID(reporterID);
if (!reporter) {
throw new Error(`Invalid reporter ID ${reporterID}. User not found.`);
}
} catch (error: any) {
res.status(400).send(new ResponseError(error.message));
return;
}
try {
const strike = await this.traineesRepository.addStrike(String(req.params.id), newStrike);
res.status(201).json(strike);
this.notificationService.strikeCreated(trainee, strike);
} catch (error: any) {
next(error);
}
}
async updateStrike(req: Request, res: Response, next: NextFunction): Promise<void> {
const trainee = await this.traineesRepository.getTrainee(String(req.params.id));
if (!trainee) {
res.status(404).send(new ResponseError('Trainee not found'));
return;
}
const strike = trainee.educationInfo.strikes.find((strike) => strike.id === String(req.params.strikeId));
if (!strike) {
res.status(404).send(new ResponseError('Strike not found'));
return;
}
const user = res.locals.user as AuthenticatedUser;
const strikeToUpdate: StrikeWithReporterID = {
id: String(req.params.strikeId),
reason: req.body.reason,
date: req.body.date,
comments: req.body.comments,
reporterID: req.body.reporterID || user.id,
};
// Validate new strike model after applying the changes
try {
validateStrike(strikeToUpdate);
} catch (error: any) {
res.status(400).send(new ResponseError(error.message));
return;
}
try {
const updatedStrike = await this.traineesRepository.updateStrike(String(req.params.id), strikeToUpdate);
res.status(200).json(updatedStrike);
} catch (error: any) {
next(error);
return;
}
}
async deleteStrike(req: Request, res: Response, next: NextFunction): Promise<void> {
const trainee = await this.traineesRepository.getTrainee(String(req.params.id));
if (!trainee) {
res.status(404).send(new ResponseError('Trainee not found'));
return;
}
try {
await this.traineesRepository.deleteStrike(String(req.params.id), String(req.params.strikeId));
res.status(204).end();
} catch (error: any) {
next(error);
return;
}
}
}