crud-kit/Sources/CrudAPI/Controllers/CrudControllerProtocol.swift

54 lines
1.9 KiB
Swift

import Vapor
import Fluent
protocol CrudControllerProtocol {
associatedtype ModelT: Model & Content where ModelT.IDValue: LosslessStringConvertible
}
extension CrudControllerProtocol {
internal func indexAll(on database: Database) -> EventLoopFuture<[ModelT]> {
ModelT.query(on: database).all()
}
internal func index(_ id: ModelT.IDValue?, on database: Database) -> EventLoopFuture<ModelT> {
ModelT.find(id, on: database).unwrap(or: Abort(.notFound))
}
internal func create(from data: ModelT, on database: Database) -> EventLoopFuture<ModelT> {
data.save(on: database).map { data }
}
internal func replace(_ id: ModelT.IDValue?, from data: ModelT, on database: Database) -> EventLoopFuture<ModelT> {
ModelT.find(id, on: database).unwrap(or: Abort(.notFound))
.flatMap { model in
data.id = model.id
data._$id.exists = true
return data.update(on: database).map { data }
}
}
internal func delete(_ id: ModelT.IDValue?, on database: Database) -> EventLoopFuture<HTTPStatus> {
ModelT.find(id, on: database)
.unwrap(or: Abort(.notFound))
.flatMap { $0.delete(on: database) }
.map { .ok }
}
}
extension CrudControllerProtocol where ModelT: Createable {
internal func create(from data: ModelT.Create, on database: Database) -> EventLoopFuture<ModelT> {
let model = ModelT.init(from: data)
return model.save(on: database).map { model }
}
}
extension CrudControllerProtocol where ModelT: Replaceable {
internal func replace(_ id: ModelT.IDValue?, from data: ModelT.Replace, on database: Database) -> EventLoopFuture<ModelT> {
ModelT.find(id, on: database).unwrap(or: Abort(.notFound))
.flatMap { model in
model.replace(with: data)
return model.update(on: database).map { model }
}
}
}