Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

validate-session.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. 'use strict'
  2. const Joi = require('joi')
  3. const pluginConfig = {
  4. handlerType: 'jwt',
  5. docs: {
  6. get: {
  7. description: 'validates session token for each step of survey',
  8. notes: 'Validates session token for each step of survey',
  9. },
  10. },
  11. }
  12. const validators = {
  13. payload: Joi.string(),
  14. }
  15. module.exports = {
  16. method: 'POST',
  17. path: '/validate-session',
  18. options: {
  19. ...pluginConfig.docs.get,
  20. tags: ['api'],
  21. auth: false,
  22. cors: {
  23. headers: ['Authorization', 'Content-Type'],
  24. exposedHeaders: ['Authorization', 'Access-Control-Expose-Headers'],
  25. },
  26. handler: async function (request, h) {
  27. const hashedSessionToken = request.payload
  28. const { userService, profileService } = request.server.services()
  29. try {
  30. if (!hashedSessionToken) {
  31. throw new Error('hashedSessionToken not passed!')
  32. }
  33. const userSession =
  34. userService.activeSessions[hashedSessionToken]
  35. if (!userSession) {
  36. throw new Error(
  37. 'hashedSessionToken not in activeSessions registry!',
  38. )
  39. }
  40. if (!userSession.emailWasRespondedTo) {
  41. throw new Error(
  42. `Email was never responded to! ${userSession.emailWasRespondedTo}`,
  43. )
  44. }
  45. if (!userSession.sessionToken) {
  46. throw new Error(
  47. `No session token in userSession ${userSession.sessionToken}`,
  48. )
  49. }
  50. const sessionTokenIsValid = userService.validateToken(
  51. userSession.sessionToken,
  52. )
  53. const validatedSessionInfo = sessionTokenIsValid
  54. ? userSession
  55. : { ...sessionTokenIsValid.payload }
  56. if (validatedSessionInfo?.email)
  57. throw new Error(
  58. `Could not validate token based on payload: ${request.payload}`,
  59. )
  60. const user = await userService.findByUserEmail(
  61. validatedSessionInfo.email,
  62. )
  63. const type = user.is_poster === 1 ? 'poster' : 'seeker'
  64. const profiles = await profileService.getCompleteProfilesFor(
  65. user.user_id,
  66. type,
  67. )
  68. // TODO: handle user with multiple profiles...
  69. const profileId = profiles[0].profile_id
  70. return {
  71. ok: true,
  72. handler: pluginConfig.handlerType,
  73. data: {
  74. ...validatedSessionInfo,
  75. profileId: profileId,
  76. },
  77. }
  78. } catch (err) {
  79. return {
  80. ok: false,
  81. handler: pluginConfig.handlerType,
  82. data: { error: err.message },
  83. }
  84. }
  85. },
  86. validate: {
  87. ...validators,
  88. failAction: 'log',
  89. },
  90. response: {
  91. schema: Joi.object({
  92. ok: Joi.bool(),
  93. handler: Joi.string(),
  94. data: Joi.object(),
  95. }).label('validate_session_res'),
  96. failAction: 'log',
  97. },
  98. },
  99. }