From 010514b68fc533cfb4b030f2fd1ff35ab75730e4 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Thu, 17 Nov 2022 22:35:04 +0900 Subject: [PATCH 01/20] [feat] add Date Extension --- DailyQuest/DailyQuest/Utils/Date+.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 DailyQuest/DailyQuest/Utils/Date+.swift diff --git a/DailyQuest/DailyQuest/Utils/Date+.swift b/DailyQuest/DailyQuest/Utils/Date+.swift new file mode 100644 index 0000000..651b2f3 --- /dev/null +++ b/DailyQuest/DailyQuest/Utils/Date+.swift @@ -0,0 +1,16 @@ +// +// Date+.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/17. +// + +import Foundation + +extension Date { + var toString: String { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + return dateFormatter.string(from: self) + } +} From dc4e6d29a8249c903d79dd97bfdf466a9546b4e7 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Thu, 17 Nov 2022 22:38:08 +0900 Subject: [PATCH 02/20] [feat] NetworkService & FirebaseService - Base Settings Co-Authored-By: Dayeon Lee <43718982+sprituz@users.noreply.github.com> --- .../DailyQuest.xcodeproj/project.pbxproj | 30 ++++++++++++++++++- .../FirebaseService/FirebaseService.swift | 28 +++++++++++++++++ .../Infrastructure/NetworkService.swift | 12 ++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift create mode 100644 DailyQuest/DailyQuest/Infrastructure/NetworkService.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index 5f346ae..be92ba3 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -50,6 +50,9 @@ 34ACC36C291DF0DD00741371 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */; }; 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; + A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3329266F45005C00FE /* NetworkService.swift */; }; + A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3629266F6F005C00FE /* FirebaseService.swift */; }; + A50F9A3929266FD8005C00FE /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3829266FD8005C00FE /* Date+.swift */; }; A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; @@ -127,6 +130,9 @@ 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; + A50F9A3329266F45005C00FE /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; + A50F9A3629266F6F005C00FE /* FirebaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseService.swift; sourceTree = ""; }; + A50F9A3829266FD8005C00FE /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; @@ -213,6 +219,7 @@ 349955112923220E007AB99E /* SwiftUIPreview.swift */, 3499551429232533007AB99E /* UIColor+.swift */, 34874AA129250C43000570DF /* UIButton+.swift */, + A50F9A3829266FD8005C00FE /* Date+.swift */, ); path = Utils; sourceTree = ""; @@ -373,8 +380,9 @@ children = ( 34ACC367291DF00B00741371 /* Application */, 34ACC368291DF02500741371 /* Presentation */, - 34ACC36A291DF04000741371 /* Data */, 34ACC369291DF03600741371 /* Domain */, + 34ACC36A291DF04000741371 /* Data */, + A50F9A3229266F26005C00FE /* Infrastructure */, 34995510292321FD007AB99E /* Utils */, 34ACC335291DE9C100741371 /* Assets.xcassets */, 34ACC337291DE9C100741371 /* LaunchScreen.storyboard */, @@ -453,6 +461,23 @@ path = View; sourceTree = ""; }; + A50F9A3229266F26005C00FE /* Infrastructure */ = { + isa = PBXGroup; + children = ( + A50F9A3329266F45005C00FE /* NetworkService.swift */, + A50F9A3529266F5C005C00FE /* FirebaseService */, + ); + path = Infrastructure; + sourceTree = ""; + }; + A50F9A3529266F5C005C00FE /* FirebaseService */ = { + isa = PBXGroup; + children = ( + A50F9A3629266F6F005C00FE /* FirebaseService.swift */, + ); + path = FirebaseService; + sourceTree = ""; + }; A51189C029226DF7008A9D33 /* RealmStorage */ = { isa = PBXGroup; children = ( @@ -723,6 +748,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A50F9A3929266FD8005C00FE /* Date+.swift in Sources */, 34A529D129247880001BAD34 /* Coordinator.swift in Sources */, 3499552029234637007AB99E /* CustomProgressBar.swift in Sources */, 34A529E22924816A001BAD34 /* BrowseSceneDIContainer.swift in Sources */, @@ -736,6 +762,7 @@ 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */, 3449AD5D2922197000B87619 /* User.swift in Sources */, A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */, + A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */, A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */, A5AC96E629223F06003B7637 /* UserQuestsStorage.swift in Sources */, A51F01D52923407E0031ECA2 /* BrowseQuestEntity.swift in Sources */, @@ -756,6 +783,7 @@ A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */, A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */, A51F01D3292340360031ECA2 /* BrowseQuestsStorage.swift in Sources */, + A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */, 34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */, A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */, A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift new file mode 100644 index 0000000..318e0f5 --- /dev/null +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -0,0 +1,28 @@ +// +// FirebaseService.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/17. +// + +import RxSwift +import Firebase +import FirebaseAuth +import FirebaseFirestore + +final class FirebaseService { + static let shared = FirebaseService() + private let auth: Auth + private let db: Firestore + + private(set) var uid: String? + + private init() { + FirebaseApp.configure() + db = Firestore.firestore() + auth = Auth.auth() + uid = auth.currentUser?.uid + } + +} + diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift new file mode 100644 index 0000000..6b5588d --- /dev/null +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift @@ -0,0 +1,12 @@ +// +// NetworkService.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/17. +// + +import RxSwift + +protocol NetworkService { + var uid: String? { get } +} From 078c39e4d45e01a454a9e62a3d4e98215237837c Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 15:21:00 +0900 Subject: [PATCH 03/20] [feat] NetworkService protocol Co-Authored-By: Dayeon Lee <43718982+sprituz@users.noreply.github.com> --- .../DailyQuest.xcodeproj/project.pbxproj | 4 ++ .../FirebaseService/FirebaseService.swift | 42 ++++++++++++++++++- .../Infrastructure/NetworkConfigure.swift | 19 +++++++++ .../Infrastructure/NetworkService.swift | 9 ++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index be92ba3..5d24b17 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -53,6 +53,7 @@ A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3329266F45005C00FE /* NetworkService.swift */; }; A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3629266F6F005C00FE /* FirebaseService.swift */; }; A50F9A3929266FD8005C00FE /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3829266FD8005C00FE /* Date+.swift */; }; + A50F9A3F292679BC005C00FE /* NetworkConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3E292679BC005C00FE /* NetworkConfigure.swift */; }; A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; @@ -133,6 +134,7 @@ A50F9A3329266F45005C00FE /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; A50F9A3629266F6F005C00FE /* FirebaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseService.swift; sourceTree = ""; }; A50F9A3829266FD8005C00FE /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; + A50F9A3E292679BC005C00FE /* NetworkConfigure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConfigure.swift; sourceTree = ""; }; A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; @@ -465,6 +467,7 @@ isa = PBXGroup; children = ( A50F9A3329266F45005C00FE /* NetworkService.swift */, + A50F9A3E292679BC005C00FE /* NetworkConfigure.swift */, A50F9A3529266F5C005C00FE /* FirebaseService */, ); path = Infrastructure; @@ -757,6 +760,7 @@ 3499551E29233DEF007AB99E /* QuestCell.swift in Sources */, 34A529DC29247BB6001BAD34 /* HomeSceneDIContainer.swift in Sources */, 34874AA229250C43000570DF /* UIButton+.swift in Sources */, + A50F9A3F292679BC005C00FE /* NetworkConfigure.swift in Sources */, 34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */, 34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */, 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index 318e0f5..fccc50f 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -10,7 +10,7 @@ import Firebase import FirebaseAuth import FirebaseFirestore -final class FirebaseService { +final class FirebaseService: NetworkService { static let shared = FirebaseService() private let auth: Auth private let db: Firestore @@ -24,5 +24,45 @@ final class FirebaseService { uid = auth.currentUser?.uid } + private func documnetReference(userCase: UserCase, access: Access) -> DocumentReference? { + switch userCase { + case .currentUser: + guard let currentUserUid = uid else { return nil } + return db.collection("users").document(currentUserUid) + case let .anotherUser(uid): + return db.collection("users").document(uid) + } + } + + func create(userCase: UserCase, access: Access) -> Single { + return Single.create { single in + + + return Disposables.create() + } + } + + func read(userCase: UserCase, access: Access) -> Observable { + return Observable.create { observer in + + + return Disposables.create() + } + } + + func update(userCase: UserCase, access: Access) -> Single { + return Single.create { single in + + return Disposables.create() + } + } + + func delete(userCase: UserCase, access: Access) -> Single { + return Single.create { single in + + return Disposables.create() + } + } + } diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift new file mode 100644 index 0000000..a84397b --- /dev/null +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift @@ -0,0 +1,19 @@ +// +// NetworkConfigure.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/17. +// + +import Foundation + +enum UserCase { + case currentUser + case anotherUser(_ uid: String) +} + +enum Access { + case quests + case receiveQuests + case userInfo +} diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift index 6b5588d..b2d19bc 100644 --- a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift @@ -7,6 +7,15 @@ import RxSwift +enum NetworkServiceError { + case noAuth +} + protocol NetworkService { var uid: String? { get } + + func create(userCase: UserCase, access: Access) -> Single + func read(userCase: UserCase, access: Access) -> Observable + func update(userCase: UserCase, access: Access) -> Single + func delete(userCase: UserCase, access: Access) -> Single } From 946c2a35da614b74e11aeb98602fbcd0afce9d5c Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 16:49:17 +0900 Subject: [PATCH 04/20] [feat] create DefaultQuestsRepository --- .../DailyQuest.xcodeproj/project.pbxproj | 12 ++---- .../DefaultQuestsRepository.swift | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index b07ea3b..c4026b9 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; }; 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; + A50DE906292B53D900E1FD60 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; }; A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; @@ -129,6 +130,7 @@ 34CAE317292B19A3007653AD /* QuestsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepository.swift; sourceTree = ""; }; 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; + A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestsRepository.swift; sourceTree = ""; }; A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; @@ -528,18 +530,11 @@ A5AC96D42922356E003B7637 /* Repositories */ = { isa = PBXGroup; children = ( - A5AC96D52922357E003B7637 /* Util */, + A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */, ); path = Repositories; sourceTree = ""; }; - A5AC96D52922357E003B7637 /* Util */ = { - isa = PBXGroup; - children = ( - ); - path = Util; - sourceTree = ""; - }; A5AC96D62922359F003B7637 /* PersistentStorages */ = { isa = PBXGroup; children = ( @@ -756,6 +751,7 @@ B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */, 3499551529232533007AB99E /* UIColor+.swift in Sources */, 34A529DA29247B9C001BAD34 /* AppDIContainer.swift in Sources */, + A50DE906292B53D900E1FD60 /* DefaultQuestsRepository.swift in Sources */, 34ACC32D291DE9C000741371 /* AppDelegate.swift in Sources */, A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */, A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift new file mode 100644 index 0000000..aad4a5d --- /dev/null +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -0,0 +1,41 @@ +// +// DefaultQuestsRepository.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/21. +// + +import RxSwift + +final class DefaultQuestsRepository { + + private let cache: UserQuestsStorage + + init(cache: UserQuestsStorage){ + self.cache = cache + } +} + +extension DefaultQuestsRepository: QuestsRepository { + func save(with quest: [Quest]) -> RxSwift.Single<[Quest]> { + + } + + func fetch(by date: Date) -> RxSwift.Observable<[Quest]> { + + } + + func update(with quest: Quest) -> RxSwift.Single { + + } + + func delete(with questId: UUID) -> RxSwift.Single { + + } + + func deleteAll(with groupId: UUID) -> RxSwift.Single<[Quest]> { + + } + + +} From cbaa233421e6779443343b22a32486e9136d6206 Mon Sep 17 00:00:00 2001 From: Dayeon Lee Date: Mon, 21 Nov 2022 17:03:34 +0900 Subject: [PATCH 05/20] [feat] Add DTO Co-Authored-By: Jeonhui Lee <48307153+Jeonhui@users.noreply.github.com> --- .../DailyQuest.xcodeproj/project.pbxproj | 20 ++++++++++++++ .../Application/SceneDelegate.swift | 2 +- .../DataMapping/QuestDTO+Mapping.swift | 26 +++++++++++++++++++ .../FirebaseService/FirebaseService.swift | 22 +++++++++++++--- .../Infrastructure/NetworkService.swift | 2 +- 5 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index eb0605c..4ea9d08 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; }; 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; + 9B1CFB3F292B585700CCE97A /* QuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */; }; A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3329266F45005C00FE /* NetworkService.swift */; }; A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3629266F6F005C00FE /* FirebaseService.swift */; }; A50F9A3929266FD8005C00FE /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3829266FD8005C00FE /* Date+.swift */; }; @@ -133,6 +134,7 @@ 34CAE317292B19A3007653AD /* QuestsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepository.swift; sourceTree = ""; }; 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; + 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QuestDTO+Mapping.swift"; sourceTree = ""; }; A50F9A3329266F45005C00FE /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; A50F9A3629266F6F005C00FE /* FirebaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseService.swift; sourceTree = ""; }; A50F9A3829266FD8005C00FE /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; @@ -451,6 +453,7 @@ 34ACC36A291DF04000741371 /* Data */ = { isa = PBXGroup; children = ( + 9B1CFB3C292B580C00CCE97A /* Network */, A5AC96D42922356E003B7637 /* Repositories */, A5AC96D62922359F003B7637 /* PersistentStorages */, ); @@ -466,6 +469,22 @@ path = View; sourceTree = ""; }; + 9B1CFB3C292B580C00CCE97A /* Network */ = { + isa = PBXGroup; + children = ( + 9B1CFB3D292B581D00CCE97A /* DataMapping */, + ); + path = Network; + sourceTree = ""; + }; + 9B1CFB3D292B581D00CCE97A /* DataMapping */ = { + isa = PBXGroup; + children = ( + 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */, + ); + path = DataMapping; + sourceTree = ""; + }; A50F9A3229266F26005C00FE /* Infrastructure */ = { isa = PBXGroup; children = ( @@ -792,6 +811,7 @@ A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */, A51F01D3292340360031ECA2 /* BrowseQuestsStorage.swift in Sources */, A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */, + 9B1CFB3F292B585700CCE97A /* QuestDTO+Mapping.swift in Sources */, 34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */, A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */, A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Application/SceneDelegate.swift b/DailyQuest/DailyQuest/Application/SceneDelegate.swift index 0959c77..4c2ce77 100644 --- a/DailyQuest/DailyQuest/Application/SceneDelegate.swift +++ b/DailyQuest/DailyQuest/Application/SceneDelegate.swift @@ -25,7 +25,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { self.window = UIWindow(windowScene: windowScene) self.window?.rootViewController = tabbarController self.window?.makeKeyAndVisible() - + FirebaseService.shared.create(userCase: .currentUser, access: .quests, dto: QuestDTO(uuid: UUID(), title: "", currentCount: 0, totalCount: 0, groupUid: UUID())) self.appCoordinator = AppCoordinator(tabBarController: tabbarController, appDIContainer: appDIContainer) self.appCoordinator?.start() diff --git a/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift b/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift new file mode 100644 index 0000000..f65a62c --- /dev/null +++ b/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift @@ -0,0 +1,26 @@ +// +// QuestDTO+Mapping.swift +// DailyQuest +// +// Created by 이다연 on 2022/11/21. +// + +import Foundation + +struct QuestDTO: Codable { + let uuid: UUID + let title: String + let currentCount: Int + let totalCount: Int + let groupUid: UUID +} + +extension QuestDTO { + func toDomain() -> Quest { + return Quest(groupId: groupUid, + uuid: uuid, + title: title, + currentCount: currentCount, + totalCount: totalCount) + } +} diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index fccc50f..349227e 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -24,7 +24,7 @@ final class FirebaseService: NetworkService { uid = auth.currentUser?.uid } - private func documnetReference(userCase: UserCase, access: Access) -> DocumentReference? { + private func documnetReference(userCase: UserCase) -> DocumentReference? { switch userCase { case .currentUser: guard let currentUserUid = uid else { return nil } @@ -34,10 +34,24 @@ final class FirebaseService: NetworkService { } } - func create(userCase: UserCase, access: Access) -> Single { + func create(userCase: UserCase, access: Access, dto: T) -> Single { return Single.create { single in - - + switch access { + case .quests: + self.db.collection("users").document("user1").collection("quests").getDocuments { (querySnapshot, err) in + if let err = err { + print("Error getting documents: \(err)") + } else { + for document in querySnapshot!.documents { + print("\(document.documentID) => \(document.data())") + } + } + } + case .receiveQuests: + break + case .userInfo: + break + } return Disposables.create() } } diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift index b2d19bc..3d4d7f7 100644 --- a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift @@ -14,7 +14,7 @@ enum NetworkServiceError { protocol NetworkService { var uid: String? { get } - func create(userCase: UserCase, access: Access) -> Single + func create(userCase: UserCase, access: Access, dto: T) -> Single func read(userCase: UserCase, access: Access) -> Observable func update(userCase: UserCase, access: Access) -> Single func delete(userCase: UserCase, access: Access) -> Single From 751b921543cae56e75c8fe31ffcaccd9ce1b5ef4 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 17:51:06 +0900 Subject: [PATCH 06/20] [feat] firebase test Co-Authored-By: Dayeon Lee <43718982+sprituz@users.noreply.github.com> --- .../Application/SceneDelegate.swift | 6 +++- .../FirebaseService/FirebaseService.swift | 34 +++++++++++++------ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/DailyQuest/DailyQuest/Application/SceneDelegate.swift b/DailyQuest/DailyQuest/Application/SceneDelegate.swift index 4c2ce77..8c27dd8 100644 --- a/DailyQuest/DailyQuest/Application/SceneDelegate.swift +++ b/DailyQuest/DailyQuest/Application/SceneDelegate.swift @@ -6,6 +6,7 @@ // import UIKit +import RxSwift class SceneDelegate: UIResponder, UIWindowSceneDelegate { @@ -25,7 +26,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { self.window = UIWindow(windowScene: windowScene) self.window?.rootViewController = tabbarController self.window?.makeKeyAndVisible() - FirebaseService.shared.create(userCase: .currentUser, access: .quests, dto: QuestDTO(uuid: UUID(), title: "", currentCount: 0, totalCount: 0, groupUid: UUID())) + + _ = FirebaseService.shared.create(userCase: .currentUser, access: .quests, dto: QuestDTO(uuid: UUID(), title: "", currentCount: 0, totalCount: 0, groupUid: UUID())) + + self.appCoordinator = AppCoordinator(tabBarController: tabbarController, appDIContainer: appDIContainer) self.appCoordinator?.start() diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index 349227e..41ba7ca 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -8,7 +8,7 @@ import RxSwift import Firebase import FirebaseAuth -import FirebaseFirestore +import FirebaseFirestoreSwift final class FirebaseService: NetworkService { static let shared = FirebaseService() @@ -35,18 +35,32 @@ final class FirebaseService: NetworkService { } func create(userCase: UserCase, access: Access, dto: T) -> Single { + self.db.collection("users").document("user1").collection("quests") + .whereField("date", isEqualTo: Date().toString) + .getDocuments { (querySnapshot, err) in + if let err = err { + print("Error getting documents: \(err)") + } else { + for document in querySnapshot!.documents { + print("\(document.documentID) => \(document.data())") + } + } + } + + let data = QuestDTO(uuid: UUID(), title: "이다연 여기 묻히다", currentCount: 0, totalCount: 0, groupUid: UUID()) + + do { + try self.db.collection("users").document("user1").collection("quests") + .document("\(data.uuid)") + .setData(from: data) + } catch let error { + print(error) + } + return Single.create { single in switch access { case .quests: - self.db.collection("users").document("user1").collection("quests").getDocuments { (querySnapshot, err) in - if let err = err { - print("Error getting documents: \(err)") - } else { - for document in querySnapshot!.documents { - print("\(document.documentID) => \(document.data())") - } - } - } + break case .receiveQuests: break case .userInfo: From cdce33bfecda680a59990d2b240522ae5e13ca90 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 19:13:18 +0900 Subject: [PATCH 07/20] [feat] update DTO Protocol Co-Authored-By: Dayeon Lee <43718982+sprituz@users.noreply.github.com> --- .../DailyQuest.xcodeproj/project.pbxproj | 52 ++++++++++--------- .../Data/Network/DataMapping/DTO.swift | 12 +++++ .../DataMapping/QuestDTO+Mapping.swift | 2 +- 3 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 DailyQuest/DailyQuest/Data/Network/DataMapping/DTO.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index 4ea9d08..10dcd41 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -43,15 +43,16 @@ 34ACC344291DE9C100741371 /* DailyQuestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC343291DE9C100741371 /* DailyQuestTests.swift */; }; 34ACC34E291DE9C100741371 /* DailyQuestUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC34D291DE9C100741371 /* DailyQuestUITests.swift */; }; 34ACC350291DE9C100741371 /* DailyQuestUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC34F291DE9C100741371 /* DailyQuestUITestsLaunchTests.swift */; }; - 34ACC360291DEF6100741371 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC35F291DEF6100741371 /* FirebaseAuth */; }; - 34ACC362291DEF6100741371 /* FirebaseDatabase in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC361291DEF6100741371 /* FirebaseDatabase */; }; - 34ACC364291DEF6100741371 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC363291DEF6100741371 /* FirebaseFirestore */; }; - 34ACC366291DEF6100741371 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC365291DEF6100741371 /* FirebaseStorage */; }; 34ACC36C291DF0DD00741371 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */; }; 34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; }; 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; 9B1CFB3F292B585700CCE97A /* QuestDTO+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */; }; + A50DE909292B73B900E1FD60 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = A50DE908292B73B900E1FD60 /* FirebaseAuth */; }; + A50DE90B292B73B900E1FD60 /* FirebaseDatabaseSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A50DE90A292B73B900E1FD60 /* FirebaseDatabaseSwift */; }; + A50DE90D292B73B900E1FD60 /* FirebaseFirestoreSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A50DE90C292B73B900E1FD60 /* FirebaseFirestoreSwift */; }; + A50DE90F292B73B900E1FD60 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = A50DE90E292B73B900E1FD60 /* FirebaseStorage */; }; + A50DE911292B74C500E1FD60 /* DTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE910292B74C500E1FD60 /* DTO.swift */; }; A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3329266F45005C00FE /* NetworkService.swift */; }; A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3629266F6F005C00FE /* FirebaseService.swift */; }; A50F9A3929266FD8005C00FE /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50F9A3829266FD8005C00FE /* Date+.swift */; }; @@ -135,6 +136,7 @@ 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QuestDTO+Mapping.swift"; sourceTree = ""; }; + A50DE910292B74C500E1FD60 /* DTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DTO.swift; sourceTree = ""; }; A50F9A3329266F45005C00FE /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; A50F9A3629266F6F005C00FE /* FirebaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseService.swift; sourceTree = ""; }; A50F9A3829266FD8005C00FE /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; @@ -162,14 +164,14 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A50DE90B292B73B900E1FD60 /* FirebaseDatabaseSwift in Frameworks */, A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */, + A50DE909292B73B900E1FD60 /* FirebaseAuth in Frameworks */, + A50DE90D292B73B900E1FD60 /* FirebaseFirestoreSwift in Frameworks */, 34131399291E47D300E607E1 /* RxSwift in Frameworks */, - 34ACC362291DEF6100741371 /* FirebaseDatabase in Frameworks */, - 34ACC366291DEF6100741371 /* FirebaseStorage in Frameworks */, + A50DE90F292B73B900E1FD60 /* FirebaseStorage in Frameworks */, 3413139C291E480500E607E1 /* SnapKit in Frameworks */, 34131397291E47D300E607E1 /* RxCocoa in Frameworks */, - 34ACC360291DEF6100741371 /* FirebaseAuth in Frameworks */, - 34ACC364291DEF6100741371 /* FirebaseFirestore in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -481,6 +483,7 @@ isa = PBXGroup; children = ( 9B1CFB3E292B585700CCE97A /* QuestDTO+Mapping.swift */, + A50DE910292B74C500E1FD60 /* DTO.swift */, ); path = DataMapping; sourceTree = ""; @@ -643,14 +646,14 @@ ); name = DailyQuest; packageProductDependencies = ( - 34ACC35F291DEF6100741371 /* FirebaseAuth */, - 34ACC361291DEF6100741371 /* FirebaseDatabase */, - 34ACC363291DEF6100741371 /* FirebaseFirestore */, - 34ACC365291DEF6100741371 /* FirebaseStorage */, 34131396291E47D300E607E1 /* RxCocoa */, 34131398291E47D300E607E1 /* RxSwift */, 3413139B291E480500E607E1 /* SnapKit */, A5AC96DE292239CA003B7637 /* RealmSwift */, + A50DE908292B73B900E1FD60 /* FirebaseAuth */, + A50DE90A292B73B900E1FD60 /* FirebaseDatabaseSwift */, + A50DE90C292B73B900E1FD60 /* FirebaseFirestoreSwift */, + A50DE90E292B73B900E1FD60 /* FirebaseStorage */, ); productName = DailyQuest; productReference = 34ACC329291DE9C000741371 /* DailyQuest.app */; @@ -725,10 +728,10 @@ ); mainGroup = 34ACC320291DE9C000741371; packageReferences = ( - 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, 34131395291E47D300E607E1 /* XCRemoteSwiftPackageReference "RxSwift" */, 3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */, A5AC96DD292239CA003B7637 /* XCRemoteSwiftPackageReference "realm-swift" */, + A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, ); productRefGroup = 34ACC32A291DE9C000741371 /* Products */; projectDirPath = ""; @@ -787,6 +790,7 @@ 34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */, 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */, 34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */, + A50DE911292B74C500E1FD60 /* DTO.swift in Sources */, 3449AD5D2922197000B87619 /* User.swift in Sources */, A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */, A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */, @@ -1168,7 +1172,7 @@ kind = branch; }; }; - 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; requirement = { @@ -1202,24 +1206,24 @@ package = 3413139A291E480500E607E1 /* XCRemoteSwiftPackageReference "SnapKit" */; productName = SnapKit; }; - 34ACC35F291DEF6100741371 /* FirebaseAuth */ = { + A50DE908292B73B900E1FD60 /* FirebaseAuth */ = { isa = XCSwiftPackageProductDependency; - package = 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + package = A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; productName = FirebaseAuth; }; - 34ACC361291DEF6100741371 /* FirebaseDatabase */ = { + A50DE90A292B73B900E1FD60 /* FirebaseDatabaseSwift */ = { isa = XCSwiftPackageProductDependency; - package = 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; - productName = FirebaseDatabase; + package = A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseDatabaseSwift; }; - 34ACC363291DEF6100741371 /* FirebaseFirestore */ = { + A50DE90C292B73B900E1FD60 /* FirebaseFirestoreSwift */ = { isa = XCSwiftPackageProductDependency; - package = 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; - productName = FirebaseFirestore; + package = A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseFirestoreSwift; }; - 34ACC365291DEF6100741371 /* FirebaseStorage */ = { + A50DE90E292B73B900E1FD60 /* FirebaseStorage */ = { isa = XCSwiftPackageProductDependency; - package = 34ACC35E291DEF6100741371 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + package = A50DE907292B73B900E1FD60 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; productName = FirebaseStorage; }; A5AC96DE292239CA003B7637 /* RealmSwift */ = { diff --git a/DailyQuest/DailyQuest/Data/Network/DataMapping/DTO.swift b/DailyQuest/DailyQuest/Data/Network/DataMapping/DTO.swift new file mode 100644 index 0000000..c6d52ed --- /dev/null +++ b/DailyQuest/DailyQuest/Data/Network/DataMapping/DTO.swift @@ -0,0 +1,12 @@ +// +// DTO.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/21. +// + +import Foundation + +protocol DTO: Codable { + var uuid: UUID { get } +} diff --git a/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift b/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift index f65a62c..47608e8 100644 --- a/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift @@ -7,7 +7,7 @@ import Foundation -struct QuestDTO: Codable { +struct QuestDTO: DTO { let uuid: UUID let title: String let currentCount: Int From 1f20391f3a352ac6175da352ed831c4a9081512f Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 19:13:59 +0900 Subject: [PATCH 08/20] [feat] update NetworkService & firebaseService Co-Authored-By: Dayeon Lee <43718982+sprituz@users.noreply.github.com> --- .../FirebaseService/FirebaseService.swift | 99 +++++++++++++------ .../Infrastructure/NetworkConfigure.swift | 6 ++ .../Infrastructure/NetworkService.swift | 4 +- 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index 41ba7ca..40aaf51 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -24,54 +24,93 @@ final class FirebaseService: NetworkService { uid = auth.currentUser?.uid } - private func documnetReference(userCase: UserCase) -> DocumentReference? { + private func documentReference(userCase: UserCase) -> DocumentReference? { switch userCase { case .currentUser: - guard let currentUserUid = uid else { return nil } - return db.collection("users").document(currentUserUid) + // guard let currentUserUid = uid else { return nil } + return db.collection("users").document("user1") // user 변경해야해요 case let .anotherUser(uid): return db.collection("users").document(uid) } } - func create(userCase: UserCase, access: Access, dto: T) -> Single { - self.db.collection("users").document("user1").collection("quests") - .whereField("date", isEqualTo: Date().toString) - .getDocuments { (querySnapshot, err) in - if let err = err { - print("Error getting documents: \(err)") - } else { - for document in querySnapshot!.documents { - print("\(document.documentID) => \(document.data())") - } - } - } - - let data = QuestDTO(uuid: UUID(), title: "이다연 여기 묻히다", currentCount: 0, totalCount: 0, groupUid: UUID()) - - do { - try self.db.collection("users").document("user1").collection("quests") - .document("\(data.uuid)") - .setData(from: data) - } catch let error { - print(error) - } - + func create(userCase: UserCase, access: Access, dto: T) -> Single { return Single.create { single in + guard let uid = self.uid, let ref = self.documentReference(userCase: userCase) else { + // single(.failure()) // Firebase Error 추가 + return Disposables.create() + } + switch access { case .quests: - break + do { + try ref.collection("quests") + .document("\(dto.uuid)") + .setData(from: dto) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } case .receiveQuests: - break + do { + try ref.collection("receiveQuests") + .document(uid) + .setData(from: dto) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } case .userInfo: - break + do { + try ref + .setData(from: dto) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } } return Disposables.create() } } - func read(userCase: UserCase, access: Access) -> Observable { + func read(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition? = nil) -> Observable { + return Observable.create { observer in + guard let ref = self.documentReference(userCase: userCase) else { + // single(.failure()) // Firebase Error 추가 + return Disposables.create() + } + + switch access { + case .quests: + print("aaaa") + let ref = ref.collection("quests") + switch condition { + case .none: + break + case let .today(date): + ref.whereField("date", isEqualTo: date.toString) + .getDocuments { (querySnapshot, err) in + for document in querySnapshot!.documents { + print("\(document.documentID) => \(document.data())") + do { + let quest = try document.data(as: type) + observer.onNext(quest) + } catch let error { + print(error) + } + } + } + case .some(.month(_)): + break + case .some(.year(_date: let _date)): + break + } + case .receiveQuests: + break + case .userInfo: + break + } return Disposables.create() diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift index a84397b..c05e581 100644 --- a/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift @@ -17,3 +17,9 @@ enum Access { case receiveQuests case userInfo } + +enum NetworkCondition { + case today(_ date: Date) + case month(_ date: Date) + case year(_date: Date) +} diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift index 3d4d7f7..905635a 100644 --- a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift @@ -14,8 +14,8 @@ enum NetworkServiceError { protocol NetworkService { var uid: String? { get } - func create(userCase: UserCase, access: Access, dto: T) -> Single - func read(userCase: UserCase, access: Access) -> Observable + func create(userCase: UserCase, access: Access, dto: T) -> Single + func read(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition?) -> Observable func update(userCase: UserCase, access: Access) -> Single func delete(userCase: UserCase, access: Access) -> Single } From 69c184ed93651b837c621ae04a285e0ae5a8db31 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 21:02:36 +0900 Subject: [PATCH 09/20] [fix] UserQuestEntity --- .../RealmStorage/Entities/UserQuestEntity.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift index a24ab27..323227f 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift @@ -11,9 +11,6 @@ import RealmSwift final class UserQuestEntity: Object { @Persisted var uuid: UUID @Persisted var title: String - @Persisted var startDay: Date - @Persisted var endDay: Date - @Persisted var `repeat`: Int @Persisted var currentCount: Int @Persisted var totalCount: Int @@ -22,8 +19,6 @@ final class UserQuestEntity: Object { init(uuid: UUID, title: String, startDay: Date, endDay: Date, currentCount: Int, totalCount: Int) { self.uuid = uuid self.title = title - self.startDay = startDay - self.endDay = endDay self.currentCount = currentCount self.totalCount = totalCount } From 9ebd39c1e3215acc6bab0e758266dc3040c546b5 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 21:51:15 +0900 Subject: [PATCH 10/20] [fix] UserQuestEntity --- DailyQuest/DailyQuest.xcodeproj/project.pbxproj | 4 ++++ .../RealmStorage/Entities/UserQuestEntity.swift | 3 ++- .../RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift | 2 -- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index c4026b9..31d9cc6 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01D7292343A80031ECA2 /* RealmBrowseQuestsStorage.swift */; }; A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01D9292345990031ECA2 /* BrowseQuest.swift */; }; A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */; }; + A565644E292BA58E0033E763 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644D292BA58E0033E763 /* Date+.swift */; }; A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; A5AC96DC292237C3003B7637 /* UserQuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* UserQuestEntity.swift */; }; A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5AC96DE292239CA003B7637 /* RealmSwift */; }; @@ -141,6 +142,7 @@ A51F01D7292343A80031ECA2 /* RealmBrowseQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmBrowseQuestsStorage.swift; sourceTree = ""; }; A51F01D9292345990031ECA2 /* BrowseQuest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseQuest.swift; sourceTree = ""; }; A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BrowseQuestEntity+Mapping.swift"; sourceTree = ""; }; + A565644D292BA58E0033E763 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A5AC96D829223648003B7637 /* RealmStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmStorage.swift; sourceTree = ""; }; A5AC96DB292237C3003B7637 /* UserQuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserQuestEntity.swift; sourceTree = ""; }; A5AC96E529223F06003B7637 /* UserQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserQuestsStorage.swift; sourceTree = ""; }; @@ -217,6 +219,7 @@ 349955112923220E007AB99E /* SwiftUIPreview.swift */, 3499551429232533007AB99E /* UIColor+.swift */, 34874AA129250C43000570DF /* UIButton+.swift */, + A565644D292BA58E0033E763 /* Date+.swift */, ); path = Utils; sourceTree = ""; @@ -721,6 +724,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A565644E292BA58E0033E763 /* Date+.swift in Sources */, 34A529D129247880001BAD34 /* Coordinator.swift in Sources */, 3499552029234637007AB99E /* CustomProgressBar.swift in Sources */, 34A529E22924816A001BAD34 /* BrowseSceneDIContainer.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift index 323227f..f718ffa 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift @@ -9,6 +9,7 @@ import Foundation import RealmSwift final class UserQuestEntity: Object { + @Persisted var groupId: UUID @Persisted var uuid: UUID @Persisted var title: String @Persisted var currentCount: Int @@ -16,7 +17,7 @@ final class UserQuestEntity: Object { override init() { } - init(uuid: UUID, title: String, startDay: Date, endDay: Date, currentCount: Int, totalCount: Int) { + init(uuid: UUID, title: String, currentCount: Int, totalCount: Int) { self.uuid = uuid self.title = title self.currentCount = currentCount diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift index 01b37bf..a44d821 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift @@ -11,8 +11,6 @@ extension UserQuestEntity { convenience init(quest: Quest) { self.init(uuid: quest.uuid, title: quest.title, - startDay: Date(), // no more use - endDay: Date(), // no more use currentCount: quest.currentCount, totalCount: quest.totalCount) } From 99462931b9b6f3e9051f783db8bbb4928bb20e11 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 21:52:15 +0900 Subject: [PATCH 11/20] [fix] change func name (updateEntity->saveEntity)) --- .../RealmStorage/RealmBrowseQuestsStorage.swift | 2 +- .../UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift index 9e896d1..640dd0e 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/RealmBrowseQuestsStorage.swift @@ -45,7 +45,7 @@ extension RealmBrowseQuestsStorage: BrowseQuestsStorage { let browseQuestEntity = BrowseQuestEntity(browseQuest: browseQuest) do { - try realmStorage.updateEntity(entity: browseQuestEntity) + try realmStorage.saveEntity(entity: browseQuestEntity) single(.success(browseQuest)) } catch let error { single(.failure(RealmStorageError.saveError(error))) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift index 176b611..d3e4732 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserInfoStorage/RealmStorage/RealmUserInfoStorage.swift @@ -52,7 +52,7 @@ extension RealmUserInfoStorage: UserInfoStorage { do { // update 성공했을 경우, success(user) - try realmStorage.updateEntity(entity: userInfo) + try realmStorage.saveEntity(entity: userInfo) single(.success(user)) } catch let error { // update 성공하지 못했을 경우, failure(error) From bc20aa6fa70b4d7f1056f4209d162e7861e67523 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 21:53:15 +0900 Subject: [PATCH 12/20] [feat] DefaultQuestsRepository --- .../RealmStorage/RealmStorage.swift | 45 ++++++++++- .../RealmStorage/RealmUserQuestsStorage.swift | 76 +++++++++++++++++-- .../UserQuestsStorage/UserQuestsStorage.swift | 7 +- .../DefaultQuestsRepository.swift | 27 +++---- 4 files changed, 131 insertions(+), 24 deletions(-) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift index 6c48cc3..d84a76d 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift @@ -18,7 +18,7 @@ enum RealmStorageError: Error { final class RealmStorage { static let shared = RealmStorage() - + private init() { // Realm file path print(Realm.Configuration.defaultConfiguration.fileURL!) @@ -26,19 +26,56 @@ final class RealmStorage { private let persistentContainer = try? Realm() - func updateEntity(entity: Object) throws { + @discardableResult + func saveEntity(entity: O) throws -> O { guard let persistentContainer = persistentContainer else { throw RealmStorageError.realmObjectError } try persistentContainer.write { persistentContainer.add(entity) } + return entity + } + + func fetchEntities(type: O.Type, filter: String? = nil) throws -> [O] { + guard let persistentContainer = persistentContainer else { + throw RealmStorageError.realmObjectError + } + if let filter = filter { + return Array(persistentContainer.objects(type).filter(filter)) + } else { + return Array(persistentContainer.objects(type)) + } } - func fetchEntities(type: O.Type) throws -> [O] { + @discardableResult + func updateEntity(entity: O) throws -> O { guard let persistentContainer = persistentContainer else { throw RealmStorageError.realmObjectError } - return Array(persistentContainer.objects(type)) + try persistentContainer.write { + persistentContainer.add(entity, update: .modified) + } + return entity } + + @discardableResult + func deleteEntity(entity: O) throws -> O { + guard let persistentContainer = persistentContainer else { + throw RealmStorageError.realmObjectError + } + try persistentContainer.write { + persistentContainer.delete(entity) + } + + return entity + } + + func findEntities(type: O.Type, filter: String) throws -> [O] { + guard let persistentContainer = persistentContainer else { + throw RealmStorageError.realmObjectError + } + return Array(persistentContainer.objects(type).filter(filter)) + } + } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift index 1f6329b..cb4b9bf 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift @@ -18,14 +18,37 @@ final class RealmUserQuestsStorage { } extension RealmUserQuestsStorage: UserQuestsStorage { - func fetchUserQuests() -> Observable<[Quest]> { + + func saveQuests(with quests: [Quest]) -> Single<[Quest]> { + return Single.create { [weak self] single in + guard let realmStorage = self?.realmStorage else { + return Disposables.create() + } + + for quest in quests { + let questEntity = UserQuestEntity(quest: quest) + do { + try realmStorage.saveEntity(entity: questEntity) + } catch let error { + single(.failure(RealmStorageError.saveError(error))) + return Disposables.create() + } + } + + single(.success(quests)) + return Disposables.create() + } + } + + func fetchQuests(by date: Date) -> Observable<[Quest]> { return Observable<[Quest]>.create { [weak self] observer in guard let realmStorage = self?.realmStorage else { return Disposables.create() } do { - let quests = try realmStorage.fetchEntities(type: UserQuestEntity.self) + let quests = try realmStorage + .fetchEntities(type: UserQuestEntity.self, filter: "date == \(date.toString)") .compactMap { $0.toDomain() } observer.onNext(quests) observer.onCompleted() @@ -37,21 +60,64 @@ extension RealmUserQuestsStorage: UserQuestsStorage { } } - func saveUserQuest(quest: Quest) -> Single { + func updateQuest(with quest: Quest) -> Single { return Single.create { [weak self] single in guard let realmStorage = self?.realmStorage else { return Disposables.create() } let questEntity = UserQuestEntity(quest: quest) - do { try realmStorage.updateEntity(entity: questEntity) - single(.success(quest)) } catch let error { + single(.failure(RealmStorageError.saveError(error))) + return Disposables.create() + } + + return Disposables.create() + } + } + + func deleteQuest(with questId: UUID) -> Single { + return Single.create { [weak self] single in + guard let realmStorage = self?.realmStorage else { + return Disposables.create() } + do { + guard let entity = try realmStorage.findEntities(type: UserQuestEntity.self, filter: "uuid == \(questId)").first else { + throw RealmStorageError.noDataError + } + try realmStorage.deleteEntity(entity: entity) + } catch let error { + + single(.failure(RealmStorageError.saveError(error))) + return Disposables.create() + } + + return Disposables.create() + } + + } + + func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]> { + return Single.create { [weak self] single in + guard let realmStorage = self?.realmStorage else { + return Disposables.create() + } + + do { + let entities = try realmStorage.findEntities(type: UserQuestEntity.self, filter: "groupId == \(groupId)") + for entity in entities { + try realmStorage.deleteEntity(entity: entity) + } + } catch let error { + + single(.failure(RealmStorageError.saveError(error))) + return Disposables.create() + } + return Disposables.create() } } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift index 89888d1..167e830 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift @@ -9,6 +9,9 @@ import Foundation import RxSwift protocol UserQuestsStorage { - func fetchUserQuests() -> Observable<[Quest]> - func saveUserQuest(quest: Quest) -> Single + func saveQuests(with quests: [Quest]) -> Single<[Quest]> + func fetchQuests(by date: Date) -> Observable<[Quest]> + func updateQuest(with quest: Quest) -> Single + func deleteQuest(with questId: UUID) -> Single + func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]> } diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift index aad4a5d..48bb59d 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -6,35 +6,36 @@ // import RxSwift +import Foundation final class DefaultQuestsRepository { - private let cache: UserQuestsStorage + private let persistentStorage: UserQuestsStorage - init(cache: UserQuestsStorage){ - self.cache = cache + init(persistentStorage: UserQuestsStorage){ + self.persistentStorage = persistentStorage } } extension DefaultQuestsRepository: QuestsRepository { - func save(with quest: [Quest]) -> RxSwift.Single<[Quest]> { - + func save(with quest: [Quest]) -> Single<[Quest]> { + return persistentStorage.saveQuests(with: quest) } - func fetch(by date: Date) -> RxSwift.Observable<[Quest]> { - + func fetch(by date: Date) -> Observable<[Quest]> { + return persistentStorage.fetchQuests(by: date) } - func update(with quest: Quest) -> RxSwift.Single { - + func update(with quest: Quest) -> Single { + return persistentStorage.updateQuest(with: quest) } - func delete(with questId: UUID) -> RxSwift.Single { - + func delete(with questId: UUID) -> Single { + return persistentStorage.deleteQuest(with: questId) } - func deleteAll(with groupId: UUID) -> RxSwift.Single<[Quest]> { - + func deleteAll(with groupId: UUID) -> Single<[Quest]> { + return persistentStorage.deleteQuestGroup(with: groupId) } From e145dfe84aab72dfe80994205bab07f5a904da3a Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 21:56:33 +0900 Subject: [PATCH 13/20] [fix] change EntityName (UserQuestEntity->QuestEntity)) --- .../DailyQuest.xcodeproj/project.pbxproj | 32 +++++++++---------- .../BrowseQuestEntity+Mapping.swift | 2 +- .../Entities/BrowseQuestEntity.swift | 6 ++-- ...serQuestEntity.swift => QuestEntity.swift} | 2 +- ...uestsStorage.swift => QuestsStorage.swift} | 4 +-- ...apping.swift => QuestEntity+Mapping.swift} | 6 ++-- ...Storage.swift => RealmQuestsStorage.swift} | 16 +++++----- .../DefaultQuestsRepository.swift | 4 +-- 8 files changed, 36 insertions(+), 36 deletions(-) rename DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/{UserQuestEntity.swift => QuestEntity.swift} (94%) rename DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/{UserQuestsStorage.swift => QuestsStorage.swift} (87%) rename DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/{UserQuestEntity+Mapping.swift => QuestEntity+Mapping.swift} (86%) rename DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/{RealmUserQuestsStorage.swift => RealmQuestsStorage.swift} (87%) diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index 31d9cc6..4e7e15f 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -52,7 +52,7 @@ 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; A50DE906292B53D900E1FD60 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; }; - A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; + A51189C329226E66008A9D33 /* QuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01CC29233ABB0031ECA2 /* RealmUserInfoStorage.swift */; }; @@ -64,10 +64,10 @@ A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */; }; A565644E292BA58E0033E763 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644D292BA58E0033E763 /* Date+.swift */; }; A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; - A5AC96DC292237C3003B7637 /* UserQuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* UserQuestEntity.swift */; }; + A5AC96DC292237C3003B7637 /* QuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* QuestEntity.swift */; }; A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5AC96DE292239CA003B7637 /* RealmSwift */; }; - A5AC96E629223F06003B7637 /* UserQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* UserQuestsStorage.swift */; }; - A5AC96E829223F27003B7637 /* RealmUserQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmUserQuestsStorage.swift */; }; + A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; }; + A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; }; B50078D629222F3F0070AFC4 /* CircleCheckView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50078D529222F3F0070AFC4 /* CircleCheckView.swift */; }; B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58DFC0929227DA800C68A4B /* CalendarCell.swift */; }; /* End PBXBuildFile section */ @@ -132,7 +132,7 @@ 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestsRepository.swift; sourceTree = ""; }; - A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; + A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; A51F01CC29233ABB0031ECA2 /* RealmUserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmUserInfoStorage.swift; sourceTree = ""; }; @@ -144,9 +144,9 @@ A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BrowseQuestEntity+Mapping.swift"; sourceTree = ""; }; A565644D292BA58E0033E763 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; A5AC96D829223648003B7637 /* RealmStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmStorage.swift; sourceTree = ""; }; - A5AC96DB292237C3003B7637 /* UserQuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserQuestEntity.swift; sourceTree = ""; }; - A5AC96E529223F06003B7637 /* UserQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserQuestsStorage.swift; sourceTree = ""; }; - A5AC96E729223F27003B7637 /* RealmUserQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmUserQuestsStorage.swift; sourceTree = ""; }; + A5AC96DB292237C3003B7637 /* QuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestEntity.swift; sourceTree = ""; }; + A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = ""; }; + A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmQuestsStorage.swift; sourceTree = ""; }; B50078D529222F3F0070AFC4 /* CircleCheckView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleCheckView.swift; sourceTree = ""; }; B58DFC0929227DA800C68A4B /* CalendarCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -464,7 +464,7 @@ A51189C029226DF7008A9D33 /* RealmStorage */ = { isa = PBXGroup; children = ( - A5AC96E729223F27003B7637 /* RealmUserQuestsStorage.swift */, + A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */, A51189C129226E26008A9D33 /* EntityMapping */, ); path = RealmStorage; @@ -473,7 +473,7 @@ A51189C129226E26008A9D33 /* EntityMapping */ = { isa = PBXGroup; children = ( - A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */, + A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */, ); path = EntityMapping; sourceTree = ""; @@ -561,7 +561,7 @@ A5AC96DA2922377C003B7637 /* Entities */ = { isa = PBXGroup; children = ( - A5AC96DB292237C3003B7637 /* UserQuestEntity.swift */, + A5AC96DB292237C3003B7637 /* QuestEntity.swift */, A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */, A51F01D42923407E0031ECA2 /* BrowseQuestEntity.swift */, ); @@ -571,7 +571,7 @@ A5AC96E429223EE6003B7637 /* UserQuestsStorage */ = { isa = PBXGroup; children = ( - A5AC96E529223F06003B7637 /* UserQuestsStorage.swift */, + A5AC96E529223F06003B7637 /* QuestsStorage.swift */, A51189C029226DF7008A9D33 /* RealmStorage */, ); path = UserQuestsStorage; @@ -740,7 +740,7 @@ 3449AD5D2922197000B87619 /* User.swift in Sources */, A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */, A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */, - A5AC96E629223F06003B7637 /* UserQuestsStorage.swift in Sources */, + A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */, A51F01D52923407E0031ECA2 /* BrowseQuestEntity.swift in Sources */, A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */, 34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */, @@ -758,17 +758,17 @@ A50DE906292B53D900E1FD60 /* DefaultQuestsRepository.swift in Sources */, 34ACC32D291DE9C000741371 /* AppDelegate.swift in Sources */, A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */, - A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */, + A51189C329226E66008A9D33 /* QuestEntity+Mapping.swift in Sources */, A51F01D3292340360031ECA2 /* BrowseQuestsStorage.swift in Sources */, 34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */, A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */, A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */, A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */, - A5AC96DC292237C3003B7637 /* UserQuestEntity.swift in Sources */, + A5AC96DC292237C3003B7637 /* QuestEntity.swift in Sources */, A51F01D029233C510031ECA2 /* UserInfoEntity+Mapping.swift in Sources */, 3499552B29236041007AB99E /* BrowseViewModel.swift in Sources */, 3449AD5B2922164B00B87619 /* Quest.swift in Sources */, - A5AC96E829223F27003B7637 /* RealmUserQuestsStorage.swift in Sources */, + A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */, 349955122923220E007AB99E /* SwiftUIPreview.swift in Sources */, 3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */, 34ACC32F291DE9C000741371 /* SceneDelegate.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift index c306dde..4cc615b 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift @@ -9,7 +9,7 @@ import Foundation extension BrowseQuestEntity { convenience init(browseQuest: BrowseQuest) { - let questsEntities = browseQuest.quests.compactMap { UserQuestEntity(quest: $0) } + let questsEntities = browseQuest.quests.compactMap { QuestEntity(quest: $0) } self.init(uuid: browseQuest.uuid, nickName: browseQuest.nickName, quests: questsEntities) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/BrowseQuestEntity.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/BrowseQuestEntity.swift index a726ae1..afcf30a 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/BrowseQuestEntity.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/BrowseQuestEntity.swift @@ -11,14 +11,14 @@ import RealmSwift final class BrowseQuestEntity: Object { @Persisted var uuid: UUID @Persisted var nickName: String - @Persisted var quests: List + @Persisted var quests: List override init() { } - init(uuid: UUID, nickName: String, quests: [UserQuestEntity]) { + init(uuid: UUID, nickName: String, quests: [QuestEntity]) { self.uuid = uuid self.nickName = nickName - let realmList = List() + let realmList = List() realmList.append(objectsIn: quests) self.quests = realmList } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift similarity index 94% rename from DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift index f718ffa..60073f1 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/UserQuestEntity.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift @@ -8,7 +8,7 @@ import Foundation import RealmSwift -final class UserQuestEntity: Object { +final class QuestEntity: Object { @Persisted var groupId: UUID @Persisted var uuid: UUID @Persisted var title: String diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/QuestsStorage.swift similarity index 87% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/QuestsStorage.swift index 167e830..2514fcc 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/UserQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/QuestsStorage.swift @@ -1,5 +1,5 @@ // -// UserQuestsStorage.swift +// QuestsStorage.swift // DailyQuest // // Created by 이전희 on 2022/11/14. @@ -8,7 +8,7 @@ import Foundation import RxSwift -protocol UserQuestsStorage { +protocol QuestsStorage { func saveQuests(with quests: [Quest]) -> Single<[Quest]> func fetchQuests(by date: Date) -> Observable<[Quest]> func updateQuest(with quest: Quest) -> Single diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift similarity index 86% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift index a44d821..4991e1d 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/UserQuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift @@ -1,5 +1,5 @@ // -// UserQuestEntity+Mapping.swift +// QuestEntity+Mapping.swift // DailyQuest // // Created by 이전희 on 2022/11/14. @@ -7,7 +7,7 @@ import Foundation -extension UserQuestEntity { +extension QuestEntity { convenience init(quest: Quest) { self.init(uuid: quest.uuid, title: quest.title, @@ -16,7 +16,7 @@ extension UserQuestEntity { } } -extension UserQuestEntity { +extension QuestEntity { func toDomain() -> Quest { return Quest(groupId: UUID(), // update here uuid: uuid, diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift similarity index 87% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift index cb4b9bf..9bbf263 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmUserQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift @@ -1,5 +1,5 @@ // -// RealmUserQuestsStorage.swift +// RealmQuestsStorage.swift // DailyQuest // // Created by 이전희 on 2022/11/14. @@ -8,7 +8,7 @@ import Foundation import RxSwift -final class RealmUserQuestsStorage { +final class RealmQuestsStorage { private let realmStorage: RealmStorage @@ -17,7 +17,7 @@ final class RealmUserQuestsStorage { } } -extension RealmUserQuestsStorage: UserQuestsStorage { +extension RealmQuestsStorage: QuestsStorage { func saveQuests(with quests: [Quest]) -> Single<[Quest]> { return Single.create { [weak self] single in @@ -26,7 +26,7 @@ extension RealmUserQuestsStorage: UserQuestsStorage { } for quest in quests { - let questEntity = UserQuestEntity(quest: quest) + let questEntity = QuestEntity(quest: quest) do { try realmStorage.saveEntity(entity: questEntity) } catch let error { @@ -48,7 +48,7 @@ extension RealmUserQuestsStorage: UserQuestsStorage { do { let quests = try realmStorage - .fetchEntities(type: UserQuestEntity.self, filter: "date == \(date.toString)") + .fetchEntities(type: QuestEntity.self, filter: "date == \(date.toString)") .compactMap { $0.toDomain() } observer.onNext(quests) observer.onCompleted() @@ -66,7 +66,7 @@ extension RealmUserQuestsStorage: UserQuestsStorage { return Disposables.create() } - let questEntity = UserQuestEntity(quest: quest) + let questEntity = QuestEntity(quest: quest) do { try realmStorage.updateEntity(entity: questEntity) } catch let error { @@ -86,7 +86,7 @@ extension RealmUserQuestsStorage: UserQuestsStorage { } do { - guard let entity = try realmStorage.findEntities(type: UserQuestEntity.self, filter: "uuid == \(questId)").first else { + guard let entity = try realmStorage.findEntities(type: QuestEntity.self, filter: "uuid == \(questId)").first else { throw RealmStorageError.noDataError } try realmStorage.deleteEntity(entity: entity) @@ -108,7 +108,7 @@ extension RealmUserQuestsStorage: UserQuestsStorage { } do { - let entities = try realmStorage.findEntities(type: UserQuestEntity.self, filter: "groupId == \(groupId)") + let entities = try realmStorage.findEntities(type: QuestEntity.self, filter: "groupId == \(groupId)") for entity in entities { try realmStorage.deleteEntity(entity: entity) } diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift index 48bb59d..0be968a 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -10,9 +10,9 @@ import Foundation final class DefaultQuestsRepository { - private let persistentStorage: UserQuestsStorage + private let persistentStorage: QuestsStorage - init(persistentStorage: UserQuestsStorage){ + init(persistentStorage: QuestsStorage){ self.persistentStorage = persistentStorage } } From 278303ce09018868c5c67387d3a359db2a06ffc2 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 22:06:24 +0900 Subject: [PATCH 14/20] [feat] RealmQuestsStorage --- .../RealmStorage/RealmQuestsStorage.swift | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift index 9bbf263..88e6cfa 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift @@ -25,17 +25,16 @@ extension RealmQuestsStorage: QuestsStorage { return Disposables.create() } - for quest in quests { - let questEntity = QuestEntity(quest: quest) - do { + do { + for quest in quests { + let questEntity = QuestEntity(quest: quest) try realmStorage.saveEntity(entity: questEntity) - } catch let error { - single(.failure(RealmStorageError.saveError(error))) - return Disposables.create() } - } + single(.success(quests)) + } catch let error { + single(.failure(RealmStorageError.saveError(error))) - single(.success(quests)) + } return Disposables.create() } } @@ -69,10 +68,10 @@ extension RealmQuestsStorage: QuestsStorage { let questEntity = QuestEntity(quest: quest) do { try realmStorage.updateEntity(entity: questEntity) + single(.success(quest)) } catch let error { single(.failure(RealmStorageError.saveError(error))) - return Disposables.create() } return Disposables.create() @@ -90,10 +89,10 @@ extension RealmQuestsStorage: QuestsStorage { throw RealmStorageError.noDataError } try realmStorage.deleteEntity(entity: entity) + single(.success(entity.toDomain())) } catch let error { single(.failure(RealmStorageError.saveError(error))) - return Disposables.create() } return Disposables.create() @@ -112,12 +111,12 @@ extension RealmQuestsStorage: QuestsStorage { for entity in entities { try realmStorage.deleteEntity(entity: entity) } - } catch let error { + single(.success(entities.compactMap { $0.toDomain() })) + } catch let error { single(.failure(RealmStorageError.saveError(error))) - return Disposables.create() } - + return Disposables.create() } } From b865ad050119e3a909d5c8b613ba6cc361462378 Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 22:55:25 +0900 Subject: [PATCH 15/20] [fix] change Directory name (UserQuestsStorage->QuestsStorage) --- .../DailyQuest.xcodeproj/project.pbxproj | 24 ++++++++++++++++--- .../QuestsStorage.swift | 0 .../EntityMapping/QuestEntity+Mapping.swift | 0 .../RealmStorage/RealmQuestsStorage.swift | 0 4 files changed, 21 insertions(+), 3 deletions(-) rename DailyQuest/DailyQuest/Data/PersistentStorages/{UserQuestsStorage => QuestsStorage}/QuestsStorage.swift (100%) rename DailyQuest/DailyQuest/Data/PersistentStorages/{UserQuestsStorage => QuestsStorage}/RealmStorage/EntityMapping/QuestEntity+Mapping.swift (100%) rename DailyQuest/DailyQuest/Data/PersistentStorages/{UserQuestsStorage => QuestsStorage}/RealmStorage/RealmQuestsStorage.swift (100%) diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index 4e7e15f..d98a549 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -63,6 +63,14 @@ A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01D9292345990031ECA2 /* BrowseQuest.swift */; }; A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */; }; A565644E292BA58E0033E763 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644D292BA58E0033E763 /* Date+.swift */; }; + A5656450292BB8840033E763 /* DefaultQuestsRepositoryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */; }; + A5656451292BB8970033E763 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; }; + A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; }; + A5656453292BB89D0033E763 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; }; + A5656454292BB8A20033E763 /* QuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */; }; + A5656455292BB8B30033E763 /* QuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* QuestEntity.swift */; }; + A5656456292BB8B70033E763 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; + A5656457292BB91F0033E763 /* Quest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5A2922164B00B87619 /* Quest.swift */; }; A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; A5AC96DC292237C3003B7637 /* QuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* QuestEntity.swift */; }; A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5AC96DE292239CA003B7637 /* RealmSwift */; }; @@ -143,6 +151,7 @@ A51F01D9292345990031ECA2 /* BrowseQuest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseQuest.swift; sourceTree = ""; }; A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BrowseQuestEntity+Mapping.swift"; sourceTree = ""; }; A565644D292BA58E0033E763 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; + A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestsRepositoryTest.swift; sourceTree = ""; }; A5AC96D829223648003B7637 /* RealmStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmStorage.swift; sourceTree = ""; }; A5AC96DB292237C3003B7637 /* QuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestEntity.swift; sourceTree = ""; }; A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = ""; }; @@ -396,6 +405,7 @@ isa = PBXGroup; children = ( 34ACC343291DE9C100741371 /* DailyQuestTests.swift */, + A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */, ); path = DailyQuestTests; sourceTree = ""; @@ -542,7 +552,7 @@ isa = PBXGroup; children = ( A51F01C629232DF90031ECA2 /* UserInfoStorage */, - A5AC96E429223EE6003B7637 /* UserQuestsStorage */, + A5AC96E429223EE6003B7637 /* QuestsStorage */, A51F01D129233FFB0031ECA2 /* BrowseQuestsStorage */, A5AC96D72922362A003B7637 /* RealmStorage */, ); @@ -568,13 +578,13 @@ path = Entities; sourceTree = ""; }; - A5AC96E429223EE6003B7637 /* UserQuestsStorage */ = { + A5AC96E429223EE6003B7637 /* QuestsStorage */ = { isa = PBXGroup; children = ( A5AC96E529223F06003B7637 /* QuestsStorage.swift */, A51189C029226DF7008A9D33 /* RealmStorage */, ); - path = UserQuestsStorage; + path = QuestsStorage; sourceTree = ""; }; /* End PBXGroup section */ @@ -780,7 +790,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */, + A5656455292BB8B30033E763 /* QuestEntity.swift in Sources */, + A5656450292BB8840033E763 /* DefaultQuestsRepositoryTest.swift in Sources */, + A5656456292BB8B70033E763 /* RealmStorage.swift in Sources */, + A5656454292BB8A20033E763 /* QuestEntity+Mapping.swift in Sources */, 34ACC344291DE9C100741371 /* DailyQuestTests.swift in Sources */, + A5656453292BB89D0033E763 /* RealmQuestsStorage.swift in Sources */, + A5656457292BB91F0033E763 /* Quest.swift in Sources */, + A5656451292BB8970033E763 /* DefaultQuestsRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/QuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift similarity index 100% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/QuestsStorage.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift similarity index 100% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift similarity index 100% rename from DailyQuest/DailyQuest/Data/PersistentStorages/UserQuestsStorage/RealmStorage/RealmQuestsStorage.swift rename to DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift From 5e9f0a1e9906b600e26530b4a28e2f7b0999e77a Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 23:28:07 +0900 Subject: [PATCH 16/20] [fix] Quest struct (add Date) --- .../DailyQuest.xcodeproj/project.pbxproj | 18 +++------- .../BrowseQuestEntity+Mapping.swift | 1 + .../EntityMapping/QuestEntity+Mapping.swift | 17 ++++++---- .../RealmStorage/RealmQuestsStorage.swift | 1 - .../RealmStorage/Entities/QuestEntity.swift | 7 ++-- .../DailyQuest/Domain/Entities/Quest.swift | 1 + .../Browse/ViewModel/BrowseViewModel.swift | 34 +++++++++---------- .../Presentation/Common/Cells/QuestCell.swift | 2 +- .../Home/ViewModel/QuestViewModel.swift | 12 +++---- 9 files changed, 46 insertions(+), 47 deletions(-) diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index d98a549..d52eb6a 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -63,14 +63,9 @@ A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01D9292345990031ECA2 /* BrowseQuest.swift */; }; A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */; }; A565644E292BA58E0033E763 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644D292BA58E0033E763 /* Date+.swift */; }; - A5656450292BB8840033E763 /* DefaultQuestsRepositoryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */; }; - A5656451292BB8970033E763 /* DefaultQuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50DE905292B53D900E1FD60 /* DefaultQuestsRepository.swift */; }; A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; }; - A5656453292BB89D0033E763 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; }; - A5656454292BB8A20033E763 /* QuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* QuestEntity+Mapping.swift */; }; - A5656455292BB8B30033E763 /* QuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* QuestEntity.swift */; }; - A5656456292BB8B70033E763 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; A5656457292BB91F0033E763 /* Quest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5A2922164B00B87619 /* Quest.swift */; }; + A5656459292BBDD40033E763 /* String+.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5656458292BBDD40033E763 /* String+.swift */; }; A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96D829223648003B7637 /* RealmStorage.swift */; }; A5AC96DC292237C3003B7637 /* QuestEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96DB292237C3003B7637 /* QuestEntity.swift */; }; A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5AC96DE292239CA003B7637 /* RealmSwift */; }; @@ -151,7 +146,7 @@ A51F01D9292345990031ECA2 /* BrowseQuest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseQuest.swift; sourceTree = ""; }; A51F01DC2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BrowseQuestEntity+Mapping.swift"; sourceTree = ""; }; A565644D292BA58E0033E763 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; - A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestsRepositoryTest.swift; sourceTree = ""; }; + A5656458292BBDD40033E763 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; A5AC96D829223648003B7637 /* RealmStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmStorage.swift; sourceTree = ""; }; A5AC96DB292237C3003B7637 /* QuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestEntity.swift; sourceTree = ""; }; A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = ""; }; @@ -229,6 +224,7 @@ 3499551429232533007AB99E /* UIColor+.swift */, 34874AA129250C43000570DF /* UIButton+.swift */, A565644D292BA58E0033E763 /* Date+.swift */, + A5656458292BBDD40033E763 /* String+.swift */, ); path = Utils; sourceTree = ""; @@ -405,7 +401,6 @@ isa = PBXGroup; children = ( 34ACC343291DE9C100741371 /* DailyQuestTests.swift */, - A565644F292BB8840033E763 /* DefaultQuestsRepositoryTest.swift */, ); path = DailyQuestTests; sourceTree = ""; @@ -746,6 +741,7 @@ 34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */, 34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */, 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */, + A5656459292BBDD40033E763 /* String+.swift in Sources */, 34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */, 3449AD5D2922197000B87619 /* User.swift in Sources */, A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */, @@ -791,14 +787,8 @@ buildActionMask = 2147483647; files = ( A5656452292BB89A0033E763 /* QuestsStorage.swift in Sources */, - A5656455292BB8B30033E763 /* QuestEntity.swift in Sources */, - A5656450292BB8840033E763 /* DefaultQuestsRepositoryTest.swift in Sources */, - A5656456292BB8B70033E763 /* RealmStorage.swift in Sources */, - A5656454292BB8A20033E763 /* QuestEntity+Mapping.swift in Sources */, 34ACC344291DE9C100741371 /* DailyQuestTests.swift in Sources */, - A5656453292BB89D0033E763 /* RealmQuestsStorage.swift in Sources */, A5656457292BB91F0033E763 /* Quest.swift in Sources */, - A5656451292BB8970033E763 /* DefaultQuestsRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift index 4cc615b..b4bcada 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/BrowseQuestsStorage/RealmStorage/EntityMapping/BrowseQuestEntity+Mapping.swift @@ -10,6 +10,7 @@ import Foundation extension BrowseQuestEntity { convenience init(browseQuest: BrowseQuest) { let questsEntities = browseQuest.quests.compactMap { QuestEntity(quest: $0) } + self.init(uuid: browseQuest.uuid, nickName: browseQuest.nickName, quests: questsEntities) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift index 4991e1d..0542319 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift @@ -8,18 +8,23 @@ import Foundation extension QuestEntity { - convenience init(quest: Quest) { - self.init(uuid: quest.uuid, - title: quest.title, - currentCount: quest.currentCount, - totalCount: quest.totalCount) + convenience init(quest: Quest) { // Quest에 date 들어가면 수정 + self.init( + groupId: quest.groupId, + uuid: quest.uuid, + date: quest.date.toString, + title: quest.title, + currentCount: quest.currentCount, + totalCount: quest.totalCount) + print(date.toDate()) } } extension QuestEntity { func toDomain() -> Quest { - return Quest(groupId: UUID(), // update here + return Quest(groupId: groupId, uuid: uuid, + date: date.toDate() ?? Date(), title: title, currentCount: currentCount, totalCount: totalCount) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift index 88e6cfa..b5e2a7e 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift @@ -64,7 +64,6 @@ extension RealmQuestsStorage: QuestsStorage { guard let realmStorage = self?.realmStorage else { return Disposables.create() } - let questEntity = QuestEntity(quest: quest) do { try realmStorage.updateEntity(entity: questEntity) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift index 60073f1..eb1d08f 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/Entities/QuestEntity.swift @@ -11,19 +11,22 @@ import RealmSwift final class QuestEntity: Object { @Persisted var groupId: UUID @Persisted var uuid: UUID + @Persisted var date: String @Persisted var title: String @Persisted var currentCount: Int @Persisted var totalCount: Int override init() { } - init(uuid: UUID, title: String, currentCount: Int, totalCount: Int) { + init(groupId: UUID, uuid: UUID, date: String, title: String, currentCount: Int, totalCount: Int) { + self.groupId = groupId self.uuid = uuid + self.date = date self.title = title self.currentCount = currentCount self.totalCount = totalCount } - + override class func primaryKey() -> String? { "uuid" } diff --git a/DailyQuest/DailyQuest/Domain/Entities/Quest.swift b/DailyQuest/DailyQuest/Domain/Entities/Quest.swift index b9b274a..d687cc4 100644 --- a/DailyQuest/DailyQuest/Domain/Entities/Quest.swift +++ b/DailyQuest/DailyQuest/Domain/Entities/Quest.swift @@ -10,6 +10,7 @@ import Foundation struct Quest { let groupId: UUID let uuid: UUID + let date: Date let title: String var currentCount: Int let totalCount: Int diff --git a/DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseViewModel.swift b/DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseViewModel.swift index f16e610..dcf14e2 100644 --- a/DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Browse/ViewModel/BrowseViewModel.swift @@ -12,33 +12,33 @@ import RxSwift final class BrowseViewModel { let user1 = User(uuid: "", nickName: "jinwoong", profile: Data(), backgroundImage: Data(), description: "") let quests1 = [ - Quest(groupId: UUID(), uuid: UUID(), title: "물마시기", currentCount: 2, totalCount: 5), - Quest(groupId: UUID(),uuid: UUID(), title: "코딩하기", currentCount: 0, totalCount: 10) + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "물마시기", currentCount: 2, totalCount: 5), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "코딩하기", currentCount: 0, totalCount: 10) ] - + let user2 = User(uuid: "", nickName: "someone", profile: Data(), backgroundImage: Data(), description: "") let quests2 = [ - Quest(groupId: UUID(),uuid: UUID(), title: "물마시기", currentCount: 4, totalCount: 5), - Quest(groupId: UUID(),uuid: UUID(), title: "책읽기", currentCount: 9, totalCount: 20), - Quest(groupId: UUID(),uuid: UUID(), title: "달리기", currentCount: 4, totalCount: 9), - Quest(groupId: UUID(),uuid: UUID(), title: "잠자기", currentCount: 1, totalCount: 1) + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "물마시기", currentCount: 4, totalCount: 5), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "책읽기", currentCount: 9, totalCount: 20), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "달리기", currentCount: 4, totalCount: 9), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "잠자기", currentCount: 1, totalCount: 1) ] - + let user3 = User(uuid: "", nickName: "Max...", profile: Data(), backgroundImage: Data(), description: "") let quests3 = [ - Quest(groupId: UUID(),uuid: UUID(), title: "물마시기", currentCount: 4, totalCount: 5), - Quest(groupId: UUID(),uuid: UUID(), title: "그림 그리기", currentCount: 1, totalCount: 2), - Quest(groupId: UUID(),uuid: UUID(), title: "달리기", currentCount: 4, totalCount: 9), - Quest(groupId: UUID(),uuid: UUID(), title: "책읽기", currentCount: 1, totalCount: 1), - Quest(groupId: UUID(),uuid: UUID(), title: "잠자기", currentCount: 1, totalCount: 1), - Quest(groupId: UUID(),uuid: UUID(), title: "행복하기", currentCount: 0, totalCount: 1) + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "물마시기", currentCount: 4, totalCount: 5), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "그림 그리기", currentCount: 1, totalCount: 2), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "달리기", currentCount: 4, totalCount: 9), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "책읽기", currentCount: 1, totalCount: 1), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "잠자기", currentCount: 1, totalCount: 1), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "행복하기", currentCount: 0, totalCount: 1) ] - + let data: Observable<[(User, [Quest])]> private(set) var users: [User] = [] - + let cellCount = [2, 4, 6] - + init() { self.data = .just([(user1, quests1), (user2, quests2), (user3, quests3)]) self.users.append(contentsOf: [user1, user2, user3]) diff --git a/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift b/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift index 5d94e47..e1cd4c8 100644 --- a/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift +++ b/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift @@ -111,7 +111,7 @@ struct QuestCellPreview: PreviewProvider{ static var previews: some View { UIViewPreview { let cell = QuestCell(frame: .zero) - let quest = Quest(groupId: UUID(), uuid: UUID(), title: "my quest", currentCount: 2, totalCount: 5) + let quest = Quest(groupId: UUID(), uuid: UUID(),date: Date(), title: "my quest", currentCount: 2, totalCount: 5) cell.setup(with: quest) return cell diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift index 48e5ef5..d45a06c 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift @@ -11,14 +11,14 @@ import RxSwift final class QuestViewModel { let quests = [ - Quest(groupId: UUID(), uuid: UUID(), title: "물마시기", currentCount: 4, totalCount: 5), - Quest(groupId: UUID(), uuid: UUID(), title: "책읽기", currentCount: 9, totalCount: 20), - Quest(groupId: UUID(), uuid: UUID(), title: "달리기", currentCount: 4, totalCount: 9), - Quest(groupId: UUID(), uuid: UUID(), title: "잠자기", currentCount: 1, totalCount: 1) + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "물마시기", currentCount: 4, totalCount: 5), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "책읽기", currentCount: 9, totalCount: 20), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "달리기", currentCount: 4, totalCount: 9), + Quest(groupId: UUID(), uuid: UUID(), date: Date(), title: "잠자기", currentCount: 1, totalCount: 1) ] - + let data: Observable<[Quest]> - + init() { self.data = .just(quests) } From b694713905043b92265621fe010469a9b00a6c0d Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Mon, 21 Nov 2022 23:28:25 +0900 Subject: [PATCH 17/20] [feat] add String extension --- DailyQuest/DailyQuest/Utils/String+.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 DailyQuest/DailyQuest/Utils/String+.swift diff --git a/DailyQuest/DailyQuest/Utils/String+.swift b/DailyQuest/DailyQuest/Utils/String+.swift new file mode 100644 index 0000000..e522181 --- /dev/null +++ b/DailyQuest/DailyQuest/Utils/String+.swift @@ -0,0 +1,17 @@ +// +// String+.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/21. +// + +import Foundation + +extension String { + func toDate() -> Date? { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + dateFormatter.timeZone = TimeZone(identifier: "UTC") + return dateFormatter.date(from: self) + } +} From 263d8e102ced5141dd76710318c90bdf0f1c1696 Mon Sep 17 00:00:00 2001 From: Dayeon Lee Date: Tue, 22 Nov 2022 00:20:34 +0900 Subject: [PATCH 18/20] [feat] Implement update and delete function Co-Authored-By: Jeonhui Lee <48307153+Jeonhui@users.noreply.github.com> --- .../Application/SceneDelegate.swift | 2 +- .../FirebaseService/FirebaseService.swift | 116 ++++++++++++++---- .../Infrastructure/NetworkService.swift | 4 +- 3 files changed, 94 insertions(+), 28 deletions(-) diff --git a/DailyQuest/DailyQuest/Application/SceneDelegate.swift b/DailyQuest/DailyQuest/Application/SceneDelegate.swift index 8c27dd8..1943d87 100644 --- a/DailyQuest/DailyQuest/Application/SceneDelegate.swift +++ b/DailyQuest/DailyQuest/Application/SceneDelegate.swift @@ -27,9 +27,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { self.window?.rootViewController = tabbarController self.window?.makeKeyAndVisible() + //_ = FirebaseService.shared.update(userCase: .currentUser, access: .quests, dto: QuestDTO(uuid: UUID(uuidString: "16AF9B21-4C85-4EF9-9DF5-B1A3385C9D56") ?? UUID(), title: "바꾸기", currentCount: 0, totalCount: 0, groupUid: UUID(uuidString: "98AC0127-5CAF-4DC7-9365-9E5F819053BE") ?? UUID())) _ = FirebaseService.shared.create(userCase: .currentUser, access: .quests, dto: QuestDTO(uuid: UUID(), title: "", currentCount: 0, totalCount: 0, groupUid: UUID())) - self.appCoordinator = AppCoordinator(tabBarController: tabbarController, appDIContainer: appDIContainer) self.appCoordinator?.start() diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index 40aaf51..aa47b2a 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -14,16 +14,16 @@ final class FirebaseService: NetworkService { static let shared = FirebaseService() private let auth: Auth private let db: Firestore - + private(set) var uid: String? - + private init() { FirebaseApp.configure() db = Firestore.firestore() auth = Auth.auth() uid = auth.currentUser?.uid } - + private func documentReference(userCase: UserCase) -> DocumentReference? { switch userCase { case .currentUser: @@ -33,14 +33,14 @@ final class FirebaseService: NetworkService { return db.collection("users").document(uid) } } - + func create(userCase: UserCase, access: Access, dto: T) -> Single { return Single.create { single in guard let uid = self.uid, let ref = self.documentReference(userCase: userCase) else { // single(.failure()) // Firebase Error 추가 return Disposables.create() } - + switch access { case .quests: do { @@ -72,15 +72,15 @@ final class FirebaseService: NetworkService { return Disposables.create() } } - + func read(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition? = nil) -> Observable { - + return Observable.create { observer in guard let ref = self.documentReference(userCase: userCase) else { // single(.failure()) // Firebase Error 추가 return Disposables.create() } - + switch access { case .quests: print("aaaa") @@ -91,16 +91,16 @@ final class FirebaseService: NetworkService { case let .today(date): ref.whereField("date", isEqualTo: date.toString) .getDocuments { (querySnapshot, err) in - for document in querySnapshot!.documents { - print("\(document.documentID) => \(document.data())") - do { - let quest = try document.data(as: type) - observer.onNext(quest) - } catch let error { - print(error) + for document in querySnapshot!.documents { + print("\(document.documentID) => \(document.data())") + do { + let quest = try document.data(as: type) + observer.onNext(quest) + } catch let error { + print(error) + } } } - } case .some(.month(_)): break case .some(.year(_date: let _date)): @@ -111,25 +111,91 @@ final class FirebaseService: NetworkService { case .userInfo: break } - - + + return Disposables.create() } } - - func update(userCase: UserCase, access: Access) -> Single { + + func update(userCase: UserCase, access: Access, dto: T) -> Single { return Single.create { single in - + guard let uid = self.uid, let ref = self.documentReference(userCase: userCase) else { + // single(.failure()) // Firebase Error 추가 + return Disposables.create() + } + + switch access { + case .quests: + do { + try ref.collection("quests") + .document("\(dto.uuid)") + .setData(from: dto, merge: true) + print(dto.uuid) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + case .receiveQuests: + do { + try ref.collection("receiveQuests") + .document(uid) + .setData(from: dto, merge: true) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + case .userInfo: + do { + try ref + .setData(from: dto, merge: true) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + } return Disposables.create() } } - - func delete(userCase: UserCase, access: Access) -> Single { + + func delete(userCase: UserCase, access: Access, dto: T) -> Single { return Single.create { single in - + guard let uid = self.uid, let ref = self.documentReference(userCase: userCase) else { + // single(.failure()) // Firebase Error 추가 + return Disposables.create() + } + + switch access { + case .quests: + do { + try ref.collection("quests") + .document("\(dto.uuid)") + .delete() + print(dto.uuid) + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + case .receiveQuests: + do { + try ref.collection("receiveQuests") + .document(uid) + .delete() + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + case .userInfo: + do { + try ref + .delete() + single(.success(dto)) + } catch let error { + single(.failure(error)) + } + } return Disposables.create() } } - + } diff --git a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift index 905635a..346818d 100644 --- a/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/NetworkService.swift @@ -16,6 +16,6 @@ protocol NetworkService { func create(userCase: UserCase, access: Access, dto: T) -> Single func read(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition?) -> Observable - func update(userCase: UserCase, access: Access) -> Single - func delete(userCase: UserCase, access: Access) -> Single + func update(userCase: UserCase, access: Access, dto: T) -> Single + func delete(userCase: UserCase, access: Access, dto: T) -> Single } From 0a93ed02d6c7195c82575893cc264df6acd1793e Mon Sep 17 00:00:00 2001 From: Jeonhui Date: Tue, 22 Nov 2022 13:28:14 +0900 Subject: [PATCH 19/20] [feat] DefaultQuestsRepository --- .../EntityMapping/QuestEntity+Mapping.swift | 1 - .../RealmStorage/RealmQuestsStorage.swift | 15 +++-- .../RealmStorage/RealmStorage.swift | 7 +- .../DefaultQuestsRepository.swift | 64 ++++++++++++++++--- DailyQuest/DailyQuest/Utils/Date+.swift | 16 +++++ 5 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 DailyQuest/DailyQuest/Utils/Date+.swift diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift index 0542319..9fa4450 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift @@ -16,7 +16,6 @@ extension QuestEntity { title: quest.title, currentCount: quest.currentCount, totalCount: quest.totalCount) - print(date.toDate()) } } diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift index b5e2a7e..a8a17b8 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift @@ -47,7 +47,7 @@ extension RealmQuestsStorage: QuestsStorage { do { let quests = try realmStorage - .fetchEntities(type: QuestEntity.self, filter: "date == \(date.toString)") + .fetchEntities(type: QuestEntity.self, filter: NSPredicate(format: "date == %@", date.toString)) .compactMap { $0.toDomain() } observer.onNext(quests) observer.onCompleted() @@ -69,7 +69,6 @@ extension RealmQuestsStorage: QuestsStorage { try realmStorage.updateEntity(entity: questEntity) single(.success(quest)) } catch let error { - single(.failure(RealmStorageError.saveError(error))) } @@ -84,13 +83,14 @@ extension RealmQuestsStorage: QuestsStorage { } do { - guard let entity = try realmStorage.findEntities(type: QuestEntity.self, filter: "uuid == \(questId)").first else { + guard let entity = try realmStorage.findEntities(type: QuestEntity.self, filter: NSPredicate(format: "uuid == %@", questId as CVarArg)).first else { throw RealmStorageError.noDataError } + let quest = entity.toDomain() try realmStorage.deleteEntity(entity: entity) - single(.success(entity.toDomain())) + single(.success(quest)) + } catch let error { - single(.failure(RealmStorageError.saveError(error))) } @@ -106,11 +106,12 @@ extension RealmQuestsStorage: QuestsStorage { } do { - let entities = try realmStorage.findEntities(type: QuestEntity.self, filter: "groupId == \(groupId)") + let entities = try realmStorage.findEntities(type: QuestEntity.self, filter: NSPredicate(format: "groupId == %@", groupId as CVarArg)) + let quests = entities.compactMap { $0.toDomain() } for entity in entities { try realmStorage.deleteEntity(entity: entity) } - single(.success(entities.compactMap { $0.toDomain() })) + single(.success(quests)) } catch let error { single(.failure(RealmStorageError.saveError(error))) diff --git a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift index d84a76d..7e023a5 100644 --- a/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift +++ b/DailyQuest/DailyQuest/Data/PersistentStorages/RealmStorage/RealmStorage.swift @@ -21,7 +21,9 @@ final class RealmStorage { private init() { // Realm file path + #if DEBUG print(Realm.Configuration.defaultConfiguration.fileURL!) + #endif } private let persistentContainer = try? Realm() @@ -37,11 +39,12 @@ final class RealmStorage { return entity } - func fetchEntities(type: O.Type, filter: String? = nil) throws -> [O] { + func fetchEntities(type: O.Type, filter: NSPredicate? = nil) throws -> [O] { guard let persistentContainer = persistentContainer else { throw RealmStorageError.realmObjectError } if let filter = filter { + print(filter) return Array(persistentContainer.objects(type).filter(filter)) } else { return Array(persistentContainer.objects(type)) @@ -71,7 +74,7 @@ final class RealmStorage { return entity } - func findEntities(type: O.Type, filter: String) throws -> [O] { + func findEntities(type: O.Type, filter: NSPredicate) throws -> [O] { guard let persistentContainer = persistentContainer else { throw RealmStorageError.realmObjectError } diff --git a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift index 0be968a..0ea579f 100644 --- a/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift +++ b/DailyQuest/DailyQuest/Data/Repositories/DefaultQuestsRepository.swift @@ -9,10 +9,10 @@ import RxSwift import Foundation final class DefaultQuestsRepository { - + private let persistentStorage: QuestsStorage - - init(persistentStorage: QuestsStorage){ + + init(persistentStorage: QuestsStorage) { self.persistentStorage = persistentStorage } } @@ -21,22 +21,68 @@ extension DefaultQuestsRepository: QuestsRepository { func save(with quest: [Quest]) -> Single<[Quest]> { return persistentStorage.saveQuests(with: quest) } - + func fetch(by date: Date) -> Observable<[Quest]> { return persistentStorage.fetchQuests(by: date) } - + func update(with quest: Quest) -> Single { return persistentStorage.updateQuest(with: quest) } - + func delete(with questId: UUID) -> Single { return persistentStorage.deleteQuest(with: questId) } - + func deleteAll(with groupId: UUID) -> Single<[Quest]> { return persistentStorage.deleteQuestGroup(with: groupId) } - - + + +} + +extension DefaultQuestsRepository { + static func test() { + let persistentStorage = RealmQuestsStorage() + let repository = DefaultQuestsRepository(persistentStorage: persistentStorage) + let dummyDate = ["2022-11-17".toDate()!, + "2022-11-18".toDate()!, + "2022-11-19".toDate()!, + "2022-11-20".toDate()!, + "2022-11-21".toDate()!, + "2022-11-22".toDate()!, + "2022-11-23".toDate()!, + "2022-11-24".toDate()!] + let dummyData = (0...10).compactMap { i in + Quest(groupId: UUID(), uuid: UUID(), date: dummyDate[i % dummyDate.count], title: "\(i) dummyData", currentCount: 0, totalCount: i % 5) + } + + print("🍀save") + let _ = repository.save(with: dummyData) + .subscribe { event in + print(event) + } + + print("🍀fetch \(Date())") + + let _ = repository.fetch(by: Date()) + .subscribe { event in + print(event) + } + + let temp = dummyData[0] + print("🍀update \(temp.uuid)") + let quest = Quest(groupId: temp.groupId, uuid: temp.uuid, date: temp.date, title: "change", currentCount: temp.currentCount + 1, totalCount: temp.totalCount) + let _ = repository.update(with: quest) + .subscribe { event in + print(event) + } + + print("🍀delete \(dummyData[1].uuid)") + let _ = repository.delete(with: dummyData[1].uuid) + .subscribe { event in + print(event) + } + + } } diff --git a/DailyQuest/DailyQuest/Utils/Date+.swift b/DailyQuest/DailyQuest/Utils/Date+.swift new file mode 100644 index 0000000..c4d4012 --- /dev/null +++ b/DailyQuest/DailyQuest/Utils/Date+.swift @@ -0,0 +1,16 @@ +// +// Date+.swift +// DailyQuest +// +// Created by 이전희 on 2022/11/21. +// + +import Foundation + + extension Date { + var toString: String { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + return dateFormatter.string(from: self) + } + } From 219a05e1450af40a784a6cdfdf7cba28e27e456a Mon Sep 17 00:00:00 2001 From: Dayeon Lee Date: Tue, 22 Nov 2022 15:22:38 +0900 Subject: [PATCH 20/20] [feat] Delete Completion Co-Authored-By: Jeonhui Lee <48307153+Jeonhui@users.noreply.github.com> --- .../FirebaseService/FirebaseService.swift | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift index aa47b2a..1a07bc1 100644 --- a/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift +++ b/DailyQuest/DailyQuest/Infrastructure/FirebaseService/FirebaseService.swift @@ -22,6 +22,7 @@ final class FirebaseService: NetworkService { db = Firestore.firestore() auth = Auth.auth() uid = auth.currentUser?.uid + print(uid) } private func documentReference(userCase: UserCase) -> DocumentReference? { @@ -166,31 +167,29 @@ final class FirebaseService: NetworkService { switch access { case .quests: - do { - try ref.collection("quests") - .document("\(dto.uuid)") - .delete() - print(dto.uuid) - single(.success(dto)) - } catch let error { - single(.failure(error)) + ref.collection("quests").document("\(dto.uuid)").delete() { error in + if let error = error { + single(.failure(error)) + } else { + single(.success(dto)) + } } + print(dto.uuid) case .receiveQuests: - do { - try ref.collection("receiveQuests") - .document(uid) - .delete() - single(.success(dto)) - } catch let error { - single(.failure(error)) + ref.collection("receiveQuests").document(uid).delete() { error in + if let error = error { + single(.failure(error)) + } else { + single(.success(dto)) + } } case .userInfo: - do { - try ref - .delete() - single(.success(dto)) - } catch let error { - single(.failure(error)) + ref.delete() { error in + if let error = error { + single(.failure(error)) + } else { + single(.success(dto)) + } } } return Disposables.create()