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.6KB

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