Skip to content

Commit e925222

Browse files
authored
Left out from previous PR (#17)
1 parent 57483c8 commit e925222

File tree

10 files changed

+28
-13
lines changed

10 files changed

+28
-13
lines changed

Sources/Grodt/Application/routes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ func routes(_ app: Application) async throws {
101101
performanceRepository: brokerageAccountDailyPerformanceRepository,
102102
performanceDTOMapper: DatedPerformanceDTOMapper(),
103103
currencyMapper: currencyDTOMapper,
104+
transactionDTOMapper: transactionDTOMapper,
104105
currencyRepository: currencyRepository))
105106
}
106107

Sources/Grodt/DTOs/DTOMappers/PortfolioDTOMapper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class PortfolioDTOMapper {
4343
guard portfolio.$historicalDailyPerformance.value != nil,
4444
let latest = portfolio.historicalDailyPerformance.max(by: { $0.date < $1.date })
4545
else {
46-
return PerformanceDTO(moneyIn: 0, moneyOut: 0, profit: 0, totalReturn: 0)
46+
return PerformanceDTO.zero
4747
}
4848

4949
let moneyIn = latest.moneyIn

Sources/Grodt/Endpoints/brokerages/BrokerageAccountController.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@ struct BrokerageAccountController: RouteCollection {
77
private let currencyMapper: CurrencyDTOMapper
88
private let performanceDTOMapper: DatedPerformanceDTOMapper
99
private let currencyRepository: CurrencyRepository
10+
private let transactionDTOMapper: TransactionDTOMapper
1011

1112
init(brokerageAccountRepository: BrokerageAccountRepository,
1213
performanceRepository: PostgresBrokerageAccountDailyPerformanceRepository,
1314
performanceDTOMapper: DatedPerformanceDTOMapper,
1415
currencyMapper: CurrencyDTOMapper,
16+
transactionDTOMapper: TransactionDTOMapper,
1517
currencyRepository: CurrencyRepository) {
1618
self.brokerageAccountRepository = brokerageAccountRepository
1719
self.performanceRepository = performanceRepository
1820
self.performanceDTOMapper = performanceDTOMapper
1921
self.currencyMapper = currencyMapper
22+
self.transactionDTOMapper = transactionDTOMapper
2023
self.currencyRepository = currencyRepository
2124
}
2225

@@ -32,13 +35,13 @@ struct BrokerageAccountController: RouteCollection {
3235
}
3336
}
3437

35-
private func list(req: Request) async throws -> [BrokerageAccountDTO] {
38+
private func list(req: Request) async throws -> [BrokerageAccountInfoDTO] {
3639
let userID = try req.requireUserID()
3740
let items = try await brokerageAccountRepository.all(for: userID)
3841
return try await items.asyncMap { model in
3942
let performance = try await brokerageAccountRepository.performance(for: model.requireID())
4043
let brokerage = try await model.$brokerage.get(on: req.db)
41-
return BrokerageAccountDTO(
44+
return BrokerageAccountInfoDTO(
4245
id: try model.requireID(),
4346
brokerageId: try brokerage.requireID(),
4447
brokerageName: brokerage.name,
@@ -76,20 +79,23 @@ struct BrokerageAccountController: RouteCollection {
7679
brokerageName: brokerage.name,
7780
displayName: model.displayName,
7881
baseCurrency: currencyMapper.currency(from: model.baseCurrency),
79-
performance: PerformanceDTO.zero)
82+
performance: PerformanceDTO.zero,
83+
transacitons: [])
8084
}
8185

8286
private func detail(req: Request) async throws -> BrokerageAccountDTO {
8387
let userID = try req.requireUserID()
8488
let model = try await requireAccount(req, userID: userID)
8589
let brokerage = try await model.$brokerage.get(on: req.db)
90+
let transactions = try await model.$transactions.get(on: req.db)
8691
let performance = try await brokerageAccountRepository.performance(for: model.requireID())
87-
return BrokerageAccountDTO(id: try model.requireID(),
92+
return try await BrokerageAccountDTO(id: try model.requireID(),
8893
brokerageId: try brokerage.requireID(),
8994
brokerageName: brokerage.name,
9095
displayName: model.displayName,
9196
baseCurrency: currencyMapper.currency(from: model.baseCurrency),
92-
performance: performance)
97+
performance: performance,
98+
transacitons: transactions.asyncMap { try await transactionDTOMapper.transaction(from: $0) })
9399
}
94100

95101
private func update(req: Request) async throws -> HTTPStatus {
@@ -131,3 +137,4 @@ struct BrokerageAccountController: RouteCollection {
131137
}
132138

133139
extension BrokerageAccountDTO: Content { }
140+
extension BrokerageAccountInfoDTO: Content { }

Sources/Grodt/Endpoints/brokerages/DTO/BrokerageAccountDTO.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ struct BrokerageAccountDTO: Codable {
77
let displayName: String
88
let baseCurrency: CurrencyDTO
99
let performance: PerformanceDTO
10+
let transacitons: [TransactionDTO]
1011
}

Sources/Grodt/Endpoints/brokerages/DTO/BrokerageAccountDTOMapper.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ struct BrokerageAccountDTOMapper {
1313
self.database = database
1414
}
1515

16-
func brokerageAccount(from brokerageAccount: BrokerageAccount) async throws -> BrokerageAccountDTO {
16+
func brokerageAccountInfo(from brokerageAccount: BrokerageAccount) async throws -> BrokerageAccountInfoDTO {
1717
try await brokerageAccount.$brokerage.load(on: database)
1818
let performance = try await brokerageAccountRepository.performance(for: brokerageAccount.requireID())
1919

20-
return try BrokerageAccountDTO(id: brokerageAccount.requireID(),
20+
return try BrokerageAccountInfoDTO(id: brokerageAccount.requireID(),
2121
brokerageId: brokerageAccount.brokerage.requireID(),
2222
brokerageName: brokerageAccount.brokerage.name,
2323
displayName: brokerageAccount.displayName,

Sources/Grodt/Endpoints/transactions/BrokerageAccountInfoDTO.swift renamed to Sources/Grodt/Endpoints/brokerages/DTO/BrokerageAccountInfoDTO.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ struct BrokerageAccountInfoDTO: Codable, Equatable {
55
let brokerageId: UUID
66
let brokerageName: String
77
let displayName: String
8+
let baseCurrency: CurrencyDTO
9+
let performance: PerformanceDTO
810
}

Sources/Grodt/Endpoints/brokerages/DTO/BrokerageDTO.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import Foundation
33
struct BrokerageDTO: Codable {
44
let id: UUID
55
let name: String
6-
let accounts: [BrokerageAccountDTO]
6+
let accounts: [BrokerageAccountInfoDTO]
77
let performance: PerformanceDTO
88
}

Sources/Grodt/Endpoints/brokerages/DTO/BrokerageDTOMapper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct BrokerageDTOMapper {
1616
func brokerage(from brokerage: Brokerage) async throws -> BrokerageDTO {
1717
try await brokerage.$accounts.load(on: database)
1818
let accountDTOs = try await brokerage.accounts.asyncMap {
19-
try await accountDTOMapper.brokerageAccount(from: $0)
19+
try await accountDTOMapper.brokerageAccountInfo(from: $0)
2020
}
2121
let performance = try await brokerageRepository.performance(for: brokerage.requireID())
2222
return try BrokerageDTO(

Sources/Grodt/Endpoints/transactions/TransactionDTOMapper.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ class TransactionDTOMapper {
1818
brokerageAccount = BrokerageAccountInfoDTO(id: try brokerAcc.requireID(),
1919
brokerageId: try brokerage.requireID(),
2020
brokerageName: brokerAcc.brokerage.name,
21-
displayName: brokerAcc.displayName)
21+
displayName: brokerAcc.displayName,
22+
baseCurrency: currencyDTOMapper.currency(from: brokerAcc.baseCurrency),
23+
performance: PerformanceDTO.zero)
2224
}
25+
let portfolio = try await transaction.$portfolio.get(on: database)
26+
2327
return TransactionDTO(id: transaction.id?.uuidString ?? "",
24-
portfolioName: transaction.portfolio.name,
28+
portfolioName: portfolio.name,
2529
purchaseDate: transaction.purchaseDate,
2630
ticker: transaction.ticker,
2731
currency: currencyDTOMapper.currency(from: transaction.currency),

Tests/GrodtTests/TestConstant.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ enum TestConstant {
1919
}
2020

2121
enum PerformanceDTOs {
22-
static let zero = PerformanceDTO(moneyIn: 0, moneyOut: 0, profit: 0, totalReturn: 0)
22+
static let zero = PerformanceDTO.zero
2323
}
2424

2525
enum Currencies {

0 commit comments

Comments
 (0)