Guest User

Untitled

a guest
Jul 10th, 2018
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. //
  2. // UserController.swift
  3. // userAuth
  4. //
  5. // Created by Mickaël Cruz on 05/07/2018.
  6. //
  7.  
  8. import Foundation
  9. import Vapor
  10. import Fluent
  11. import FluentSQLite
  12. import Crypto
  13. import MailCore
  14.  
  15. class UserController: RouteCollection {
  16. //1
  17. func boot(router: Router) throws {
  18. let usersRoute = router.grouped("api", "users")
  19. usersRoute.post(User.self, at: "register", use: registerUserHandler)
  20.  
  21. let basicAuthMiddleware = User.basicAuthMiddleware(using: BCryptDigest())
  22. let basicAuthGroup = router.grouped(basicAuthMiddleware)
  23. basicAuthGroup.post(User.self, at:"login", use: loginUserHandler)
  24. }
  25. }
  26.  
  27. //MARK: Helper
  28. private extension UserController {
  29.  
  30. func registerUserHandler(_ request: Request, newUser: User) throws -> Future<Response> {
  31.  
  32. //2
  33. return User.query(on: request).filter(\.email == newUser.email).first().flatMap { existingUser in
  34.  
  35. //3
  36. guard existingUser == nil else {
  37. throw Abort(.badRequest, reason: "a user with this email already exists" , identifier: nil)
  38. }
  39.  
  40. //4
  41. let digest = try request.make(BCryptDigest.self)
  42. let hashedPassword = try digest.hash(newUser.password)
  43. let persistedUser = User(id: nil, email: newUser.email, password: hashedPassword)
  44.  
  45. let mail = Mailer.Message(from: "cruz.mickael@gmail.com", to: "cruz.mickael@gmail.com", subject: "Oil spill", text: "Oooops I did it again", html: "<p>Oooops I did it again</p>")
  46.  
  47. return try request.mail.send(mail).flatMap(to: Response.self) { mailResult in
  48. print(mailResult)
  49.  
  50. //6 We save and we redirect to login page
  51. return persistedUser.save(on: request).transform(to: request.redirect(to: "/api/users/login"))
  52. }
  53.  
  54.  
  55. }
  56. }
  57.  
  58. func loginUserHandler(_ req: Request, userData: User) throws -> Future<Response> {
  59. return User.authenticate(username: userData.username, password: userData.password, using: BCryptDigest(), on: req).map(to: Response.self) { user in
  60. guard let user = user else {
  61. return req.redirect(to: "/login")
  62. }
  63. try req.authenticateSession(user)
  64. return req.redirect(to: "/")
  65. }
  66. }
  67. }
Add Comment
Please, Sign In to add comment