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 } }