diff --git a/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift b/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift index 1fe966d..94640ee 100644 --- a/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift +++ b/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift @@ -10,10 +10,12 @@ import UIKit final class SettingsSceneDIContainer { lazy var userInfoStorage: UserInfoStorage = RealmUserInfoStorage() + lazy var questsStorage: QuestsStorage = RealmQuestsStorage() // MARK: - Repositories func makeAuthRepository() -> AuthRepository { - return DefaultAuthRepository() + return DefaultAuthRepository(persistentQuestsStorage: questsStorage, + persistentUserStorage: userInfoStorage) } func makeUserRepository() -> UserRepository { @@ -38,7 +40,7 @@ final class SettingsSceneDIContainer { func makeSignUpViewModel() -> SignUpViewModel { return SignUpViewModel(authUseCase: makeAuthUseCase()) } - + func makeSettingsViewModel() -> SettingsViewModel { return SettingsViewModel(settingsUseCase: makeSettingsUseCase()) } @@ -51,7 +53,7 @@ final class SettingsSceneDIContainer { func makeSignUpViewController() -> SignUpViewController { return SignUpViewController.create(with: makeSignUpViewModel()) } - + func makeSettingsViewController() -> SettingsViewController { return SettingsViewController.create(with: makeSettingsViewModel()) } diff --git a/DailyQuest/DailyQuest/Assets.xcassets/defaultBackground.imageset/Contents.json b/DailyQuest/DailyQuest/Assets.xcassets/defaultBackground.imageset/Contents.json index 1f56038..7a45321 100644 --- a/DailyQuest/DailyQuest/Assets.xcassets/defaultBackground.imageset/Contents.json +++ b/DailyQuest/DailyQuest/Assets.xcassets/defaultBackground.imageset/Contents.json @@ -5,7 +5,7 @@ "scale" : "1x" }, { - "filename" : "블러.png", + "filename" : "블러.png", "idiom" : "universal", "scale" : "2x" }, diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift index 2514fcc..9f11fdf 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift @@ -14,4 +14,5 @@ protocol QuestsStorage { func updateQuest(with quest: Quest) -> Single func deleteQuest(with questId: UUID) -> Single func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]> + func deleteAllQuests() -> Single<[Quest]> } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift index 0f5e8e9..fabf081 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift @@ -18,7 +18,6 @@ final class RealmQuestsStorage { } extension RealmQuestsStorage: QuestsStorage { - func saveQuests(with quests: [Quest]) -> Single<[Quest]> { return Single.create { [weak self] single in guard let realmStorage = self?.realmStorage else { @@ -91,7 +90,7 @@ extension RealmQuestsStorage: QuestsStorage { let quest = entity.toDomain() try realmStorage.deleteEntity(entity: entity) single(.success(quest)) - + } catch let error { single(.failure(RealmStorageError.saveError(error))) } @@ -122,4 +121,25 @@ extension RealmQuestsStorage: QuestsStorage { return Disposables.create() } } + + func deleteAllQuests() -> Single<[Quest]> { + return Single.create { [weak self] single in + guard let realmStorage = self?.realmStorage else { + return Disposables.create() + } + do { + let entities = try realmStorage.fetchEntities(type: QuestEntity.self) + let quests = entities.compactMap { $0.toDomain() } + for entity in entities { + try realmStorage.deleteEntity(entity: entity) + } + single(.success(quests)) + + } catch let error { + single(.failure(RealmStorageError.saveError(error))) + } + + return Disposables.create() + } + } } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift index 9bb0a91..8b0e984 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift @@ -41,7 +41,6 @@ final class RealmStorage { func fetchEntities(type: O.Type, filter: NSPredicate? = nil) throws -> [O] { guard let persistentContainer = persistentContainer else { - print(#function) throw RealmStorageError.realmObjectError } if let filter = filter { @@ -54,7 +53,6 @@ final class RealmStorage { @discardableResult func updateEntity(entity: O) throws -> O { guard let persistentContainer = persistentContainer else { - print(#function) throw RealmStorageError.realmObjectError } try persistentContainer.write { @@ -66,7 +64,6 @@ final class RealmStorage { @discardableResult func deleteEntity(entity: O) throws -> O { guard let persistentContainer = persistentContainer else { - print(#function) throw RealmStorageError.realmObjectError } try persistentContainer.write { @@ -79,7 +76,6 @@ final class RealmStorage { @discardableResult func deleteAllEntity(type: O.Type) throws -> [O] { guard let persistentContainer = persistentContainer else { - print(#function) throw RealmStorageError.realmObjectError } for entity in Array(persistentContainer.objects(type)) { @@ -92,7 +88,6 @@ final class RealmStorage { func findEntities(type: O.Type, filter: NSPredicate) throws -> [O] { guard let persistentContainer = persistentContainer else { - print(#function) throw RealmStorageError.realmObjectError } return Array(persistentContainer.objects(type).filter(filter)) diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultAuthRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultAuthRepository.swift index 03b2d45..2a7bcb4 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultAuthRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultAuthRepository.swift @@ -9,10 +9,17 @@ import RxSwift import Foundation final class DefaultAuthRepository { - + private let persistentQuestsStorage: QuestsStorage + private let persistentUserStorage: UserInfoStorage private let networkService: NetworkService - init(networkService: NetworkService = FirebaseService.shared) { + private let disposeBag = DisposeBag() + + init(persistentQuestsStorage: QuestsStorage, + persistentUserStorage: UserInfoStorage, + networkService: NetworkService = FirebaseService.shared) { + self.persistentUserStorage = persistentUserStorage + self.persistentQuestsStorage = persistentQuestsStorage self.networkService = networkService } } @@ -20,10 +27,43 @@ final class DefaultAuthRepository { extension DefaultAuthRepository: AuthRepository { func signIn(email: String, password: String) -> Single { return self.networkService.signIn(email: email, password: password) + .do(onSuccess: { [weak self] result in + if let self = self, result { + self.networkService.read(type: UserDTO.self, + userCase: .currentUser, + access: .userInfo, + filter: nil) + .map { $0.toDomain() } + .flatMap(self.persistentUserStorage.updateUserInfo(user:)) + .map { _ in true } + .catchAndReturn(false) + .flatMap { _ in + self.networkService.read(type: QuestDTO.self, + userCase: .currentUser, + access: .quests, + filter: nil) + .map { $0.toDomain() } + .toArray() + .flatMap(self.persistentQuestsStorage.saveQuests(with:)) + } + .subscribe() + .disposed(by: self.disposeBag) + } + }) } func signOut() -> Single { return self.networkService.signOut() + .do(onSuccess: { [weak self] result in + if let self = self, result { + self.persistentUserStorage.deleteUserInfo() + .flatMap { _ in + self.persistentQuestsStorage.deleteAllQuests() + } + .subscribe() + .disposed(by: self.disposeBag) + } + }) } func signUp(email: String, password: String, user: User) -> Single { diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift index 527b11b..6bbb39b 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -9,7 +9,6 @@ import RxSwift import Foundation final class DefaultQuestsRepository { - private let persistentStorage: QuestsStorage private let networkService: NetworkService diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index 61f746e..a4744ee 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -60,7 +60,7 @@ extension FirebaseService { } catch let error { single(.failure(error)) } - + if let self = self { self.uid.accept(self.auth.currentUser?.uid) } @@ -195,22 +195,25 @@ extension FirebaseService { let ref = try self.documentReference(userCase: userCase) switch access { case .quests: - guard let filter = filter else { throw NetworkServiceError.needFilterError } var query: Query? = nil - switch filter { - case let .today(date): - query = ref.collection(access.path) - .whereField("date", isEqualTo: date.toString) - case let .month(date): - let month = date.toString.components(separatedBy: "-")[0...1].joined(separator: "-") - query = ref.collection(access.path) - .whereField("date", isGreaterThan: "\(month)-00") - .whereField("date", isLessThan: "\(month)-40") - case let .year(date): - let year = date.toString.components(separatedBy: "-")[0] + if let filter = filter { + switch filter { + case let .today(date): + query = ref.collection(access.path) + .whereField("date", isEqualTo: date.toString) + case let .month(date): + let month = date.toString.components(separatedBy: "-")[0...1].joined(separator: "-") + query = ref.collection(access.path) + .whereField("date", isGreaterThan: "\(month)-00") + .whereField("date", isLessThan: "\(month)-40") + case let .year(date): + let year = date.toString.components(separatedBy: "-")[0] + query = ref.collection(access.path) + .whereField("date", isGreaterThan: "\(year)-01-00") + .whereField("date", isLessThan: "\(year)-12-40") + } + } else { query = ref.collection(access.path) - .whereField("date", isGreaterThan: "\(year)-01-00") - .whereField("date", isLessThan: "\(year)-12-40") } query?.getDocuments { (querySnapshot, err) in for document in querySnapshot!.documents { @@ -223,6 +226,7 @@ extension FirebaseService { } observer.onCompleted() } + case .receiveQuests: ref.collection(access.path).getDocuments { (querySnapshot, error) in for document in querySnapshot!.documents {