Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor/repository #108

Merged
merged 7 commits into from
Dec 8, 2022
4 changes: 4 additions & 0 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
3449AD5D2922197000B87619 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5C2922197000B87619 /* User.swift */; };
3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5F29222B3900B87619 /* UserInfoCell.swift */; };
344A459A293DC495007A3D37 /* EnrollUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344A4599293DC495007A3D37 /* EnrollUseCase.swift */; };
34517FCC2940A92100AB77E9 /* Alertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34517FCB2940A92100AB77E9 /* Alertable.swift */; };
345687F42937329E00CA51E3 /* EnrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F32937329E00CA51E3 /* EnrollViewController.swift */; };
345687F62937430200CA51E3 /* PlanDatePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F52937430200CA51E3 /* PlanDatePickerView.swift */; };
345687F829374D2500CA51E3 /* DayNamePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F729374D2500CA51E3 /* DayNamePickerView.swift */; };
Expand Down Expand Up @@ -273,6 +274,7 @@
3449AD5C2922197000B87619 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
3449AD5F29222B3900B87619 /* UserInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoCell.swift; sourceTree = "<group>"; };
344A4599293DC495007A3D37 /* EnrollUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrollUseCase.swift; sourceTree = "<group>"; };
34517FCB2940A92100AB77E9 /* Alertable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alertable.swift; sourceTree = "<group>"; };
345687F32937329E00CA51E3 /* EnrollViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnrollViewController.swift; sourceTree = "<group>"; };
345687F52937430200CA51E3 /* PlanDatePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanDatePickerView.swift; sourceTree = "<group>"; };
345687F729374D2500CA51E3 /* DayNamePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayNamePickerView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -657,6 +659,7 @@
A50F9A3829266FD8005C00FE /* Date+.swift */,
9BED4DE9293FA92900C60631 /* UIImageView+.swift */,
3436FCF9293F2654003575C3 /* Notification+.swift */,
34517FCB2940A92100AB77E9 /* Alertable.swift */,
);
path = Utils;
sourceTree = "<group>";
Expand Down Expand Up @@ -1335,6 +1338,7 @@
347D258B292C60F40038FCA2 /* StatusView.swift in Sources */,
9BED4DE8293FA01400C60631 /* ProfileViewModel.swift in Sources */,
34642AB62925D9E40052FA0E /* UserInfoView.swift in Sources */,
34517FCC2940A92100AB77E9 /* Alertable.swift in Sources */,
349955292923600A007AB99E /* BrowseViewController.swift in Sources */,
34113BE82934917500AB4919 /* LoginViewModel.swift in Sources */,
34EE6EB72924C674005AF583 /* QuestView.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -38,7 +40,7 @@ final class SettingsSceneDIContainer {
func makeSignUpViewModel() -> SignUpViewModel {
return SignUpViewModel(authUseCase: makeAuthUseCase())
}

func makeSettingsViewModel() -> SettingsViewModel {
return SettingsViewModel(settingsUseCase: makeSettingsUseCase())
}
Expand All @@ -51,7 +53,7 @@ final class SettingsSceneDIContainer {
func makeSignUpViewController() -> SignUpViewController {
return SignUpViewController.create(with: makeSignUpViewModel())
}

func makeSettingsViewController() -> SettingsViewController {
return SettingsViewController.create(with: makeSettingsViewModel())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"scale" : "1x"
},
{
"filename" : "블ᄅα…₯.png",
"filename" : "λΈ”λŸ¬.png",
"idiom" : "universal",
"scale" : "2x"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ protocol QuestsStorage {
func updateQuest(with quest: Quest) -> Single<Quest>
func deleteQuest(with questId: UUID) -> Single<Quest>
func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]>
func deleteAllQuests() -> Single<[Quest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)))
}
Expand Down Expand Up @@ -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()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ final class RealmStorage {

func fetchEntities<O: Object>(type: O.Type, filter: NSPredicate? = nil) throws -> [O] {
guard let persistentContainer = persistentContainer else {
print(#function)
throw RealmStorageError.realmObjectError
}
if let filter = filter {
Expand All @@ -54,7 +53,6 @@ final class RealmStorage {
@discardableResult
func updateEntity<O: Object>(entity: O) throws -> O {
guard let persistentContainer = persistentContainer else {
print(#function)
throw RealmStorageError.realmObjectError
}
try persistentContainer.write {
Expand All @@ -66,7 +64,6 @@ final class RealmStorage {
@discardableResult
func deleteEntity<O: Object>(entity: O) throws -> O {
guard let persistentContainer = persistentContainer else {
print(#function)
throw RealmStorageError.realmObjectError
}
try persistentContainer.write {
Expand All @@ -79,7 +76,6 @@ final class RealmStorage {
@discardableResult
func deleteAllEntity<O: Object>(type: O.Type) throws -> [O] {
guard let persistentContainer = persistentContainer else {
print(#function)
throw RealmStorageError.realmObjectError
}
for entity in Array(persistentContainer.objects(type)) {
Expand All @@ -92,7 +88,6 @@ final class RealmStorage {

func findEntities<O: Object>(type: O.Type, filter: NSPredicate) throws -> [O] {
guard let persistentContainer = persistentContainer else {
print(#function)
throw RealmStorageError.realmObjectError
}
return Array(persistentContainer.objects(type).filter(filter))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,61 @@ 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
}
}

extension DefaultAuthRepository: AuthRepository {
func signIn(email: String, password: String) -> Single<Bool> {
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<Bool> {
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<Bool> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import RxSwift
import Foundation

final class DefaultQuestsRepository {

private let persistentStorage: QuestsStorage
private let networkService: NetworkService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ extension FirebaseService {
} catch let error {
single(.failure(error))
}

if let self = self {
self.uid.accept(self.auth.currentUser?.uid)
}
Expand All @@ -81,6 +81,7 @@ extension FirebaseService {
if let error = error { throw error }
guard let authResult = authResult else { throw NetworkServiceError.noAuthError }
try self.createUser(uuid: authResult.user.uid, userDto: userDto)
self.uid.accept(self.auth.currentUser?.uid)
single(.success(true))
} catch let error {
single(.failure(error))
Expand Down Expand Up @@ -194,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 {
Expand All @@ -222,6 +226,7 @@ extension FirebaseService {
}
observer.onCompleted()
}

case .receiveQuests:
ref.collection(access.path).getDocuments { (querySnapshot, error) in
for document in querySnapshot!.documents {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,33 @@ final class DefaultSettingsCoordinator: SettingsCoordinator {

func showLoginFlow() {
let loginViewController = settingsSceneDIContainer.makeLoginViewController()
navigationController.pushViewController(loginViewController, animated: true)

loginViewController
.itemDidClick
.bind(onNext: { [weak self] event in
switch event {
case .showSignUpFlow:
self?.showSignUpFlow()
case .back:
self?.navigationController.popViewController(animated: true)
}
})
.disposed(by: disposableBag)

navigationController.pushViewController(loginViewController, animated: true)
}

func showSignUpFlow() {
let signUpViewController = settingsSceneDIContainer.makeSignUpViewController()
navigationController.pushViewController(signUpViewController, animated: true)

signUpViewController
.itemDidClick
.bind(onNext: { [weak self] event in
switch event {
case .back:
self?.navigationController.popToRootViewController(animated: true)
}
})
.disposed(by: disposableBag)
}
}
Loading