diff --git a/Projects/App/Sources/DI/Assembly/DataAssembly.swift b/Projects/App/Sources/DI/Assembly/DataAssembly.swift index 23e6169e..f31998aa 100644 --- a/Projects/App/Sources/DI/Assembly/DataAssembly.swift +++ b/Projects/App/Sources/DI/Assembly/DataAssembly.swift @@ -20,9 +20,10 @@ import Swinject public class DataAssembly: Assembly { public func assemble(container: Swinject.Container) { // MARK: Servcie - container.register(UserConfigurationService.self) { _ in - DefaultUserConfigurationService() + container.register(KeyValueStoreService.self) { _ in + DefaultKeyValueStoreService() } + .inObjectScope(.container) container.register(WebSocketService.self) { _ in BinanceWebSocketService() @@ -36,6 +37,12 @@ public class DataAssembly: Assembly { // MARK: DataSource + container.register(UserConfigurationDataSource.self) { resolver in + DefaultUserConfigurationDataSource( + service: resolver.resolve(KeyValueStoreService.self)! + ) + } + .inObjectScope(.container) container.register(CoinTradeDataSource.self) { _ in BinanceCoinTradeDataSource() } @@ -52,7 +59,6 @@ public class DataAssembly: Assembly { container.register(UserConfigurationRepository.self) { _ in DefaultUserConfigurationRepository() } - .inObjectScope(.container) container.register(AllMarketTickersRepository.self) { _ in BinanceAllMarketTickersRepository() diff --git a/Projects/App/Sources/DI/Assembly/DomainAssembly.swift b/Projects/App/Sources/DI/Assembly/DomainAssembly.swift index 613e6e81..f56d4d6d 100644 --- a/Projects/App/Sources/DI/Assembly/DomainAssembly.swift +++ b/Projects/App/Sources/DI/Assembly/DomainAssembly.swift @@ -15,6 +15,12 @@ class DomainAssembly: Assembly { func assemble(container: Swinject.Container) { // UseCase + container.register(SettingPageUseCase.self) { resolver in + DefaultSettingPageUseCase( + repository: resolver.resolve(UserConfigurationRepository.self)! + ) + } + container.register(RootPageUseCase.self) { _ in DefaultRootPageUseCase() } diff --git a/Projects/App/Sources/DI/Assembly/SharedAssembly.swift b/Projects/App/Sources/DI/Assembly/SharedAssembly.swift index 10377836..85e06daa 100644 --- a/Projects/App/Sources/DI/Assembly/SharedAssembly.swift +++ b/Projects/App/Sources/DI/Assembly/SharedAssembly.swift @@ -5,6 +5,7 @@ // Created by choijunios on 12/4/24. // +import DomainInterface import DataSource import WebSocketManagementHelper @@ -28,8 +29,8 @@ public class SharedAssembly: Assembly { .inObjectScope(.container) //MARK: I18NManager - container.register(I18NManager.self) { _ in - DefaultI18NManager() + container.register(I18NManager.self) { resolver in + DefaultI18NManager(repository: resolver.resolve(UserConfigurationRepository.self)!) } .inObjectScope(.container) diff --git a/Projects/Data/DataSource/Interface/UserConfigurationDataSource.swift b/Projects/Data/DataSource/Interface/UserConfigurationDataSource.swift new file mode 100644 index 00000000..dac6ae45 --- /dev/null +++ b/Projects/Data/DataSource/Interface/UserConfigurationDataSource.swift @@ -0,0 +1,17 @@ +// +// UserConfigurationDataSource.swift +// Data +// +// Created by choijunios on 5/4/25. +// + +public protocol UserConfigurationDataSource { + func getCurrency() -> String? + func setCurrency(type: String) + + func getLanguageType() -> String? + func setLanguageType(type: String) + + func getGridType() -> String? + func setGridType(type: String) +} diff --git a/Projects/Data/DataSource/Service/Store/KeyValueStore/KeyValueStoreService.swift b/Projects/Data/DataSource/Service/Store/KeyValueStore/KeyValueStoreService.swift new file mode 100644 index 00000000..cd8eb20b --- /dev/null +++ b/Projects/Data/DataSource/Service/Store/KeyValueStore/KeyValueStoreService.swift @@ -0,0 +1,28 @@ +// +// KeyValueStoreService.swift +// DataSource +// +// Created by choijunios on 10/15/24. +// + +import Foundation + +public protocol KeyValueStoreService { + func fetch(key: String) -> Any? + func save(key: String, value: Any) +} + + +public class DefaultKeyValueStoreService: KeyValueStoreService { + // Dependency + private let source: UserDefaults = .standard + + public init() { } +} + + +// MARK: KeyValueStoreService +public extension DefaultKeyValueStoreService { + func fetch(key: String) -> Any? { source.object(forKey: key) } + func save(key: String, value: Any) { source.set(value, forKey: key) } +} diff --git a/Projects/Data/DataSource/Service/UserConfigurationService.swift b/Projects/Data/DataSource/Service/UserConfigurationService.swift deleted file mode 100644 index a0da0020..00000000 --- a/Projects/Data/DataSource/Service/UserConfigurationService.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// UserConfigurationService.swift -// DataSource -// -// Created by choijunios on 10/15/24. -// - -import Foundation - -public protocol UserConfigurationService { - - /// Configuration정보를 획득합니다. - func getStringValue(key: String) -> String? - - - /// Configuration정보를 설정합니다. - func setConfiguration(key: String, value: T) -} - -public class DefaultUserConfigurationService: UserConfigurationService { - - private let source: UserDefaults = .standard - - public init() { } - - public func getStringValue(key: String) -> String? { - source.string(forKey: key) - } - - public func setConfiguration(key: String, value: T) { - source.set(value, forKey: key) - } -} diff --git a/Projects/Data/DataSource/implementation/DefaultUserConfigurationDataSource.swift b/Projects/Data/DataSource/implementation/DefaultUserConfigurationDataSource.swift new file mode 100644 index 00000000..e7c83a93 --- /dev/null +++ b/Projects/Data/DataSource/implementation/DefaultUserConfigurationDataSource.swift @@ -0,0 +1,59 @@ +// +// DefaultUserConfigurationDataSource.swift +// Data +// +// Created by choijunios on 5/4/25. +// + +import CoreUtil + +final public class DefaultUserConfigurationDataSource: UserConfigurationDataSource { + // Dependency + private var service: KeyValueStoreService + + // State + private let memoryCache: LockedDictionary = .init() + + // Keys + private let currencySavingKey = "configuration_currency" + private let languageSavingKey = "configuration_language" + private let gridTypeSavingKey = "configuration_gridType" + + + public init(service: KeyValueStoreService) { + self.service = service + } + + + private func checkMemCache(key: String) -> T? { memoryCache[key] as? T } + private func cacheToMemory(key: String, value: Any) { memoryCache[key] = value } + private func fetch(key: String) -> Any? { + if let memoryCache: String = checkMemCache(key: key) { + // 매모리 캐쉬가 존재하는 경우 + return memoryCache + } + if let storeData = service.fetch(key: key) { + // 로컬에 저장된 정보가 있는 경우 + defer { cacheToMemory(key: key, value: storeData) } + return storeData + } + return nil + } + private func save(key: String, value: Any) { + service.save(key: key, value: value) + cacheToMemory(key: key, value: value) + } +} + + +// MARK: UserConfigurationDataSource +public extension DefaultUserConfigurationDataSource { + func getCurrency() -> String? { fetch(key: currencySavingKey) as? String } + func setCurrency(type: String) { save(key: currencySavingKey, value: type) } + + func getLanguageType() -> String? { fetch(key: languageSavingKey) as? String } + func setLanguageType(type: String) { save(key: languageSavingKey, value: type) } + + func getGridType() -> String? { fetch(key: gridTypeSavingKey) as? String } + func setGridType(type: String) { save(key: gridTypeSavingKey, value: type) } +} diff --git a/Projects/Data/Repository/BinanceCoinTradeRepository.swift b/Projects/Data/Repository/BinanceCoinTradeRepository.swift index f10e6be8..45bf805c 100644 --- a/Projects/Data/Repository/BinanceCoinTradeRepository.swift +++ b/Projects/Data/Repository/BinanceCoinTradeRepository.swift @@ -14,7 +14,6 @@ import CoreUtil public final class BinanceCoinTradeRepository: CoinTradeRepository { // Dependency - @Injected private var webSocketService: WebSocketService @Injected private var coinTradeDataSource: CoinTradeDataSource public init() { } diff --git a/Projects/Data/Repository/DefaultUserConfigurationRepository.swift b/Projects/Data/Repository/DefaultUserConfigurationRepository.swift index cd6b36a6..3ca73003 100644 --- a/Projects/Data/Repository/DefaultUserConfigurationRepository.swift +++ b/Projects/Data/Repository/DefaultUserConfigurationRepository.swift @@ -13,121 +13,35 @@ import CoreUtil public class DefaultUserConfigurationRepository: UserConfigurationRepository { // Dependency - @Injected var userConfigurationService: UserConfigurationService - - // Cache configuration - private let cachedConfiguration: LockedDictionary = .init() + @Injected private var dataSource: UserConfigurationDataSource public init() { } - - public func getCurrencyType() -> CurrencyType { - let config: UserConfiguration = .currency - - if let memoryCached: String = checkMemoryCache(key: config.savingKey) { - // 캐싱된 정보를 먼저 확인합니다. - return .init(rawValue: memoryCached)! - } - - if let diskCached = userConfigurationService.getStringValue(key: config.savingKey) { - // 로컬에 저장된 정보를 확인합니다. - - // 정보를 메모리에 캐싱 - caching(key: config.savingKey, value: diskCached) - - return .init(rawValue: diskCached)! - } - - return .init(rawValue: config.defaultSavingValue)! - } - - - - public func setCurrencyType(type: CurrencyType) { - let config: UserConfiguration = .currency - - // 디스크 저장 - userConfigurationService.setConfiguration(key: config.savingKey, value: type.savingValue) - - // 정보를 메모리에 캐싱 - caching(key: config.savingKey, value: type.savingValue) - } - - - public func getLanguageType() -> LanguageType { - let config: UserConfiguration = .language - - if let memoryCached: String = checkMemoryCache(key: config.savingKey) { - // 캐싱된 정보를 먼저 확인합니다. - return .init(rawValue: memoryCached)! - } - - if let diskCached = userConfigurationService.getStringValue(key: config.savingKey) { - // 로컬에 저장된 정보를 확인합니다. - - // 정보를 메모리에 캐싱 - caching(key: config.savingKey, value: diskCached) - - return .init(rawValue: diskCached)! - } - - return .init(rawValue: config.defaultSavingValue)! +} + + +// MARK: UserConfigurationRepository +public extension DefaultUserConfigurationRepository { + func getCurrencyType() -> CurrencyType? { + guard let value = dataSource.getCurrency() else { return nil } + return CurrencyType(rawValue: value) } - - - public func setLanguageType(type: LanguageType) { - let config: UserConfiguration = .language - - // 디스크 저장 - userConfigurationService.setConfiguration(key: config.savingKey, value: type.savingValue) - - // 메모리 저장 - cachedConfiguration[config.savingKey] = type.savingValue + func setCurrencyType(type: CurrencyType) { + dataSource.setCurrency(type: type.rawValue) } - - public func getGridType() -> GridType { - let config: UserConfiguration = .gridType - - if let memoryCached: String = checkMemoryCache(key: config.savingKey) { - // 캐싱된 정보를 먼저 확인합니다. - return .init(rawValue: memoryCached)! - } - - if let diskCached = userConfigurationService.getStringValue(key: config.savingKey) { - // 로컬에 저장된 정보를 확인합니다. - - // 정보를 메모리에 캐싱 - caching(key: config.savingKey, value: diskCached) - - return .init(rawValue: diskCached)! - } - - return .init(rawValue: config.defaultSavingValue)! + func getLanguageType() -> LanguageType? { + guard let value = dataSource.getLanguageType() else { return nil } + return LanguageType(rawValue: value) } - - - - public func setGridType(type: GridType) { - let config: UserConfiguration = .gridType - - // 디스크 저장 - userConfigurationService.setConfiguration(key: config.savingKey, value: type.savingValue) - - // 메모리 저장 - cachedConfiguration[config.savingKey] = type.savingValue + func setLanguageType(type: LanguageType) { + dataSource.setLanguageType(type: type.rawValue) } - - // MARK: check cache - private func checkMemoryCache(key: String) -> T? { - cachedConfiguration[key] as? T + func getGridType() -> GridType? { + guard let value = dataSource.getGridType() else { return nil } + return GridType(rawValue: value) } - - private func caching(key: String, value: Any) { - - DispatchQueue.global().async { [weak self] in - // 정보를 메모리에 캐싱 - self?.cachedConfiguration[key] = value - } + func setGridType(type: GridType) { + dataSource.setGridType(type: type.rawValue) } } diff --git a/Projects/Data/Tests/Testing/FakeKeyValueStoreService.swift b/Projects/Data/Tests/Testing/FakeKeyValueStoreService.swift new file mode 100644 index 00000000..c4e30f14 --- /dev/null +++ b/Projects/Data/Tests/Testing/FakeKeyValueStoreService.swift @@ -0,0 +1,21 @@ +// +// FakeKeyValueStoreService.swift +// Data +// +// Created by choijunios on 5/4/25. +// + +import DataSource + +final class FakeKeyValueStoreService: KeyValueStoreService { + + private var fakeDB: [String: Any] = [:] + + func fetch(key: String) -> Any? { + fakeDB[key] + } + + func save(key: String, value: Any) { + fakeDB[key] = value + } +} diff --git a/Projects/Data/Tests/UserConfigurationDataSourceTests.swift b/Projects/Data/Tests/UserConfigurationDataSourceTests.swift new file mode 100644 index 00000000..af2ab70a --- /dev/null +++ b/Projects/Data/Tests/UserConfigurationDataSourceTests.swift @@ -0,0 +1,36 @@ +// +// UserConfigurationDataSourceTests.swift +// Data +// +// Created by choijunios on 5/4/25. +// + +import Testing + +import DataSource + +struct UserConfigurationDataSourceTests { + + @Test("유저 설정 값 저장 확인") + func checkConfiguratonSaving() { + // Given + let dataSource = DefaultUserConfigurationDataSource( + service: FakeKeyValueStoreService() + ) + + + // When + let testCurrency = "WON" + let testLan = "KOR" + let testGT = "List" + dataSource.setCurrency(type: testCurrency) + dataSource.setLanguageType(type: testLan) + dataSource.setGridType(type: testGT) + + + // Then + #expect(dataSource.getCurrency() == testCurrency) + #expect(dataSource.getLanguageType() == testLan) + #expect(dataSource.getGridType() == testGT) + } +} diff --git a/Projects/Data/Tests/WebSocketServiceTests.swift b/Projects/Data/Tests/WebSocketServiceTests.swift deleted file mode 100644 index 8b137891..00000000 --- a/Projects/Data/Tests/WebSocketServiceTests.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Projects/Domain/Concrete/UseCase/DefaultAllMarketTickersUseCase.swift b/Projects/Domain/Concrete/UseCase/DefaultAllMarketTickersUseCase.swift index dabeb05e..b54d98db 100644 --- a/Projects/Domain/Concrete/UseCase/DefaultAllMarketTickersUseCase.swift +++ b/Projects/Domain/Concrete/UseCase/DefaultAllMarketTickersUseCase.swift @@ -54,7 +54,9 @@ public final class DefaultAllMarketTickersUseCase: AllMarketTickersUseCase { // MARK: AllMarketTickersUseCase, Stream public extension DefaultAllMarketTickersUseCase { - func getGridType() -> GridType { userConfigurationRepository.getGridType() } + func getGridType() -> GridType { + userConfigurationRepository.getGridType() ?? .defaultValue + } func getTickerList(rowCount: UInt) async -> [Twenty4HourTickerForSymbolVO] { let entity = await allMarketTickersRepository.getAllMarketTicker() diff --git a/Projects/Domain/Concrete/UseCase/DefaultSettingPageUseCase.swift b/Projects/Domain/Concrete/UseCase/DefaultSettingPageUseCase.swift new file mode 100644 index 00000000..d6136dc4 --- /dev/null +++ b/Projects/Domain/Concrete/UseCase/DefaultSettingPageUseCase.swift @@ -0,0 +1,25 @@ +// +// DefaultSettingPageUseCase.swift +// Domain +// +// Created by choijunios on 5/4/25. +// + +import DomainInterface + +final public class DefaultSettingPageUseCase: SettingPageUseCase { + // Dependency + private let repository: UserConfigurationRepository + + public init(repository: UserConfigurationRepository) { + self.repository = repository + } + + public func getGridType() -> GridType { + repository.getGridType() ?? .defaultValue + } + + public func setGridType(type: GridType) { + repository.setGridType(type: type) + } +} diff --git a/Projects/Domain/Interface/Entity/Configuration/CurrencyType.swift b/Projects/Domain/Interface/Entity/Configuration/CurrencyType.swift index 6b122071..d9f6e286 100644 --- a/Projects/Domain/Interface/Entity/Configuration/CurrencyType.swift +++ b/Projects/Domain/Interface/Entity/Configuration/CurrencyType.swift @@ -10,9 +10,8 @@ public enum CurrencyType: String, CaseIterable { case won="WON" case dollar="DOLLAR" - public var savingValue: String { - self.rawValue - } + /// 도메인 기본값 + public static var defaultValue: Self { .dollar } public var currencyCode: String { switch self { diff --git a/Projects/Domain/Interface/Entity/Configuration/GridType.swift b/Projects/Domain/Interface/Entity/Configuration/GridType.swift index 2b587bd2..f31bf815 100644 --- a/Projects/Domain/Interface/Entity/Configuration/GridType.swift +++ b/Projects/Domain/Interface/Entity/Configuration/GridType.swift @@ -8,8 +8,7 @@ public enum GridType: String { case list="LIST" case twoByTwo="2X2" - - public var savingValue: String { - self.rawValue - } + + /// 도메인 기본값 + public static var defaultValue: Self { .list } } diff --git a/Projects/Domain/Interface/Entity/Configuration/LanguageType.swift b/Projects/Domain/Interface/Entity/Configuration/LanguageType.swift index 910512a7..0037e9e8 100644 --- a/Projects/Domain/Interface/Entity/Configuration/LanguageType.swift +++ b/Projects/Domain/Interface/Entity/Configuration/LanguageType.swift @@ -10,9 +10,8 @@ public enum LanguageType: String { case korean="KOR" case english="ENG" - public var savingValue: String { - self.rawValue - } + /// 도메인 기본값 + public static var defaultValue: Self { .english } public var lanCode: String { switch self { diff --git a/Projects/Domain/Interface/Entity/Configuration/UserConfiguration.swift b/Projects/Domain/Interface/Entity/Configuration/UserConfiguration.swift deleted file mode 100644 index 9aaa8ab3..00000000 --- a/Projects/Domain/Interface/Entity/Configuration/UserConfiguration.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// UserConfiguration.swift -// Domain -// -// Created by choijunios on 10/15/24. -// - -import Foundation - -/// 설정 옵션의 종류를 의미합니다. -public enum UserConfiguration: String { - - case currency - case gridType - case language - - public var defaultSavingValue: String { - switch self { - case .currency: - CurrencyType.dollar.savingValue - case .gridType: - GridType.list.savingValue - case .language: - LanguageType.english.savingValue - } - } - - public var savingKey: String { - "configuration_\(self.rawValue)" - } -} diff --git a/Projects/Domain/Interface/Repository/UserConfigurationRepository.swift b/Projects/Domain/Interface/Repository/UserConfigurationRepository.swift index 833c59f4..57519088 100644 --- a/Projects/Domain/Interface/Repository/UserConfigurationRepository.swift +++ b/Projects/Domain/Interface/Repository/UserConfigurationRepository.swift @@ -10,19 +10,19 @@ import Foundation public protocol UserConfigurationRepository { /// 화폐 타입을 획득합니다. - func getCurrencyType() -> CurrencyType + func getCurrencyType() -> CurrencyType? /// 화폐 타입을 설정합니다. func setCurrencyType(type: CurrencyType) /// 언어 타입 획득 - func getLanguageType() -> LanguageType + func getLanguageType() -> LanguageType? /// 언어 타입 설정 func setLanguageType(type : LanguageType) /// 그리드 타입을 획득합니다. - func getGridType() -> GridType + func getGridType() -> GridType? /// 그리드 타입을 설정합니다. func setGridType(type: GridType) diff --git a/Projects/Domain/Interface/UseCase/SettingPageUseCase.swift b/Projects/Domain/Interface/UseCase/SettingPageUseCase.swift new file mode 100644 index 00000000..bff08d74 --- /dev/null +++ b/Projects/Domain/Interface/UseCase/SettingPageUseCase.swift @@ -0,0 +1,11 @@ +// +// SettingPageUseCase.swift +// Domain +// +// Created by choijunios on 5/4/25. +// + +public protocol SettingPageUseCase { + func getGridType() -> GridType + func setGridType(type: GridType) +} diff --git a/Projects/Domain/Testing/AllMarketTicker/StubUserConfigurationRepository.swift b/Projects/Domain/Testing/AllMarketTicker/StubUserConfigurationRepository.swift index 830cf25b..2e6a6fe2 100644 --- a/Projects/Domain/Testing/AllMarketTicker/StubUserConfigurationRepository.swift +++ b/Projects/Domain/Testing/AllMarketTicker/StubUserConfigurationRepository.swift @@ -11,7 +11,7 @@ public struct StubUserConfigurationRepository: UserConfigurationRepository { public init() { } - public func getCurrencyType() -> DomainInterface.CurrencyType { + public func getCurrencyType() -> DomainInterface.CurrencyType? { return .dollar } @@ -19,7 +19,7 @@ public struct StubUserConfigurationRepository: UserConfigurationRepository { } - public func getLanguageType() -> DomainInterface.LanguageType { + public func getLanguageType() -> DomainInterface.LanguageType? { return .english } @@ -27,7 +27,7 @@ public struct StubUserConfigurationRepository: UserConfigurationRepository { } - public func getGridType() -> DomainInterface.GridType { + public func getGridType() -> DomainInterface.GridType? { return .list } diff --git a/Projects/Features/AllMarketTicker/Testing/FakeI18NManager.swift b/Projects/Features/AllMarketTicker/Testing/FakeI18NManager.swift index 2e6e3941..3f8c8968 100644 --- a/Projects/Features/AllMarketTicker/Testing/FakeI18NManager.swift +++ b/Projects/Features/AllMarketTicker/Testing/FakeI18NManager.swift @@ -22,7 +22,7 @@ public final class FakeI18NManager: I18NManager { } public func getCurrencyType() -> DomainInterface.CurrencyType { - fakeUserConfigRepository.getCurrencyType() + fakeUserConfigRepository.getCurrencyType() ?? .defaultValue } public func setCurrencyType(type: DomainInterface.CurrencyType) { @@ -31,7 +31,7 @@ public final class FakeI18NManager: I18NManager { } public func getLanguageType() -> DomainInterface.LanguageType { - fakeUserConfigRepository.getLanguageType() + fakeUserConfigRepository.getLanguageType() ?? .defaultValue } public func setLanguageType(type: DomainInterface.LanguageType) { diff --git a/Projects/Features/AllMarketTicker/Testing/FakeUserConfigurationRepository.swift b/Projects/Features/AllMarketTicker/Testing/FakeUserConfigurationRepository.swift index c0421270..ff97149f 100644 --- a/Projects/Features/AllMarketTicker/Testing/FakeUserConfigurationRepository.swift +++ b/Projects/Features/AllMarketTicker/Testing/FakeUserConfigurationRepository.swift @@ -9,38 +9,34 @@ import DomainInterface public final class FakeUserConfigurationRepository: UserConfigurationRepository { - private var fakeDB: [String: String] = [ - UserConfiguration.currency.savingKey: CurrencyType.dollar.savingValue, - UserConfiguration.language.savingKey: LanguageType.english.savingValue, - UserConfiguration.gridType.savingKey: GridType.list.savingValue - ] + private var fakeDB: [String: String] = [:] public init() { } - public func getCurrencyType() -> DomainInterface.CurrencyType { - let value = fakeDB[UserConfiguration.currency.savingKey]! + public func getCurrencyType() -> CurrencyType? { + let value = fakeDB["currency"]! return .init(rawValue: value)! } - public func setCurrencyType(type: DomainInterface.CurrencyType) { - fakeDB[UserConfiguration.currency.savingKey] = type.savingValue + public func setCurrencyType(type: CurrencyType) { + fakeDB["currency"] = type.rawValue } - public func getLanguageType() -> DomainInterface.LanguageType { - let value = fakeDB[UserConfiguration.language.savingKey]! + public func getLanguageType() -> LanguageType? { + let value = fakeDB["language"]! return .init(rawValue: value)! } - public func setLanguageType(type: DomainInterface.LanguageType) { - fakeDB[UserConfiguration.language.savingKey] = type.savingValue + public func setLanguageType(type: LanguageType) { + fakeDB["language"] = type.rawValue } - public func getGridType() -> DomainInterface.GridType { - let value = fakeDB[UserConfiguration.gridType.savingKey]! + public func getGridType() -> GridType? { + let value = fakeDB["gridType"]! return .init(rawValue: value)! } - public func setGridType(type: DomainInterface.GridType) { - fakeDB[UserConfiguration.gridType.savingKey] = type.savingValue + public func setGridType(type: GridType) { + fakeDB["gridType"] = type.rawValue } } diff --git a/Projects/Features/Setting/Example/Sources/App.swift b/Projects/Features/Setting/Example/Sources/App.swift index 35425221..857724ec 100644 --- a/Projects/Features/Setting/Example/Sources/App.swift +++ b/Projects/Features/Setting/Example/Sources/App.swift @@ -20,7 +20,7 @@ struct CoinViewerApp : App { WindowGroup { SettingView(viewModel: .init( i18NManager: DependencyInjector.shared.resolve(), - userConfigurationRepository: DependencyInjector.shared.resolve() + useCase: DependencyInjector.shared.resolve() )) } } diff --git a/Projects/Features/Setting/Example/Sources/DI/Assemblies.swift b/Projects/Features/Setting/Example/Sources/DI/Assemblies.swift index 4530aec4..d10f5d9f 100644 --- a/Projects/Features/Setting/Example/Sources/DI/Assemblies.swift +++ b/Projects/Features/Setting/Example/Sources/DI/Assemblies.swift @@ -17,27 +17,47 @@ import Swinject public class Assemblies : Assembly { public func assemble(container: Container) { + // MARK: Service + container.register(KeyValueStoreService.self) { _ in + DefaultKeyValueStoreService() + } + .inObjectScope(.container) + //MARK: DataSource container.register(ExchangeRateDataSource.self) { _ in OpenXExchangeRateDataSource() } .inObjectScope(.container) + container.register(UserConfigurationDataSource.self) { resolver in + DefaultUserConfigurationDataSource( + service: resolver.resolve(KeyValueStoreService.self)! + ) + } + .inObjectScope(.container) + + // MARK: Repository container.register(ExchangeRateRepository.self) { _ in DefaultExchangeRateRepository() } - - container.register(UserConfigurationService.self) { _ in - DefaultUserConfigurationService() - } - container.register(UserConfigurationRepository.self) { _ in DefaultUserConfigurationRepository() } + + // MARK: UseCase + container.register(SettingPageUseCase.self) { resolver in + DefaultSettingPageUseCase( + repository: resolver.resolve(UserConfigurationRepository.self)! + ) + } + + //MARK: I18N - container.register(I18NManager.self) { _ in - DefaultI18NManager() + container.register(I18NManager.self) { resolver in + DefaultI18NManager( + repository: resolver.resolve(UserConfigurationRepository.self)! + ) } } } diff --git a/Projects/Features/Setting/Feature/Sources/SettingBuilder.swift b/Projects/Features/Setting/Feature/Sources/SettingBuilder.swift index e691c4d5..9d30dd36 100644 --- a/Projects/Features/Setting/Feature/Sources/SettingBuilder.swift +++ b/Projects/Features/Setting/Feature/Sources/SettingBuilder.swift @@ -16,7 +16,7 @@ public class SettingBuilder { public func build(listener: SettingPageListener) -> SettingRoutable { let viewModel = SettingViewModel( i18NManager: DependencyInjector.shared.resolve(), - userConfigurationRepository: DependencyInjector.shared.resolve() + useCase: DependencyInjector.shared.resolve() ) viewModel.listener = listener let view = SettingView(viewModel: viewModel) diff --git a/Projects/Features/Setting/Feature/Sources/ViewModel/SettingViewModel.swift b/Projects/Features/Setting/Feature/Sources/ViewModel/SettingViewModel.swift index 917d3129..788c2005 100644 --- a/Projects/Features/Setting/Feature/Sources/ViewModel/SettingViewModel.swift +++ b/Projects/Features/Setting/Feature/Sources/ViewModel/SettingViewModel.swift @@ -22,7 +22,7 @@ public protocol SettingPageListener: AnyObject { } class SettingViewModel: UDFObservableObject, SettingViewModelable { // Dependency private let i18NManager: I18NManager - private let userConfigurationRepository: UserConfigurationRepository + private let useCase: SettingPageUseCase // Listener @@ -43,13 +43,13 @@ class SettingViewModel: UDFObservableObject, SettingViewModelable { var action : PassthroughSubject = .init() var store : Set = [] - init(i18NManager: I18NManager, userConfigurationRepository: UserConfigurationRepository) { + init(i18NManager: I18NManager, useCase: SettingPageUseCase) { self.i18NManager = i18NManager - self.userConfigurationRepository = userConfigurationRepository + self.useCase = useCase let initialCurrencyType = i18NManager.getCurrencyType() let initialLanType = i18NManager.getLanguageType() - let initialGridType = userConfigurationRepository.getGridType() + let initialGridType = useCase.getGridType() let initialState: State = .init( currencyType: initialCurrencyType, languageType: initialLanType, @@ -92,10 +92,10 @@ class SettingViewModel: UDFObservableObject, SettingViewModelable { case .languageType(let value): let updatedValue: LanguageType = (value == .english) ? .korean : .english i18NManager.setLanguageType(type: updatedValue) - newState.languageType = i18NManager.getLanguageType() + newState.languageType = updatedValue case .gridType(let value): let updatedValue: GridType = (value == .list) ? .twoByTwo : .list - userConfigurationRepository.setGridType(type: updatedValue) + useCase.setGridType(type: updatedValue) newState.gridType = updatedValue } newState.settingCellROs = createSettingCellROS(with: newState) diff --git a/Projects/Shared/I18N/Sources/DefaultI18NManager.swift b/Projects/Shared/I18N/Sources/DefaultI18NManager.swift index bd9b9862..36c95188 100644 --- a/Projects/Shared/I18N/Sources/DefaultI18NManager.swift +++ b/Projects/Shared/I18N/Sources/DefaultI18NManager.swift @@ -14,11 +14,15 @@ import CoreUtil public class DefaultI18NManager: I18NManager { // Dependency - @Injected private var repository : UserConfigurationRepository + private let repository : UserConfigurationRepository + private let changePublisher: PassthroughSubject = .init() - public init() { } + + public init(repository: UserConfigurationRepository) { + self.repository = repository + } public func getChangePublisher() -> AnyPublisher { @@ -27,7 +31,7 @@ public class DefaultI18NManager: I18NManager { public func getCurrencyType() -> CurrencyType { - return repository.getCurrencyType() + return repository.getCurrencyType() ?? .defaultValue } @@ -38,7 +42,7 @@ public class DefaultI18NManager: I18NManager { public func getLanguageType() -> LanguageType { - return repository.getLanguageType() + return repository.getLanguageType() ?? .defaultValue }