Skip to content

Commit

Permalink
Merge branch 'fix/QuestRepository' into feature/SignUpView
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeonhui committed Dec 6, 2022
2 parents defca3a + a490330 commit f9da9c5
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 92 deletions.
6 changes: 0 additions & 6 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -151,15 +151,13 @@
A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; };
A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; };
A5D3C813293DB1BE00F43B76 /* DataConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */; };
A5D3C820293DD52B00F43B76 /* RepositoryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */; };
A5D3C823293DDDAD00F43B76 /* ProtectedUserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */; };
A5D3C828293DDEBE00F43B76 /* QuestsRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */; };
A5D3C829293DDF8A00F43B76 /* DataConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */; };
A5D3C82A293DDF8E00F43B76 /* UserDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD8CCF42935C38300E6EA2F /* UserDTO+Mapping.swift */; };
A5D3C82B293DDF9000F43B76 /* QuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */; };
A5D3C82C293DDF9200F43B76 /* DTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE910292B74C500E1FD60 /* DTO.swift */; };
A5D3C82D293DDF9400F43B76 /* BrowseQuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD8CCF62935D7BB00E6EA2F /* BrowseQuestDTO+Mapping.swift */; };
A5D3C82F293DDF9800F43B76 /* RepositoryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */; };
A5D3C830293DDF9B00F43B76 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; };
A5D3C831293DDF9D00F43B76 /* DefaultAuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A517A84529349D91005CB1E8 /* DefaultAuthRepository.swift */; };
A5D3C832293DDFA000F43B76 /* DefaultUserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511228F29384FAF00384B4B /* DefaultUserRepository.swift */; };
Expand Down Expand Up @@ -347,7 +345,6 @@
A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = "<group>"; };
A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmQuestsStorage.swift; sourceTree = "<group>"; };
A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataConfigure.swift; sourceTree = "<group>"; };
A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepositoryManager.swift; sourceTree = "<group>"; };
A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtectedUserRepository.swift; sourceTree = "<group>"; };
A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepositoryTests.swift; sourceTree = "<group>"; };
B50078D529222F3F0070AFC4 /* CircleCheckView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleCheckView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1019,7 +1016,6 @@
A5AC96D42922356E003B7637 /* Repositories */ = {
isa = PBXGroup;
children = (
A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */,
A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */,
A517A84529349D91005CB1E8 /* DefaultAuthRepository.swift */,
A511228F29384FAF00384B4B /* DefaultUserRepository.swift */,
Expand Down Expand Up @@ -1286,7 +1282,6 @@
A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */,
34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */,
340A7246293455CE00B26AA6 /* AuthRepository.swift in Sources */,
A5D3C820293DD52B00F43B76 /* RepositoryManager.swift in Sources */,
345687FA2937815900CA51E3 /* QuantityView.swift in Sources */,
342830AA292E12C700AE811B /* SettingsViewController.swift in Sources */,
34A529E029247F1F001BAD34 /* HomeViewController.swift in Sources */,
Expand Down Expand Up @@ -1350,7 +1345,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A5D3C82F293DDF9800F43B76 /* RepositoryManager.swift in Sources */,
A5D3C83C293DDFC400F43B76 /* SubQuestEntity+Mapping.swift in Sources */,
A5D3C83D293DDFCC00F43B76 /* QuestEntity.swift in Sources */,
A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ final class RealmStorage {
return entity
}

@discardableResult
func deleteAllEntity<O: Object>(type: O.Type) throws -> [O] {
guard let persistentContainer = persistentContainer else {
print(#function)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,12 @@ final class DefaultBrowseRepository {

private let persistentStorage: BrowseQuestsStorage
private let networkService: NetworkService

private let disposeBag: DisposeBag
private let disposeBag: DisposeBag = DisposeBag()

init(persistentStorage: BrowseQuestsStorage,
networkService: NetworkService = FirebaseService.shared,
repositoryManager: RepositoryManager = RepositoryManager.shared) {
networkService: NetworkService = FirebaseService.shared) {
self.persistentStorage = persistentStorage
self.networkService = networkService
self.disposeBag = repositoryManager.disposeBag
}
}

Expand All @@ -32,36 +29,39 @@ extension DefaultBrowseRepository: BrowseRepository {
func fetch() -> Observable<[BrowseQuest]> {
return self.networkService.getAllowUsers(limit: 10)
.map { $0.toDomain() }
.flatMap { user in
self.networkService
.read(type: QuestDTO.self, userCase: .anotherUser(user.uuid), access: .quests, filter: .today(Date()))
.map { $0.toDomain() }
.toArray()
.asObservable()
.map { questList in
return BrowseQuest(user: user, quests: questList)
}
}

.flatMap(fetchBrowseQuestNetworkService(user:))
.filter { !$0.quests.isEmpty }
.toArray()
.asObservable()
.do(afterNext: { browseQuests in
.do(afterNext: { [weak self] browseQuests in
guard let self = self else { return }
self.persistentStorage.deleteBrowseQuests()
.asObservable()
.concatMap { _ in
Observable.from(browseQuests)
.flatMap { browseQuest in
self.persistentStorage.saveBrowseQuest(browseQuest: browseQuest)
.asObservable()
}
.flatMap (self.saveBrowseQuestPersistentStorage(browseQuest:))
}
.subscribe(onError: { error in
print(error)
}).disposed(by: self.disposeBag)
.subscribe()
.disposed(by: self.disposeBag)
})
.catch { error in
return self.persistentStorage.fetchBrowseQuests()
}
}
}

private extension DefaultBrowseRepository {
func fetchBrowseQuestNetworkService(user: User) -> Observable<BrowseQuest> {
networkService
.read(type: QuestDTO.self, userCase: .anotherUser(user.uuid), access: .quests, filter: .today(Date()))
.map { $0.toDomain() }
.toArray()
.asObservable()
.map { return BrowseQuest(user: user, quests: $0) }
}

func saveBrowseQuestPersistentStorage(browseQuest: BrowseQuest) -> Observable<BrowseQuest> {
persistentStorage.saveBrowseQuest(browseQuest: browseQuest)
.asObservable()
}
}
108 changes: 60 additions & 48 deletions DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import RxSwift
import Foundation

final class DefaultQuestsRepository {

private let persistentStorage: QuestsStorage
private let networkService: NetworkService

init(persistentStorage: QuestsStorage, networkService: NetworkService = FirebaseService.shared) {
self.persistentStorage = persistentStorage
self.networkService = networkService
Expand All @@ -22,74 +22,86 @@ final class DefaultQuestsRepository {
extension DefaultQuestsRepository: QuestsRepository {
func save(with quest: [Quest]) -> Single<[Quest]> {
return persistentStorage.saveQuests(with: quest)
.flatMap { quests in
return Observable.from(quests)
.withUnretained(self)
.concatMap { (owner, quest) in
return owner.networkService.create(userCase: .currentUser,
access: .quests,
dto: quest.toDTO())
.map { $0.toDomain() }
.catchAndReturn(quest)
}
.toArray()
.flatMap (saveNetworkService(quests:))
.do{ event in
print("save", event)
}
}

func fetch(by date: Date) -> Observable<[Quest]> {
return persistentStorage.fetchQuests(by: date)
.catch { _ in
self.networkService.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: .today(date))
.map { $0.toDomain() }
.toArray()
.asObservable()
}
.catch { [weak self] _ in
guard let self = self else { return Observable.just([]) }
return self.fetchNetworkService(date: date)
}
.catchAndReturn([])
}

func update(with quest: Quest) -> Single<Quest> {
return persistentStorage.updateQuest(with: quest)
.flatMap(updateNetworkService(quest:))
}

func delete(with questId: UUID) -> Single<Quest> {
return persistentStorage.deleteQuest(with: questId)
.flatMap { quest in
self.networkService.delete(userCase: .currentUser, access: .quests, dto: quest.toDTO())
}
.map { $0.toDomain() }
.asObservable()
.asSingle()
.flatMap(deleteNetworkService(quest:))
}

func deleteAll(with groupId: UUID) -> Single<[Quest]> {
return persistentStorage.deleteQuestGroup(with: groupId)
.flatMap { quests in
return Observable.from(quests)
.concatMap { quest in
self.networkService.delete(userCase: .currentUser,
access: .quests,
dto: quest.toDTO())
}
.map { $0.toDomain() }
.toArray()
}
.flatMap(deleteAllNetworkService(quests:))
}
func fetch(by uuid: String, date: Date) -> Observable<[Quest]> { // 받을 날짜까지 받아와야함
return self.networkService.read(type: QuestDTO.self,
userCase: .anotherUser(uuid),
access: .quests,
filter: .today(date))
.map { $0.toDomain() }
.toArray()
.asObservable()

func fetch(by uuid: String, date: Date) -> Observable<[Quest]> {
return networkService.read(type: QuestDTO.self,
userCase: .anotherUser(uuid),
access: .quests,
filter: .today(date))
.map { $0.toDomain() }
.toArray()
.asObservable()
}
}

private extension DefaultQuestsRepository {
func saveNetworkService(quests: [Quest]) -> Single<[Quest]> {
return Observable.from(quests)
.withUnretained(self)
.concatMap { (owner, quest) in
return owner.networkService.create(userCase: .currentUser,
access: .quests,
dto: quest.toDTO())
.map { $0.toDomain() }
.catchAndReturn(quest)
}
.toArray()
}

func fetchNetworkService(date: Date) -> Observable<[Quest]> {
return networkService.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: .today(date))
.map { $0.toDomain() }
.toArray()
.asObservable()
.catchAndReturn([])
}

func updateNetworkService(quest: Quest) -> Single<Quest> {
return networkService.update(userCase: .currentUser, access: .quests, dto: quest.toDTO())
.map { $0.toDomain() }
.catchAndReturn(quest)
}

func deleteNetworkService(quest: Quest) -> Single<Quest> {
self.networkService.delete(userCase: .currentUser, access: .quests, dto: quest.toDTO())
.map { $0.toDomain() }
.catchAndReturn(quest)
}

func deleteAllNetworkService(quests: [Quest]) -> Single<[Quest]> {
Observable.from(quests)
.concatMap(deleteNetworkService(quest:))
.toArray()
.catchAndReturn(quests)
}

}
39 changes: 25 additions & 14 deletions DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,28 @@ final class DefaultUserRepository {

extension DefaultUserRepository: UserRepository {
func isLoggedIn() -> BehaviorRelay<String?> {
return self.networkService.uid
return networkService.uid
}

func readUser() -> Observable<User> {
return self.persistentStorage.fetchUserInfo()
.catch { _ in
return self.networkService.read(type: UserDTO.self, userCase: .currentUser, access: .userInfo, filter: nil)
.map { $0.toDomain() }
.catch { [weak self] _ in
guard let self = self else { return Observable.just(User()) }
return self.fetchUserNetworkService()
}
}

func updateUser(by user: User) -> Observable<User> {
return self.persistentStorage.updateUserInfo(user: user)
return persistentStorage.updateUserInfo(user: user)
.asObservable()
.concatMap { _ in
return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO())
.map { $0.toDomain() }
.asObservable()
}
.flatMap(updateUserNetworkService(user:))
}

func fetchUser(by uuid: String) -> Observable<User> {
return self.networkService.read(type: UserDTO.self,
userCase: .anotherUser(uuid),
access: .userInfo,
filter: nil)
return networkService.read(type: UserDTO.self,
userCase: .anotherUser(uuid),
access: .userInfo,
filter: nil)
.map { $0.toDomain() }
}
}
Expand All @@ -62,3 +58,18 @@ extension DefaultUserRepository: ProtectedUserRepository {
}
}
}

private extension DefaultUserRepository {
func fetchUserNetworkService() -> Observable<User> {
networkService.read(type: UserDTO.self, userCase: .currentUser, access: .userInfo, filter: nil)
.map { $0.toDomain() }
}

func updateUserNetworkService(user: User) -> Observable<User> {
networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO())
.map { $0.toDomain() }
.asObservable()
.catchAndReturn(user)
}
}

20 changes: 20 additions & 0 deletions DailyQuest/DailyQuest/Domain/Entities/User.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,24 @@ struct User {
let backgroundImageURL: String
let description: String
let allow: Bool

init(){
self.uuid = ""
self.nickName = ""
self.profileURL = ""
self.backgroundImageURL = ""
self.description = ""
self.allow = false
}

init(uuid: String, nickName: String, profileURL: String, backgroundImageURL: String, description: String, allow: Bool) {
self.uuid = uuid
self.nickName = nickName
self.profileURL = profileURL
self.backgroundImageURL = backgroundImageURL
self.description = description
self.allow = allow
}


}

0 comments on commit f9da9c5

Please sign in to comment.