Skip to content

Commit c0dc65e

Browse files
committed
Made switch to ski
1 parent 2c3f38d commit c0dc65e

30 files changed

+413
-290
lines changed

Sources/Grodt/Application/routes.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ func routes(_ app: Application) async throws {
55
let container = try await buildAppContainer(app)
66
installGlobalMiddleware(app)
77
try registerLoginRoutes(app, container)
8-
try registerApiRoutes(app, container)
98
try registerSkiRoutes(app, container)
109
try scheduleNightlyJobs(app, container)
1110
}

Sources/Grodt/Application/routes/routes+Dependencies.swift

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ struct AppContainer {
3737
let accountService: AccountService
3838
let brokerageService: BrokerageService
3939
let investmentService: InvestmentService
40+
let transactionService: TransactionService
41+
let tickersService: TickersService
42+
let brokerageAccountsService: BrokerageAccountsService
4043
}
4144

4245
func buildAppContainer(_ app: Application) async throws -> AppContainer {
@@ -114,12 +117,12 @@ func buildAppContainer(_ app: Application) async throws -> AppContainer {
114117
currencyMapper: currencyDTOMapper,
115118
database: app.db
116119
),
120+
performanceRepository: brokerageDailyPerformanceRepository,
121+
performanceDTOMapper: performanceDTOMapper,
117122
database: app.db
118123
),
119124
accounts: brokerageAccountRepository,
120-
currencyMapper: currencyDTOMapper,
121-
performanceRepository: brokerageDailyPerformanceRepository,
122-
performanceDTOMapper: performanceDTOMapper
125+
currencyMapper: currencyDTOMapper
123126
)
124127

125128
let investmentService = InvestmentService(
@@ -131,6 +134,29 @@ func buildAppContainer(_ app: Application) async throws -> AppContainer {
131134
priceService: priceService
132135
)
133136
)
137+
138+
let transactionService = TransactionService(transactionsRepository: transactionRepository,
139+
currencyRepository: currencyRepository,
140+
dataMapper: transactionDTOMapper)
141+
142+
let tickersService = TickersService(
143+
tickerRepository: tickerRepository,
144+
dataMapper: tickerDTOMapper,
145+
tickerService: alphavantage
146+
)
147+
148+
let tickerChangeHandler = TickerChangeHandler(priceService: priceService)
149+
tickersService.delegate = tickerChangeHandler
150+
151+
let brokerageAccountsService = BrokerageAccountsService(
152+
brokerageRepository: brokerageRepository,
153+
brokerageAccountRepository: brokerageAccountRepository,
154+
performanceRepository: brokerageAccountDailyPerformanceRepository,
155+
performanceDTOMapper: performanceDTOMapper,
156+
currencyMapper: currencyDTOMapper,
157+
transactionDTOMapper: transactionDTOMapper,
158+
currencyRepository: currencyRepository
159+
)
134160

135161

136162
return AppContainer(
@@ -158,7 +184,10 @@ func buildAppContainer(_ app: Application) async throws -> AppContainer {
158184
portfolioService: portfolioService,
159185
accountService: accountService,
160186
brokerageService: brokerageService,
161-
investmentService: investmentService
187+
investmentService: investmentService,
188+
transactionService: transactionService,
189+
tickersService: tickersService,
190+
brokerageAccountsService: brokerageAccountsService
162191
)
163192
}
164193

Sources/Grodt/Application/routes/routes+login.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ func registerLoginRoutes(_ app: Application, _ container: AppContainer) throws {
44
let loginRateLimiter = RateLimiterMiddleware(maxRequests: 3, perSeconds: 60)
55
try app
66
.grouped(loginRateLimiter)
7-
.register(collection: UserController(dtoMapper: container.loginResponseDTOMapper))
7+
.register(collection: LoginRoute(dtoMapper: container.loginResponseDTOMapper))
88
}

Sources/Grodt/DTOs/CreateTransactionRequestDTO.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import Foundation
22

33
struct CreateTransactionRequestDTO: Decodable {
4-
let portfolio: String
54
let brokerageAccountID: String?
65
let purchaseDate: Date
76
let ticker: String
@@ -11,12 +10,11 @@ struct CreateTransactionRequestDTO: Decodable {
1110
let pricePerShare: Decimal
1211

1312
enum CodingKeys: String, CodingKey {
14-
case portfolio, brokerageAccountID, platform, account, purchaseDate, ticker, currency, fees, numberOfShares, pricePerShare
13+
case brokerageAccountID, purchaseDate, ticker, currency, fees, numberOfShares, pricePerShare
1514
}
1615

1716
init(from decoder: Decoder) throws {
1817
let container = try decoder.container(keyedBy: CodingKeys.self)
19-
portfolio = try container.decode(String.self, forKey: .portfolio)
2018
brokerageAccountID = try container.decodeIfPresent(String.self, forKey: .brokerageAccountID)
2119
ticker = try container.decode(String.self, forKey: .ticker)
2220
currency = try container.decode(String.self, forKey: .currency)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ struct BrokerageAccountDTO: Codable {
88
let baseCurrency: CurrencyDTO
99
let performance: PerformanceDTO
1010
let transactions: [TransactionDTO]
11+
let historicalPerformance: PerformanceTimeSeriesDTO
1112
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ struct BrokerageDTO: Codable {
55
let name: String
66
let accounts: [BrokerageAccountInfoDTO]
77
let performance: PerformanceDTO
8+
let historicalPerformance: PerformanceTimeSeriesDTO
89
}
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import Fluent
33
struct BrokerageDTOMapper {
44
private let brokerageRepository: BrokerageRepository
55
private let accountDTOMapper: BrokerageAccountDTOMapper
6+
private let performanceRepository: PostgresBrokerageDailyPerformanceRepository
7+
private let performanceDTOMapper: DatedPerformanceDTOMapper
68
private let database: Database
79

810
init(brokerageRepository: BrokerageRepository,
911
accountDTOMapper: BrokerageAccountDTOMapper,
12+
performanceRepository: PostgresBrokerageDailyPerformanceRepository,
13+
performanceDTOMapper: DatedPerformanceDTOMapper,
1014
database: Database) {
1115
self.brokerageRepository = brokerageRepository
1216
self.accountDTOMapper = accountDTOMapper
1317
self.database = database
18+
self.performanceRepository = performanceRepository
19+
self.performanceDTOMapper = performanceDTOMapper
1420
}
1521

1622
func brokerage(from brokerage: Brokerage) async throws -> BrokerageDTO {
@@ -19,11 +25,17 @@ struct BrokerageDTOMapper {
1925
try await accountDTOMapper.brokerageAccountInfo(from: $0)
2026
}
2127
let performance = try await brokerageRepository.performance(for: brokerage.requireID())
28+
29+
let rows = try await performanceRepository.readSeries(for: brokerage.requireID(), from: nil, to: nil)
30+
let values = rows.map { performanceDTOMapper.performancePoint(from: $0) }
31+
.sorted { $0.date < $1.date }
32+
2233
return try BrokerageDTO(
2334
id: brokerage.requireID(),
2435
name: brokerage.name,
2536
accounts: accountDTOs,
26-
performance: performance
37+
performance: performance,
38+
historicalPerformance: PerformanceTimeSeriesDTO(values: values)
2739
)
2840
}
2941
}

0 commit comments

Comments
 (0)