diff --git a/Packages/TempestasInfrastructure/Sources/TempestasInfrastructure/Repositories/DefaultForecastRepository.swift b/Packages/TempestasInfrastructure/Sources/TempestasInfrastructure/Repositories/DefaultForecastRepository.swift index 77152a4..cb32505 100644 --- a/Packages/TempestasInfrastructure/Sources/TempestasInfrastructure/Repositories/DefaultForecastRepository.swift +++ b/Packages/TempestasInfrastructure/Sources/TempestasInfrastructure/Repositories/DefaultForecastRepository.swift @@ -63,3 +63,26 @@ public actor DefaultForecastRepository: ForecastRepository { return record } } + +extension DefaultForecastRepository { + public static func makeDefault(inMemory: Bool = false) throws -> DefaultForecastRepository { + let schema = Schema([WeatherResponseRecord.self, DailyForecastRecord.self]) + let configuration: ModelConfiguration = if inMemory { + ModelConfiguration(schema: schema, isStoredInMemoryOnly: true) + } else { + ModelConfiguration(schema: schema, url: try storeURL()) + } + let container = try ModelContainer(for: schema, configurations: [configuration]) + return DefaultForecastRepository(modelContainer: container) + } + + private static func storeURL() throws -> URL { + let applicationSupportDirectory = try FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) + return applicationSupportDirectory.appending(path: "ForecastCache.store") + } +} diff --git a/Tempestas/AppComposition.swift b/Tempestas/AppComposition.swift new file mode 100644 index 0000000..404f55d --- /dev/null +++ b/Tempestas/AppComposition.swift @@ -0,0 +1,16 @@ +import TempestasDomain +import TempestasInfrastructure +import TempestasPresentation + +@MainActor +final class AppComposition { + private let forecastRepository: ForecastRepository + + init(inMemory: Bool = false) { + guard let forecastRepository = try? DefaultForecastRepository.makeDefault(inMemory: inMemory) else { + fatalError("Failed to create the forecast cache store") + } + + self.forecastRepository = forecastRepository + } +} diff --git a/Tempestas/TempestasApp.swift b/Tempestas/TempestasApp.swift index 73d78ad..da1d6b1 100644 --- a/Tempestas/TempestasApp.swift +++ b/Tempestas/TempestasApp.swift @@ -10,6 +10,12 @@ import SwiftData @main struct TempestasApp: App { + private let composition: AppComposition + + init() { + self.composition = AppComposition() + } + var sharedModelContainer: ModelContainer = { let schema = Schema([ Item.self,