Skip to content

Instantly share code, notes, and snippets.

View timbaev's full-sized avatar
💭
📱

Timur Shafigullin timbaev

💭
📱
View GitHub Profile
struct AccessDto: Content {
let refreshToken: String
let accessToken: String
let expiredAt: Date
}
extension User {
var todos: Children<User, Todo> {
return self.children(\.userID)
}
var refreshTokens: Children<User, RefreshToken> {
return self.children(\.userID)
}
}
import Vapor
import FluentSQLite
final class RefreshToken: SQLiteModel {
fileprivate enum Constants {
static let refreshTokenTime: TimeInterval = 60 * 24 * 60 * 60
}
var id: Int?
/// Generate new Refresh Token
class func createRefreshToken() -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0 ... 40).map { _ in letters.randomElement()! })
}
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)
enum ProjectServices {
static let userService: UserService = DefaultUserService()
static let todoService: TodoService = DefaultTodoService()
}
import Vapor
final class TodoController {
fileprivate var todoService: TodoService
init(todoService: TodoService) {
self.todoService = todoService
}
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))
}
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>
}
import Vapor
struct TodoDto: Content {
let id: Int?
let title: String
}