Advertisement
Guest User

Untitled

a guest
Mar 9th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.09 KB | None | 0 0
  1. const db = require('../database')
  2. const Errors = require('../common/errors')
  3. const crypto = require('../common/crypto')
  4. const Mailers = require('../mailers')
  5. const Mailing = require('../helpers/mailing')
  6. const Status = require('../models/user-status')
  7. const ActivitiesService = require('./activities-service')
  8. const ResponseBuilder = require('./response-builders/user-response')
  9. const UserValidator = require('../validation/model/user')
  10.  
  11. async function getUserBySlug(slug) {
  12. const user = await db.User.findOne({
  13. where: {
  14. slug,
  15. emailConfirmedAt: { $ne: null },
  16. status: Status.ACTIVE,
  17. },
  18. include: [
  19. {
  20. model: db.Board.scope('active'),
  21. as: 'boards',
  22. required: false,
  23. include: [
  24. { model: db.Item, as: 'items', through: { as: 'boardItem' } },
  25. ],
  26. },
  27. ],
  28. order: [
  29. [
  30. { model: db.Board, as: 'boards' },
  31. 'position',
  32. 'ASC',
  33. ],
  34. [
  35. { model: db.Board, as: 'boards' },
  36. { model: db.Item, as: 'items' },
  37. 'position',
  38. 'ASC',
  39. ],
  40. ],
  41. })
  42.  
  43. if (!user) {
  44. throw new Errors.RecordNotFoundError('User does not exist')
  45. }
  46.  
  47. return user
  48. }
  49.  
  50. module.exports = {
  51. async showUser(slug) {
  52. const user = await getUserBySlug(slug)
  53.  
  54. return {
  55. user: ResponseBuilder.profile(user),
  56. }
  57. },
  58.  
  59. async register(data) {
  60. await UserValidator.validateData(data)
  61.  
  62. const user = await db.User.create(Object.assign(data, {
  63. status: Status.PENDING_EMAIL,
  64. }))
  65. Mailing.send(Mailers.UserMailer.confirmEmail(user))
  66.  
  67. return ResponseBuilder.signedUser(user)
  68. },
  69.  
  70. async signIn(data) {
  71. const user = await db.User.findOne({
  72. where: {
  73. email: data.email,
  74. },
  75. })
  76.  
  77. if (user && await crypto.comparePasswords(data.password, user.password)) {
  78. return ResponseBuilder.signedUser(user)
  79. }
  80.  
  81. throw new Errors.BadRequestError('User could not be signed in')
  82. },
  83.  
  84. async confirmEmail(id, data) {
  85. const user = await db.User.findOne({
  86. where: {
  87. id,
  88. emailConfirmationToken: data.emailConfirmationToken,
  89. emailConfirmedAt: { $eq: null },
  90. status: Status.PENDING_EMAIL,
  91. },
  92. })
  93.  
  94. if (user) {
  95. await user.update({
  96. emailConfirmationToken: null,
  97. emailConfirmedAt: new Date(),
  98. status: Status.PENDING_USERNAME,
  99. })
  100. return ResponseBuilder.signedUser(user)
  101. }
  102.  
  103. throw new Errors.BadRequestError('Email could not be confirmed')
  104. },
  105.  
  106. async requestPasswordReset(data) {
  107. const user = await db.User.findOne({ where: { email: data.email } })
  108.  
  109. if (!user) {
  110. throw new Errors.RecordNotFoundError(`User with email ${data.email} does not exist`)
  111. }
  112.  
  113. const passwordResetToken = await crypto.generateCommonToken()
  114.  
  115. await user.update({
  116. passwordResetToken,
  117. })
  118.  
  119. Mailing.send(Mailers.UserMailer.resetPassword(user))
  120. },
  121.  
  122. async setNewPassword(data) {
  123. const user = await db.User.findOne({
  124. where: {
  125. passwordResetToken: data.passwordResetToken,
  126. },
  127. })
  128.  
  129. if (user) {
  130. const password = await crypto.hashPassword(data.password)
  131.  
  132. await user.update({
  133. password,
  134. passwordResetToken: null,
  135. })
  136.  
  137. return ResponseBuilder.signedUser(user)
  138. }
  139.  
  140. throw new Errors.BadRequestError('Password could not be changed')
  141. },
  142.  
  143. async setUsername(id, data) {
  144. const user = await db.User.findOne({
  145. where: {
  146. id,
  147. status: Status.PENDING_USERNAME,
  148. },
  149. })
  150.  
  151. if (!user) {
  152. const msg = `User with id ${id} and status ${Status.PENDING_USERNAME} does not exist`
  153.  
  154. throw new Errors.RecordNotFoundError(msg)
  155. }
  156.  
  157. await UserValidator.validateData(data, id)
  158.  
  159. await user.update(Object.assign(data, {
  160. status: Status.ACTIVE,
  161. }))
  162.  
  163. ActivitiesService.create(user, user.id)
  164.  
  165. return ResponseBuilder.signedUser(user)
  166. },
  167.  
  168. async updateUser(data, user) {
  169. await user.update(data)
  170.  
  171. return ResponseBuilder.signedUser(user)
  172. },
  173.  
  174. async authFromFacebook(facebookUser) {
  175. const facebookIdMatchUser = await db.User.findOne({ where: { facebookId: facebookUser.id } })
  176. if (facebookIdMatchUser) {
  177. return ResponseBuilder.signedUser(facebookIdMatchUser)
  178. }
  179.  
  180. const emailMatchUser = await db.User.findOne({ where: { email: facebookUser.email } })
  181. if (emailMatchUser) {
  182. const data = { facebookId: facebookUser.id }
  183.  
  184. if (emailMatchUser.status === Status.PENDING_EMAIL) {
  185. data.status = Status.PENDING_USERNAME
  186. data.emailConfirmationToken = null
  187. data.emailConfirmedAt = new Date()
  188. }
  189.  
  190. await emailMatchUser.update(data)
  191.  
  192. return ResponseBuilder.signedUser(emailMatchUser)
  193. }
  194.  
  195. // random password
  196. const password = await crypto.generateCommonToken()
  197.  
  198. const user = await db.User.create({
  199. email: facebookUser.email,
  200. name: [facebookUser.first_name, facebookUser.last_name].join(' '),
  201. password,
  202. facebookId: facebookUser.id,
  203. status: Status.PENDING_USERNAME,
  204. emailConfirmationToken: null,
  205. emailConfirmedAt: new Date(),
  206. })
  207.  
  208. return ResponseBuilder.signedUser(user)
  209. },
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement