Skip to content

Commit f9da9c5

Browse files
committed
Merge branch 'fix/QuestRepository' into feature/SignUpView
2 parents defca3a + a490330 commit f9da9c5

File tree

6 files changed

+130
-92
lines changed

6 files changed

+130
-92
lines changed

DailyQuest/DailyQuest.xcodeproj/project.pbxproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,13 @@
151151
A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; };
152152
A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; };
153153
A5D3C813293DB1BE00F43B76 /* DataConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */; };
154-
A5D3C820293DD52B00F43B76 /* RepositoryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */; };
155154
A5D3C823293DDDAD00F43B76 /* ProtectedUserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */; };
156155
A5D3C828293DDEBE00F43B76 /* QuestsRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */; };
157156
A5D3C829293DDF8A00F43B76 /* DataConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */; };
158157
A5D3C82A293DDF8E00F43B76 /* UserDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD8CCF42935C38300E6EA2F /* UserDTO+Mapping.swift */; };
159158
A5D3C82B293DDF9000F43B76 /* QuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */; };
160159
A5D3C82C293DDF9200F43B76 /* DTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE910292B74C500E1FD60 /* DTO.swift */; };
161160
A5D3C82D293DDF9400F43B76 /* BrowseQuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BD8CCF62935D7BB00E6EA2F /* BrowseQuestDTO+Mapping.swift */; };
162-
A5D3C82F293DDF9800F43B76 /* RepositoryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */; };
163161
A5D3C830293DDF9B00F43B76 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; };
164162
A5D3C831293DDF9D00F43B76 /* DefaultAuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A517A84529349D91005CB1E8 /* DefaultAuthRepository.swift */; };
165163
A5D3C832293DDFA000F43B76 /* DefaultUserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511228F29384FAF00384B4B /* DefaultUserRepository.swift */; };
@@ -347,7 +345,6 @@
347345
A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = "<group>"; };
348346
A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmQuestsStorage.swift; sourceTree = "<group>"; };
349347
A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataConfigure.swift; sourceTree = "<group>"; };
350-
A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepositoryManager.swift; sourceTree = "<group>"; };
351348
A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtectedUserRepository.swift; sourceTree = "<group>"; };
352349
A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepositoryTests.swift; sourceTree = "<group>"; };
353350
B50078D529222F3F0070AFC4 /* CircleCheckView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleCheckView.swift; sourceTree = "<group>"; };
@@ -1019,7 +1016,6 @@
10191016
A5AC96D42922356E003B7637 /* Repositories */ = {
10201017
isa = PBXGroup;
10211018
children = (
1022-
A5D3C81F293DD52B00F43B76 /* RepositoryManager.swift */,
10231019
A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */,
10241020
A517A84529349D91005CB1E8 /* DefaultAuthRepository.swift */,
10251021
A511228F29384FAF00384B4B /* DefaultUserRepository.swift */,
@@ -1286,7 +1282,6 @@
12861282
A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */,
12871283
34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */,
12881284
340A7246293455CE00B26AA6 /* AuthRepository.swift in Sources */,
1289-
A5D3C820293DD52B00F43B76 /* RepositoryManager.swift in Sources */,
12901285
345687FA2937815900CA51E3 /* QuantityView.swift in Sources */,
12911286
342830AA292E12C700AE811B /* SettingsViewController.swift in Sources */,
12921287
34A529E029247F1F001BAD34 /* HomeViewController.swift in Sources */,
@@ -1350,7 +1345,6 @@
13501345
isa = PBXSourcesBuildPhase;
13511346
buildActionMask = 2147483647;
13521347
files = (
1353-
A5D3C82F293DDF9800F43B76 /* RepositoryManager.swift in Sources */,
13541348
A5D3C83C293DDFC400F43B76 /* SubQuestEntity+Mapping.swift in Sources */,
13551349
A5D3C83D293DDFCC00F43B76 /* QuestEntity.swift in Sources */,
13561350
A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */,

DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ final class RealmStorage {
7777
return entity
7878
}
7979

80+
@discardableResult
8081
func deleteAllEntity<O: Object>(type: O.Type) throws -> [O] {
8182
guard let persistentContainer = persistentContainer else {
8283
print(#function)

DailyQuest/DailyQuest/Data/Repositories/DefaultBrowseRepository.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,12 @@ final class DefaultBrowseRepository {
1212

1313
private let persistentStorage: BrowseQuestsStorage
1414
private let networkService: NetworkService
15-
16-
private let disposeBag: DisposeBag
15+
private let disposeBag: DisposeBag = DisposeBag()
1716

1817
init(persistentStorage: BrowseQuestsStorage,
19-
networkService: NetworkService = FirebaseService.shared,
20-
repositoryManager: RepositoryManager = RepositoryManager.shared) {
18+
networkService: NetworkService = FirebaseService.shared) {
2119
self.persistentStorage = persistentStorage
2220
self.networkService = networkService
23-
self.disposeBag = repositoryManager.disposeBag
2421
}
2522
}
2623

@@ -32,36 +29,39 @@ extension DefaultBrowseRepository: BrowseRepository {
3229
func fetch() -> Observable<[BrowseQuest]> {
3330
return self.networkService.getAllowUsers(limit: 10)
3431
.map { $0.toDomain() }
35-
.flatMap { user in
36-
self.networkService
37-
.read(type: QuestDTO.self, userCase: .anotherUser(user.uuid), access: .quests, filter: .today(Date()))
38-
.map { $0.toDomain() }
39-
.toArray()
40-
.asObservable()
41-
.map { questList in
42-
return BrowseQuest(user: user, quests: questList)
43-
}
44-
}
45-
32+
.flatMap(fetchBrowseQuestNetworkService(user:))
4633
.filter { !$0.quests.isEmpty }
4734
.toArray()
4835
.asObservable()
49-
.do(afterNext: { browseQuests in
36+
.do(afterNext: { [weak self] browseQuests in
37+
guard let self = self else { return }
5038
self.persistentStorage.deleteBrowseQuests()
5139
.asObservable()
5240
.concatMap { _ in
5341
Observable.from(browseQuests)
54-
.flatMap { browseQuest in
55-
self.persistentStorage.saveBrowseQuest(browseQuest: browseQuest)
56-
.asObservable()
57-
}
42+
.flatMap (self.saveBrowseQuestPersistentStorage(browseQuest:))
5843
}
59-
.subscribe(onError: { error in
60-
print(error)
61-
}).disposed(by: self.disposeBag)
44+
.subscribe()
45+
.disposed(by: self.disposeBag)
6246
})
6347
.catch { error in
6448
return self.persistentStorage.fetchBrowseQuests()
6549
}
6650
}
6751
}
52+
53+
private extension DefaultBrowseRepository {
54+
func fetchBrowseQuestNetworkService(user: User) -> Observable<BrowseQuest> {
55+
networkService
56+
.read(type: QuestDTO.self, userCase: .anotherUser(user.uuid), access: .quests, filter: .today(Date()))
57+
.map { $0.toDomain() }
58+
.toArray()
59+
.asObservable()
60+
.map { return BrowseQuest(user: user, quests: $0) }
61+
}
62+
63+
func saveBrowseQuestPersistentStorage(browseQuest: BrowseQuest) -> Observable<BrowseQuest> {
64+
persistentStorage.saveBrowseQuest(browseQuest: browseQuest)
65+
.asObservable()
66+
}
67+
}

DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import RxSwift
99
import Foundation
1010

1111
final class DefaultQuestsRepository {
12-
12+
1313
private let persistentStorage: QuestsStorage
1414
private let networkService: NetworkService
15-
15+
1616
init(persistentStorage: QuestsStorage, networkService: NetworkService = FirebaseService.shared) {
1717
self.persistentStorage = persistentStorage
1818
self.networkService = networkService
@@ -22,74 +22,86 @@ final class DefaultQuestsRepository {
2222
extension DefaultQuestsRepository: QuestsRepository {
2323
func save(with quest: [Quest]) -> Single<[Quest]> {
2424
return persistentStorage.saveQuests(with: quest)
25-
.flatMap { quests in
26-
return Observable.from(quests)
27-
.withUnretained(self)
28-
.concatMap { (owner, quest) in
29-
return owner.networkService.create(userCase: .currentUser,
30-
access: .quests,
31-
dto: quest.toDTO())
32-
.map { $0.toDomain() }
33-
.catchAndReturn(quest)
34-
}
35-
.toArray()
25+
.flatMap (saveNetworkService(quests:))
26+
.do{ event in
27+
print("save", event)
3628
}
3729
}
38-
30+
3931
func fetch(by date: Date) -> Observable<[Quest]> {
4032
return persistentStorage.fetchQuests(by: date)
41-
.catch { _ in
42-
self.networkService.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: .today(date))
43-
.map { $0.toDomain() }
44-
.toArray()
45-
.asObservable()
46-
}
33+
.catch { [weak self] _ in
34+
guard let self = self else { return Observable.just([]) }
35+
return self.fetchNetworkService(date: date)
36+
}
37+
.catchAndReturn([])
4738
}
48-
39+
4940
func update(with quest: Quest) -> Single<Quest> {
5041
return persistentStorage.updateQuest(with: quest)
5142
.flatMap(updateNetworkService(quest:))
5243
}
53-
44+
5445
func delete(with questId: UUID) -> Single<Quest> {
5546
return persistentStorage.deleteQuest(with: questId)
56-
.flatMap { quest in
57-
self.networkService.delete(userCase: .currentUser, access: .quests, dto: quest.toDTO())
58-
}
59-
.map { $0.toDomain() }
60-
.asObservable()
61-
.asSingle()
47+
.flatMap(deleteNetworkService(quest:))
6248
}
63-
49+
6450
func deleteAll(with groupId: UUID) -> Single<[Quest]> {
6551
return persistentStorage.deleteQuestGroup(with: groupId)
66-
.flatMap { quests in
67-
return Observable.from(quests)
68-
.concatMap { quest in
69-
self.networkService.delete(userCase: .currentUser,
70-
access: .quests,
71-
dto: quest.toDTO())
72-
}
73-
.map { $0.toDomain() }
74-
.toArray()
75-
}
52+
.flatMap(deleteAllNetworkService(quests:))
7653
}
77-
78-
func fetch(by uuid: String, date: Date) -> Observable<[Quest]> { // 받을 날짜까지 받아와야함
79-
return self.networkService.read(type: QuestDTO.self,
80-
userCase: .anotherUser(uuid),
81-
access: .quests,
82-
filter: .today(date))
83-
.map { $0.toDomain() }
84-
.toArray()
85-
.asObservable()
54+
55+
func fetch(by uuid: String, date: Date) -> Observable<[Quest]> {
56+
return networkService.read(type: QuestDTO.self,
57+
userCase: .anotherUser(uuid),
58+
access: .quests,
59+
filter: .today(date))
60+
.map { $0.toDomain() }
61+
.toArray()
62+
.asObservable()
8663
}
8764
}
8865

8966
private extension DefaultQuestsRepository {
67+
func saveNetworkService(quests: [Quest]) -> Single<[Quest]> {
68+
return Observable.from(quests)
69+
.withUnretained(self)
70+
.concatMap { (owner, quest) in
71+
return owner.networkService.create(userCase: .currentUser,
72+
access: .quests,
73+
dto: quest.toDTO())
74+
.map { $0.toDomain() }
75+
.catchAndReturn(quest)
76+
}
77+
.toArray()
78+
}
79+
80+
func fetchNetworkService(date: Date) -> Observable<[Quest]> {
81+
return networkService.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: .today(date))
82+
.map { $0.toDomain() }
83+
.toArray()
84+
.asObservable()
85+
.catchAndReturn([])
86+
}
87+
9088
func updateNetworkService(quest: Quest) -> Single<Quest> {
9189
return networkService.update(userCase: .currentUser, access: .quests, dto: quest.toDTO())
9290
.map { $0.toDomain() }
9391
.catchAndReturn(quest)
9492
}
93+
94+
func deleteNetworkService(quest: Quest) -> Single<Quest> {
95+
self.networkService.delete(userCase: .currentUser, access: .quests, dto: quest.toDTO())
96+
.map { $0.toDomain() }
97+
.catchAndReturn(quest)
98+
}
99+
100+
func deleteAllNetworkService(quests: [Quest]) -> Single<[Quest]> {
101+
Observable.from(quests)
102+
.concatMap(deleteNetworkService(quest:))
103+
.toArray()
104+
.catchAndReturn(quests)
105+
}
106+
95107
}

DailyQuest/DailyQuest/Data/Repositories/DefaultUserRepository.swift

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,28 @@ final class DefaultUserRepository {
2121

2222
extension DefaultUserRepository: UserRepository {
2323
func isLoggedIn() -> BehaviorRelay<String?> {
24-
return self.networkService.uid
24+
return networkService.uid
2525
}
2626

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

3535
func updateUser(by user: User) -> Observable<User> {
36-
return self.persistentStorage.updateUserInfo(user: user)
36+
return persistentStorage.updateUserInfo(user: user)
3737
.asObservable()
38-
.concatMap { _ in
39-
return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO())
40-
.map { $0.toDomain() }
41-
.asObservable()
42-
}
38+
.flatMap(updateUserNetworkService(user:))
4339
}
4440

4541
func fetchUser(by uuid: String) -> Observable<User> {
46-
return self.networkService.read(type: UserDTO.self,
47-
userCase: .anotherUser(uuid),
48-
access: .userInfo,
49-
filter: nil)
42+
return networkService.read(type: UserDTO.self,
43+
userCase: .anotherUser(uuid),
44+
access: .userInfo,
45+
filter: nil)
5046
.map { $0.toDomain() }
5147
}
5248
}
@@ -62,3 +58,18 @@ extension DefaultUserRepository: ProtectedUserRepository {
6258
}
6359
}
6460
}
61+
62+
private extension DefaultUserRepository {
63+
func fetchUserNetworkService() -> Observable<User> {
64+
networkService.read(type: UserDTO.self, userCase: .currentUser, access: .userInfo, filter: nil)
65+
.map { $0.toDomain() }
66+
}
67+
68+
func updateUserNetworkService(user: User) -> Observable<User> {
69+
networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO())
70+
.map { $0.toDomain() }
71+
.asObservable()
72+
.catchAndReturn(user)
73+
}
74+
}
75+

DailyQuest/DailyQuest/Domain/Entities/User.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,24 @@ struct User {
1414
let backgroundImageURL: String
1515
let description: String
1616
let allow: Bool
17+
18+
init(){
19+
self.uuid = ""
20+
self.nickName = ""
21+
self.profileURL = ""
22+
self.backgroundImageURL = ""
23+
self.description = ""
24+
self.allow = false
25+
}
26+
27+
init(uuid: String, nickName: String, profileURL: String, backgroundImageURL: String, description: String, allow: Bool) {
28+
self.uuid = uuid
29+
self.nickName = nickName
30+
self.profileURL = profileURL
31+
self.backgroundImageURL = backgroundImageURL
32+
self.description = description
33+
self.allow = allow
34+
}
35+
36+
1737
}

0 commit comments

Comments
 (0)