A social knowledge tool for researchers built on ATProto
1import { Response } from 'express';
2
3export abstract class Controller {
4 protected abstract executeImpl(req: any, res: Response): Promise<any>;
5
6 public async execute(req: any, res: Response): Promise<void> {
7 try {
8 await this.executeImpl(req, res);
9 } catch (err) {
10 console.log(`[Controller]: Uncaught controller error`);
11 console.log(err);
12 this.fail(res, 'An unexpected error occurred');
13 }
14 }
15
16 public static jsonResponse(res: Response, code: number, message: string) {
17 return res.status(code).json({ message });
18 }
19
20 public ok<T>(res: Response, dto?: T) {
21 if (dto) {
22 return res.status(200).json(dto);
23 } else {
24 return res.sendStatus(200);
25 }
26 }
27
28 public created<T>(res: Response, dto?: T) {
29 if (dto) {
30 return res.status(201).json(dto);
31 } else {
32 return res.sendStatus(201);
33 }
34 }
35
36 public badRequest(res: Response, message?: string) {
37 return Controller.jsonResponse(res, 400, message || 'Bad request');
38 }
39
40 public unauthorized(res: Response, message?: string) {
41 return Controller.jsonResponse(res, 401, message || 'Unauthorized');
42 }
43
44 public forbidden(res: Response, message?: string) {
45 return Controller.jsonResponse(res, 403, message || 'Forbidden');
46 }
47
48 public notFound(res: Response, message?: string) {
49 return Controller.jsonResponse(res, 404, message || 'Not found');
50 }
51
52 public conflict(res: Response, message?: string) {
53 return Controller.jsonResponse(res, 409, message || 'Conflict');
54 }
55
56 public tooMany(res: Response, message?: string) {
57 return Controller.jsonResponse(res, 429, message || 'Too many requests');
58 }
59
60 public fail(res: Response, error: Error | string) {
61 console.log(error);
62 return res.status(500).json({
63 message: error.toString(),
64 });
65 }
66}