Skip to content

Commit

Permalink
Merge pull request #108 from boostcampwm-2022/refactor/Repository
Browse files Browse the repository at this point in the history
Refactor/repository
  • Loading branch information
jinwoong16 committed Dec 8, 2022
2 parents d9dd032 + 62ca546 commit 495d787
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 29 deletions.
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 Down Expand Up @@ -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 {
Expand All @@ -223,6 +226,7 @@ extension FirebaseService {
}
observer.onCompleted()
}

case .receiveQuests:
ref.collection(access.path).getDocuments { (querySnapshot, error) in
for document in querySnapshot!.documents {
Expand Down

0 comments on commit 495d787

Please sign in to comment.