InversifyExpressSessionsController.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Request, Response } from 'express'
  2. import { inject } from 'inversify'
  3. import {
  4. BaseHttpController,
  5. controller,
  6. httpGet,
  7. httpPost,
  8. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  9. results,
  10. } from 'inversify-express-utils'
  11. import { ControllerContainerInterface } from '@standardnotes/domain-core'
  12. import TYPES from '../../Bootstrap/Types'
  13. import { AuthenticateRequest } from '../../Domain/UseCase/AuthenticateRequest'
  14. import { CreateCrossServiceToken } from '../../Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken'
  15. import { GetActiveSessionsForUser } from '../../Domain/UseCase/GetActiveSessionsForUser'
  16. import { ProjectorInterface } from '../../Projection/ProjectorInterface'
  17. import { SessionProjector } from '../../Projection/SessionProjector'
  18. import { User } from '../../Domain/User/User'
  19. import { Session } from '../../Domain/Session/Session'
  20. @controller('/sessions')
  21. export class InversifyExpressSessionsController extends BaseHttpController {
  22. constructor(
  23. @inject(TYPES.Auth_GetActiveSessionsForUser) private getActiveSessionsForUser: GetActiveSessionsForUser,
  24. @inject(TYPES.Auth_AuthenticateRequest) private authenticateRequest: AuthenticateRequest,
  25. @inject(TYPES.Auth_SessionProjector) private sessionProjector: ProjectorInterface<Session>,
  26. @inject(TYPES.Auth_CreateCrossServiceToken) private createCrossServiceToken: CreateCrossServiceToken,
  27. @inject(TYPES.Auth_ControllerContainer) private controllerContainer: ControllerContainerInterface,
  28. ) {
  29. super()
  30. this.controllerContainer.register('auth.sessions.list', this.getSessions.bind(this))
  31. this.controllerContainer.register('auth.sessions.validate', this.validate.bind(this))
  32. }
  33. @httpPost('/validate')
  34. async validate(request: Request): Promise<results.JsonResult> {
  35. const authenticateRequestResponse = await this.authenticateRequest.execute({
  36. authorizationHeader: request.headers.authorization,
  37. })
  38. if (!authenticateRequestResponse.success) {
  39. return this.json(
  40. {
  41. error: {
  42. tag: authenticateRequestResponse.errorTag,
  43. message: authenticateRequestResponse.errorMessage,
  44. },
  45. },
  46. authenticateRequestResponse.responseCode,
  47. )
  48. }
  49. const user = authenticateRequestResponse.user as User
  50. const result = await this.createCrossServiceToken.execute({
  51. user,
  52. session: authenticateRequestResponse.session,
  53. })
  54. return this.json({ authToken: result.token })
  55. }
  56. @httpGet('/', TYPES.Auth_AuthMiddleware, TYPES.Auth_SessionMiddleware)
  57. async getSessions(_request: Request, response: Response): Promise<results.JsonResult> {
  58. if (response.locals.readOnlyAccess) {
  59. return this.json([])
  60. }
  61. const useCaseResponse = await this.getActiveSessionsForUser.execute({
  62. userUuid: response.locals.user.uuid,
  63. })
  64. return this.json(
  65. useCaseResponse.sessions.map((session) =>
  66. this.sessionProjector.projectCustom(
  67. SessionProjector.CURRENT_SESSION_PROJECTION.toString(),
  68. session,
  69. response.locals.session,
  70. ),
  71. ),
  72. )
  73. }
  74. }