databases.controller.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { NextFunction, Request, Response, Router } from 'express';
  2. import { dtoValidationMiddleware } from '../middleware/validation';
  3. import { DatabasesService } from './databases.service';
  4. import { DatabaseNameDto, DatabasePropertiesDto } from './dto';
  5. import { DatabaseObject } from '../types';
  6. export class DatabasesController {
  7. private databasesService: DatabasesService;
  8. private router: Router;
  9. constructor() {
  10. this.databasesService = new DatabasesService();
  11. this.router = Router();
  12. }
  13. get databasesServiceGetter() {
  14. return this.databasesService;
  15. }
  16. generateRoutes() {
  17. this.router.get('/', this.listDatabases.bind(this));
  18. this.router.post(
  19. '/',
  20. dtoValidationMiddleware(DatabaseNameDto),
  21. this.createDatabase.bind(this)
  22. );
  23. this.router.get('/:db_name', this.describeDatabase.bind(this));
  24. this.router.delete('/:db_name', this.dropDatabase.bind(this));
  25. this.router.put('/:db_name/properties', this.alterDatabase.bind(this));
  26. return this.router;
  27. }
  28. async createDatabase(
  29. req: Request<{}, {}, DatabaseNameDto>,
  30. res: Response,
  31. next: NextFunction
  32. ) {
  33. try {
  34. const result = await this.databasesService.createDatabase(
  35. req.clientId,
  36. req.body
  37. );
  38. res.send(result);
  39. } catch (error) {
  40. next(error);
  41. }
  42. }
  43. async listDatabases(req: Request, res: Response, next: NextFunction) {
  44. try {
  45. const result = await this.databasesService.listDatabase(req.clientId);
  46. const defaultDb = result.find(
  47. (db: DatabaseObject) => db.name === 'default'
  48. );
  49. const otherDbs = result
  50. .filter((db: DatabaseObject) => db.name !== 'default')
  51. .sort((a: DatabaseObject, b: DatabaseObject) => {
  52. return Number(b.created_timestamp) - Number(a.created_timestamp);
  53. });
  54. const sortedResult = defaultDb ? [defaultDb, ...otherDbs] : otherDbs;
  55. res.send(sortedResult);
  56. } catch (error) {
  57. next(error);
  58. }
  59. }
  60. async dropDatabase(
  61. req: Request<DatabaseNameDto>,
  62. res: Response,
  63. next: NextFunction
  64. ) {
  65. try {
  66. const result = await this.databasesService.dropDatabase(req.clientId, {
  67. db_name: req.params.db_name,
  68. });
  69. res.send(result);
  70. } catch (error) {
  71. next(error);
  72. }
  73. }
  74. async describeDatabase(
  75. req: Request<DatabaseNameDto>,
  76. res: Response,
  77. next: NextFunction
  78. ) {
  79. try {
  80. const result = await this.databasesService.describeDatabase(
  81. req.clientId,
  82. {
  83. db_name: req.params.db_name,
  84. }
  85. );
  86. res.send(result);
  87. } catch (error) {
  88. next(error);
  89. }
  90. }
  91. async alterDatabase(
  92. req: Request<DatabaseNameDto, {}, DatabasePropertiesDto>,
  93. res: Response,
  94. next: NextFunction
  95. ) {
  96. const { properties } = req.body;
  97. try {
  98. const result = await this.databasesService.alterDatabase(req.clientId, {
  99. db_name: req.params.db_name,
  100. properties,
  101. });
  102. res.send(result);
  103. } catch (error) {
  104. next(error);
  105. }
  106. }
  107. }