users.controller.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import { NextFunction, Request, Response, Router } from 'express';
  2. import { dtoValidationMiddleware } from '../middleware/validation';
  3. import { UserService } from './users.service';
  4. import {
  5. CreateUserDto,
  6. UpdateUserDto,
  7. CreateRoleDto,
  8. AssignUserRoleDto,
  9. UnassignUserRoleDto,
  10. } from './dto';
  11. export class UserController {
  12. private router: Router;
  13. private userService: UserService;
  14. constructor() {
  15. this.userService = new UserService();
  16. this.router = Router();
  17. }
  18. generateRoutes() {
  19. // user
  20. this.router.get('/', this.getUsers.bind(this));
  21. this.router.post(
  22. '/',
  23. dtoValidationMiddleware(CreateUserDto),
  24. this.createUsers.bind(this)
  25. );
  26. this.router.put(
  27. '/',
  28. dtoValidationMiddleware(UpdateUserDto),
  29. this.updateUsers.bind(this)
  30. );
  31. this.router.delete('/:username', this.deleteUser.bind(this));
  32. this.router.put(
  33. '/:username/role/update',
  34. dtoValidationMiddleware(AssignUserRoleDto),
  35. this.updateUserRole.bind(this)
  36. );
  37. this.router.put(
  38. '/:username/role/unassign',
  39. dtoValidationMiddleware(UnassignUserRoleDto),
  40. this.unassignUserRole.bind(this)
  41. );
  42. // role
  43. this.router.get('/rbac', this.rbac.bind(this));
  44. this.router.get('/roles', this.getRoles.bind(this));
  45. this.router.post(
  46. '/roles',
  47. dtoValidationMiddleware(CreateRoleDto),
  48. this.createRole.bind(this)
  49. );
  50. this.router.get('/roles/:roleName', this.listGrant.bind(this));
  51. this.router.delete('/roles/:roleName', this.deleteRole.bind(this));
  52. this.router.put(
  53. '/roles/:roleName/updatePrivileges',
  54. this.updateRolePrivileges.bind(this)
  55. );
  56. return this.router;
  57. }
  58. async getUsers(req: Request, res: Response, next: NextFunction) {
  59. try {
  60. const result = await this.userService.getUsers(req.clientId);
  61. res.send(result);
  62. } catch (error) {
  63. next(error);
  64. }
  65. }
  66. async createUsers(req: Request, res: Response, next: NextFunction) {
  67. const { username, password } = req.body;
  68. try {
  69. const result = await this.userService.createUser(req.clientId, {
  70. username,
  71. password,
  72. });
  73. res.send(result);
  74. } catch (error) {
  75. next(error);
  76. }
  77. }
  78. async updateUsers(req: Request, res: Response, next: NextFunction) {
  79. const { username, oldPassword, newPassword } = req.body;
  80. try {
  81. const result = await this.userService.updateUser(req.clientId, {
  82. username,
  83. oldPassword,
  84. newPassword,
  85. });
  86. res.send(result);
  87. } catch (error) {
  88. next(error);
  89. }
  90. }
  91. async deleteUser(req: Request, res: Response, next: NextFunction) {
  92. const { username } = req.params;
  93. try {
  94. const result = await this.userService.deleteUser(req.clientId, {
  95. username,
  96. });
  97. res.send(result);
  98. } catch (error) {
  99. next(error);
  100. }
  101. }
  102. async getRoles(req: Request, res: Response, next: NextFunction) {
  103. try {
  104. const result = (await this.userService.getRoles(req.clientId)) as any;
  105. for (let i = 0; i < result.results.length; i++) {
  106. const { entities } = await this.userService.listGrants(req.clientId, {
  107. roleName: result.results[i].role.name,
  108. });
  109. result.results[i].entities = entities;
  110. }
  111. res.send(result);
  112. } catch (error) {
  113. next(error);
  114. }
  115. }
  116. async createRole(req: Request, res: Response, next: NextFunction) {
  117. const { roleName } = req.body;
  118. try {
  119. const result = await this.userService.createRole(req.clientId, {
  120. roleName,
  121. });
  122. res.send(result);
  123. } catch (error) {
  124. next(error);
  125. }
  126. }
  127. async deleteRole(req: Request, res: Response, next: NextFunction) {
  128. const { roleName } = req.params;
  129. const { force } = req.body;
  130. try {
  131. if (force) {
  132. await this.userService.revokeAllRolePrivileges(req.clientId, {
  133. roleName,
  134. });
  135. }
  136. const result = await this.userService.deleteRole(req.clientId, {
  137. roleName,
  138. });
  139. res.send(result);
  140. } catch (error) {
  141. next(error);
  142. }
  143. }
  144. async updateUserRole(req: Request, res: Response, next: NextFunction) {
  145. const { roles } = req.body;
  146. const { username } = req.params;
  147. const results = [];
  148. try {
  149. // get user existing roles
  150. const selectUser = await this.userService.selectUser(req.clientId, {
  151. username,
  152. includeRoleInfo: false,
  153. });
  154. const existingRoles = selectUser.results[0].roles;
  155. // remove user existing roles
  156. for (let i = 0; i < existingRoles.length; i++) {
  157. if (existingRoles[i].name.length > 0) {
  158. await this.userService.unassignUserRole(req.clientId, {
  159. username,
  160. roleName: existingRoles[i].name,
  161. });
  162. }
  163. }
  164. // assign new user roles
  165. for (let i = 0; i < roles.length; i++) {
  166. const result = await this.userService.assignUserRole(req.clientId, {
  167. username,
  168. roleName: roles[i],
  169. });
  170. results.push(result);
  171. }
  172. res.send(results);
  173. } catch (error) {
  174. next(error);
  175. }
  176. }
  177. async unassignUserRole(req: Request, res: Response, next: NextFunction) {
  178. const { roleName } = req.body;
  179. const { username } = req.params;
  180. try {
  181. const result = await this.userService.unassignUserRole(req.clientId, {
  182. username,
  183. roleName,
  184. });
  185. res.send(result);
  186. } catch (error) {
  187. next(error);
  188. }
  189. }
  190. async rbac(req: Request, res: Response, next: NextFunction) {
  191. try {
  192. const result = await this.userService.getRBAC();
  193. res.send(result);
  194. } catch (error) {
  195. next(error);
  196. }
  197. }
  198. async listGrant(req: Request, res: Response, next: NextFunction) {
  199. const { roleName } = req.params;
  200. try {
  201. const result = await this.userService.listGrants(req.clientId, {
  202. roleName,
  203. });
  204. res.send(result);
  205. } catch (error) {
  206. next(error);
  207. }
  208. }
  209. async updateRolePrivileges(req: Request, res: Response, next: NextFunction) {
  210. const { privileges } = req.body;
  211. const { roleName } = req.params;
  212. const results = [];
  213. try {
  214. // revoke all
  215. await this.userService.revokeAllRolePrivileges(req.clientId, {
  216. roleName,
  217. });
  218. // assign new user roles
  219. for (let i = 0; i < privileges.length; i++) {
  220. const result = await this.userService.grantRolePrivilege(
  221. req.clientId,
  222. privileges[i]
  223. );
  224. results.push(result);
  225. }
  226. res.send(results);
  227. } catch (error) {
  228. next(error);
  229. }
  230. }
  231. }