UsersController.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import { Request, Response } from 'express'
  2. import { inject } from 'inversify'
  3. import {
  4. all,
  5. BaseHttpController,
  6. controller,
  7. httpDelete,
  8. httpGet,
  9. httpPatch,
  10. httpPost,
  11. httpPut,
  12. results,
  13. } from 'inversify-express-utils'
  14. import { Logger } from 'winston'
  15. import { TYPES } from '../../Bootstrap/Types'
  16. import { ServiceProxyInterface } from '../../Service/Http/ServiceProxyInterface'
  17. import { TokenAuthenticationMethod } from '../TokenAuthenticationMethod'
  18. import { EndpointResolverInterface } from '../../Service/Resolver/EndpointResolverInterface'
  19. @controller('/v1/users')
  20. export class UsersController extends BaseHttpController {
  21. constructor(
  22. @inject(TYPES.ApiGateway_ServiceProxy) private httpService: ServiceProxyInterface,
  23. @inject(TYPES.ApiGateway_EndpointResolver) private endpointResolver: EndpointResolverInterface,
  24. @inject(TYPES.ApiGateway_Logger) private logger: Logger,
  25. ) {
  26. super()
  27. }
  28. @httpPost('/claim-account')
  29. async claimAccount(request: Request, response: Response): Promise<void> {
  30. await this.httpService.callPaymentsServer(request, response, 'api/pro_users/claim-account', request.body)
  31. }
  32. @httpPost('/send-activation-code', TYPES.ApiGateway_SubscriptionTokenAuthMiddleware)
  33. async sendActivationCode(request: Request, response: Response): Promise<void> {
  34. await this.httpService.callPaymentsServer(request, response, 'api/pro_users/send-activation-code', request.body)
  35. }
  36. @httpPatch('/:userId', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  37. async updateUser(request: Request, response: Response): Promise<void> {
  38. await this.httpService.callAuthServer(
  39. request,
  40. response,
  41. this.endpointResolver.resolveEndpointOrMethodIdentifier('PATCH', 'users/:userId', request.params.userId),
  42. request.body,
  43. )
  44. }
  45. @httpPut('/:userUuid/password', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  46. async changePassword(request: Request, response: Response): Promise<void> {
  47. this.logger.debug(
  48. '[DEPRECATED] use endpoint /v1/users/:userUuid/attributes/credentials instead of /v1/users/:userUuid/password',
  49. )
  50. await this.httpService.callAuthServer(
  51. request,
  52. response,
  53. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  54. 'PUT',
  55. 'users/:userUuid/attributes/credentials',
  56. request.params.userUuid,
  57. ),
  58. request.body,
  59. )
  60. }
  61. @httpPut('/:userUuid/attributes/credentials', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  62. async changeCredentials(request: Request, response: Response): Promise<void> {
  63. await this.httpService.callAuthServer(
  64. request,
  65. response,
  66. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  67. 'PUT',
  68. 'users/:userUuid/attributes/credentials',
  69. request.params.userUuid,
  70. ),
  71. request.body,
  72. )
  73. }
  74. @httpGet('/:userId/params', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  75. async getKeyParams(request: Request, response: Response): Promise<void> {
  76. await this.httpService.callAuthServer(
  77. request,
  78. response,
  79. this.endpointResolver.resolveEndpointOrMethodIdentifier('GET', 'auth/params'),
  80. )
  81. }
  82. @all('/:userId/mfa', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  83. async blockMFA(): Promise<results.StatusCodeResult> {
  84. return this.statusCode(401)
  85. }
  86. @httpPost('/:userUuid/integrations/listed', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  87. async createListedAccount(request: Request, response: Response): Promise<void> {
  88. await this.httpService.callAuthServer(
  89. request,
  90. response,
  91. this.endpointResolver.resolveEndpointOrMethodIdentifier('POST', 'listed'),
  92. request.body,
  93. )
  94. }
  95. @httpPost('/')
  96. async register(request: Request, response: Response): Promise<void> {
  97. await this.httpService.callAuthServer(
  98. request,
  99. response,
  100. this.endpointResolver.resolveEndpointOrMethodIdentifier('POST', 'auth'),
  101. request.body,
  102. )
  103. }
  104. @httpGet('/:userUuid/settings', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  105. async listSettings(request: Request, response: Response): Promise<void> {
  106. await this.httpService.callAuthServer(
  107. request,
  108. response,
  109. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  110. 'GET',
  111. 'users/:userUuid/settings',
  112. request.params.userUuid,
  113. ),
  114. )
  115. }
  116. @httpPut('/:userUuid/settings', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  117. async putSetting(request: Request, response: Response): Promise<void> {
  118. await this.httpService.callAuthServer(
  119. request,
  120. response,
  121. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  122. 'PUT',
  123. 'users/:userUuid/settings',
  124. request.params.userUuid,
  125. ),
  126. request.body,
  127. )
  128. }
  129. @httpGet('/:userUuid/settings/:settingName', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  130. async getSetting(request: Request, response: Response): Promise<void> {
  131. await this.httpService.callAuthServer(
  132. request,
  133. response,
  134. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  135. 'GET',
  136. 'users/:userUuid/settings/:settingName',
  137. request.params.userUuid,
  138. request.params.settingName,
  139. ),
  140. )
  141. }
  142. @httpDelete('/:userUuid/settings/:settingName', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  143. async deleteSetting(request: Request, response: Response): Promise<void> {
  144. await this.httpService.callAuthServer(
  145. request,
  146. response,
  147. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  148. 'DELETE',
  149. 'users/:userUuid/settings/:settingName',
  150. request.params.userUuid,
  151. request.params.settingName,
  152. ),
  153. request.body,
  154. )
  155. }
  156. @httpGet(
  157. '/:userUuid/subscription-settings/:subscriptionSettingName',
  158. TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware,
  159. )
  160. async getSubscriptionSetting(request: Request, response: Response): Promise<void> {
  161. await this.httpService.callAuthServer(
  162. request,
  163. response,
  164. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  165. 'GET',
  166. 'users/:userUuid/subscription-settings/:subscriptionSettingName',
  167. request.params.userUuid,
  168. request.params.subscriptionSettingName,
  169. ),
  170. )
  171. }
  172. @httpGet('/:userUuid/features', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  173. async getFeatures(request: Request, response: Response): Promise<void> {
  174. await this.httpService.callAuthServer(
  175. request,
  176. response,
  177. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  178. 'GET',
  179. 'users/:userUuid/features',
  180. request.params.userUuid,
  181. ),
  182. )
  183. }
  184. @httpGet('/:userUuid/subscription', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  185. async getSubscription(request: Request, response: Response): Promise<void> {
  186. await this.httpService.callAuthServer(
  187. request,
  188. response,
  189. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  190. 'GET',
  191. 'users/:userUuid/subscription',
  192. request.params.userUuid,
  193. ),
  194. )
  195. }
  196. @httpGet('/subscription', TYPES.ApiGateway_SubscriptionTokenAuthMiddleware)
  197. async getSubscriptionBySubscriptionToken(request: Request, response: Response): Promise<void> {
  198. if (response.locals.tokenAuthenticationMethod === TokenAuthenticationMethod.OfflineSubscriptionToken) {
  199. await this.httpService.callAuthServer(
  200. request,
  201. response,
  202. this.endpointResolver.resolveEndpointOrMethodIdentifier('GET', 'offline/users/subscription'),
  203. )
  204. return
  205. }
  206. await this.httpService.callAuthServer(
  207. request,
  208. response,
  209. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  210. 'GET',
  211. 'users/:userUuid/subscription',
  212. response.locals.user.uuid,
  213. ),
  214. )
  215. }
  216. @httpDelete('/:userUuid', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  217. async deleteUser(request: Request, response: Response): Promise<void> {
  218. await this.httpService.callAuthServer(
  219. request,
  220. response,
  221. this.endpointResolver.resolveEndpointOrMethodIdentifier('DELETE', 'users/:userUuid', request.params.userUuid),
  222. )
  223. }
  224. @httpPost('/:userUuid/requests', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
  225. async submitRequest(request: Request, response: Response): Promise<void> {
  226. await this.httpService.callAuthServer(
  227. request,
  228. response,
  229. this.endpointResolver.resolveEndpointOrMethodIdentifier(
  230. 'POST',
  231. 'users/:userUuid/requests',
  232. request.params.userUuid,
  233. ),
  234. request.body,
  235. )
  236. }
  237. }