Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // UserController.swift
- // userAuth
- //
- // Created by Mickaël Cruz on 05/07/2018.
- //
- import Foundation
- import Vapor
- import Fluent
- import FluentSQLite
- import Crypto
- import MailCore
- class UserController: RouteCollection {
- //1
- func boot(router: Router) throws {
- let usersRoute = router.grouped("api", "users")
- usersRoute.post(User.self, at: "register", use: registerUserHandler)
- let basicAuthMiddleware = User.basicAuthMiddleware(using: BCryptDigest())
- let basicAuthGroup = router.grouped(basicAuthMiddleware)
- basicAuthGroup.post(User.self, at:"login", use: loginUserHandler)
- }
- }
- //MARK: Helper
- private extension UserController {
- func registerUserHandler(_ request: Request, newUser: User) throws -> Future<Response> {
- //2
- return User.query(on: request).filter(\.email == newUser.email).first().flatMap { existingUser in
- //3
- guard existingUser == nil else {
- throw Abort(.badRequest, reason: "a user with this email already exists" , identifier: nil)
- }
- //4
- let digest = try request.make(BCryptDigest.self)
- let hashedPassword = try digest.hash(newUser.password)
- let persistedUser = User(id: nil, email: newUser.email, password: hashedPassword)
- 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>")
- return try request.mail.send(mail).flatMap(to: Response.self) { mailResult in
- print(mailResult)
- //6 We save and we redirect to login page
- return persistedUser.save(on: request).transform(to: request.redirect(to: "/api/users/login"))
- }
- }
- }
- func loginUserHandler(_ req: Request, userData: User) throws -> Future<Response> {
- return User.authenticate(username: userData.username, password: userData.password, using: BCryptDigest(), on: req).map(to: Response.self) { user in
- guard let user = user else {
- return req.redirect(to: "/login")
- }
- try req.authenticateSession(user)
- return req.redirect(to: "/")
- }
- }
- }
Add Comment
Please, Sign In to add comment