AdminController.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { ControllerContainerInterface, Username } from '@standardnotes/domain-core'
  2. import { SettingName } from '@standardnotes/settings'
  3. import { Request } from 'express'
  4. import { inject } from 'inversify'
  5. import {
  6. BaseHttpController,
  7. controller,
  8. httpDelete,
  9. httpGet,
  10. httpPost,
  11. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  12. results,
  13. } from 'inversify-express-utils'
  14. import TYPES from '../Bootstrap/Types'
  15. import { CreateOfflineSubscriptionToken } from '../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
  16. import { CreateSubscriptionToken } from '../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
  17. import { DeleteSetting } from '../Domain/UseCase/DeleteSetting/DeleteSetting'
  18. import { UserRepositoryInterface } from '../Domain/User/UserRepositoryInterface'
  19. @controller('/admin')
  20. export class AdminController extends BaseHttpController {
  21. constructor(
  22. @inject(TYPES.Auth_DeleteSetting) private doDeleteSetting: DeleteSetting,
  23. @inject(TYPES.Auth_UserRepository) private userRepository: UserRepositoryInterface,
  24. @inject(TYPES.Auth_CreateSubscriptionToken) private createSubscriptionToken: CreateSubscriptionToken,
  25. @inject(TYPES.Auth_CreateOfflineSubscriptionToken)
  26. private createOfflineSubscriptionToken: CreateOfflineSubscriptionToken,
  27. @inject(TYPES.Auth_ControllerContainer) private controllerContainer: ControllerContainerInterface,
  28. ) {
  29. super()
  30. this.controllerContainer.register('admin.getUser', this.getUser.bind(this))
  31. this.controllerContainer.register('admin.deleteMFASetting', this.deleteMFASetting.bind(this))
  32. this.controllerContainer.register('admin.createToken', this.createToken.bind(this))
  33. this.controllerContainer.register('admin.createOfflineToken', this.createOfflineToken.bind(this))
  34. this.controllerContainer.register('admin.disableEmailBackups', this.disableEmailBackups.bind(this))
  35. }
  36. @httpGet('/user/:email')
  37. async getUser(request: Request): Promise<results.JsonResult> {
  38. const usernameOrError = Username.create(request.params.email ?? '')
  39. if (usernameOrError.isFailed()) {
  40. return this.json(
  41. {
  42. error: {
  43. message: 'Missing email parameter.',
  44. },
  45. },
  46. 400,
  47. )
  48. }
  49. const username = usernameOrError.getValue()
  50. const user = await this.userRepository.findOneByUsernameOrEmail(username)
  51. if (!user) {
  52. return this.json(
  53. {
  54. error: {
  55. message: `No user with email '${username.value}'.`,
  56. },
  57. },
  58. 400,
  59. )
  60. }
  61. return this.json({
  62. uuid: user.uuid,
  63. })
  64. }
  65. @httpDelete('/users/:userUuid/mfa')
  66. async deleteMFASetting(request: Request): Promise<results.JsonResult> {
  67. const { userUuid } = request.params
  68. const { uuid, updatedAt } = request.body
  69. const result = await this.doDeleteSetting.execute({
  70. uuid,
  71. userUuid,
  72. settingName: SettingName.NAMES.MfaSecret,
  73. timestamp: updatedAt,
  74. softDelete: true,
  75. })
  76. if (result.success) {
  77. return this.json(result)
  78. }
  79. return this.json(result, 400)
  80. }
  81. @httpPost('/users/:userUuid/subscription-token')
  82. async createToken(request: Request): Promise<results.JsonResult> {
  83. const { userUuid } = request.params
  84. const result = await this.createSubscriptionToken.execute({
  85. userUuid,
  86. })
  87. return this.json({
  88. token: result.subscriptionToken.token,
  89. })
  90. }
  91. @httpPost('/users/:email/offline-subscription-token')
  92. async createOfflineToken(request: Request): Promise<results.JsonResult | results.BadRequestResult> {
  93. const { email } = request.params
  94. const result = await this.createOfflineSubscriptionToken.execute({
  95. userEmail: email,
  96. })
  97. if (!result.success) {
  98. return this.badRequest()
  99. }
  100. return this.json({
  101. token: result.offlineSubscriptionToken.token,
  102. })
  103. }
  104. @httpPost('/users/:userUuid/email-backups')
  105. async disableEmailBackups(request: Request): Promise<results.BadRequestErrorMessageResult | results.OkResult> {
  106. const { userUuid } = request.params
  107. const result = await this.doDeleteSetting.execute({
  108. userUuid,
  109. settingName: SettingName.NAMES.EmailBackupFrequency,
  110. })
  111. if (result.success) {
  112. return this.ok()
  113. }
  114. return this.badRequest('No email backups found')
  115. }
  116. }