This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Vapor | |
protocol TodoService { | |
func create(request: Request, todoDto: TodoDto) throws -> Future<TodoDto> | |
func fetch(request: Request) throws -> Future<[TodoDto]> | |
func delete(request: Request, todoID: Int) throws -> Future<TodoDto> | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Vapor | |
import FluentSQLite | |
struct DefaultTodoService: TodoService { | |
func create(request: Request, todoDto: TodoDto) throws -> Future<TodoDto> { | |
return try request.authorizedUser().flatMap { user in | |
return Todo(title: todoDto.title, userID: try user.requireID()).save(on: request).flatMap { todo in | |
return request.future(TodoDto(id: try todo.requireID(), title: todo.title)) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Vapor | |
final class TodoController { | |
fileprivate var todoService: TodoService | |
init(todoService: TodoService) { | |
self.todoService = todoService | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
enum ProjectServices { | |
static let userService: UserService = DefaultUserService() | |
static let todoService: TodoService = DefaultTodoService() | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Vapor | |
/// Register your application's routes here. | |
public func routes(_ router: Router) throws { | |
// MARK: - TodoController | |
let todoController = TodoController(todoService: ProjectServices.todoService) | |
try router.register(collection: todoController) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Generate new Refresh Token | |
class func createRefreshToken() -> String { | |
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | |
return String((0 ... 40).map { _ in letters.randomElement()! }) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Vapor | |
import FluentSQLite | |
final class RefreshToken: SQLiteModel { | |
fileprivate enum Constants { | |
static let refreshTokenTime: TimeInterval = 60 * 24 * 60 * 60 | |
} | |
var id: Int? |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension User { | |
var todos: Children<User, Todo> { | |
return self.children(\.userID) | |
} | |
var refreshTokens: Children<User, RefreshToken> { | |
return self.children(\.userID) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct AccessDto: Content { | |
let refreshToken: String | |
let accessToken: String | |
let expiredAt: Date | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func signIn(request: Request, user: User) throws -> Future<AccessDto> { | |
return User | |
.query(on: request) | |
.filter(\.login == user.login) | |
.first() | |
.unwrap(or: Abort(.badRequest, reason: "User with login \(user.login) not found")) | |
.flatMap { persistedUser in | |
let digest = try request.make(BCryptDigest.self) | |
if try digest.verify(user.password, created: persistedUser.password) { |