diff --git a/Sources/Grodt/Application/routes.swift b/Sources/Grodt/Application/routes.swift index 1594da3..8dde3c2 100644 --- a/Sources/Grodt/Application/routes.swift +++ b/Sources/Grodt/Application/routes.swift @@ -41,6 +41,8 @@ func routes(_ app: Application) async throws { let investmentsController = InvestmentController(portfolioRepository: portfolioRepository, dataMapper: investmentDTOMapper) + let accountController = AccountController(userRepository: PostgresUserRepository(database: app.db), dataMapper: UserDTOMapper()) + let globalRateLimiter = RateLimiterMiddleware(maxRequests: 100, perSeconds: 60) let loginRateLimiter = RateLimiterMiddleware(maxRequests: 3, perSeconds: 60) @@ -75,6 +77,7 @@ func routes(_ app: Application) async throws { try routeBuilder.register(collection: tickersController) try routeBuilder.register(collection: investmentsController) + try routeBuilder.register(collection: accountController) } if app.environment != .testing { diff --git a/Sources/Grodt/Controllers/AccountController.swift b/Sources/Grodt/Controllers/AccountController.swift new file mode 100644 index 0000000..cfdb753 --- /dev/null +++ b/Sources/Grodt/Controllers/AccountController.swift @@ -0,0 +1,34 @@ +import Vapor +import Fluent + +struct AccountController: RouteCollection { + private let userRepository: UserRepository + private let dataMapper: UserDTOMapper + + init(userRepository: UserRepository, + dataMapper: UserDTOMapper) { + self.userRepository = userRepository + self.dataMapper = dataMapper + } + + func boot(routes: Vapor.RoutesBuilder) throws { + let account = routes.grouped("account") + account.group("me") { me in + me.get(use: userInfo) + } + } + + func userInfo(req: Request) async throws -> UserInfoDTO { + guard let userID = req.auth.get(User.self)?.id else { + throw Abort(.badRequest) + } + + guard let user = try await userRepository.user(for: userID) else { + throw Abort(.notFound) + } + + return dataMapper.userInfo(from: user) + } +} + +extension UserInfoDTO: Content { } diff --git a/Sources/Grodt/DTOs/DTOMappers/UserDTOMapper.swift b/Sources/Grodt/DTOs/DTOMappers/UserDTOMapper.swift new file mode 100644 index 0000000..144991a --- /dev/null +++ b/Sources/Grodt/DTOs/DTOMappers/UserDTOMapper.swift @@ -0,0 +1,5 @@ +class UserDTOMapper { + func userInfo(from user: User) -> UserInfoDTO { + return UserInfoDTO(name: user.name, email: user.email) + } +} diff --git a/Sources/Grodt/DTOs/UserInfoDTO.swift b/Sources/Grodt/DTOs/UserInfoDTO.swift new file mode 100644 index 0000000..db19217 --- /dev/null +++ b/Sources/Grodt/DTOs/UserInfoDTO.swift @@ -0,0 +1,6 @@ +import Foundation + +struct UserInfoDTO: Codable, Equatable { + let name: String + let email: String +}