Files

63 lines
1.8 KiB
Swift

import Fluent
import Vapor
struct UserController: RouteCollection {
func boot(routes: any RoutesBuilder) throws {
let users = routes.grouped("users")
users.get(use: self.index)
users.post(use: self.create)
users.group(":userID") { user in
user.get(use: show)
user.put(use: update)
user.delete(use: self.delete)
}
}
@Sendable
func index(req: Request) async throws -> [UserDTO] {
try await User.query(on: req.db).all().map { $0.toDTO() }
}
@Sendable
func create(req: Request) async throws -> UserDTO {
let user = try req.content.decode(UserDTO.self).toModel()
try await user.save(on: req.db)
return user.toDTO()
}
@Sendable
func show(req: Request) async throws -> UserDTO {
guard let user = try await User.find(req.parameters.get("userID"), on: req.db) else {
throw Abort(.notFound)
}
return user.toDTO()
}
@Sendable
func update(req: Request) async throws -> UserDTO {
guard let user = try await User.find(req.parameters.get("userID"), on: req.db) else {
throw Abort(.notFound)
}
let updatedUser = try req.content.decode(User.self)
user.username = updatedUser.username
user.email = updatedUser.email
user.password = updatedUser.password
user.group = updatedUser.group
user.isSuperuser = updatedUser.isSuperuser
try await user.save(on: req.db)
return user.toDTO()
}
@Sendable
func delete(req: Request) async throws -> HTTPStatus {
guard let user = try await User.find(req.parameters.get("userID"), on: req.db) else {
throw Abort(.notFound)
}
try await user.delete(on: req.db)
return .noContent
}
}