A social knowledge tool for researchers built on ATProto
at development 1.8 kB view raw
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}