Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Refactor/data & SyncManager #127

Merged
merged 34 commits into from
Dec 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
595375b
[refactor] QuestViewHeader์˜ label์„ private(set)์œผ๋กœ ๋ณ€๊ฒฝ
jinwoong16 Dec 8, 2022
cf4d1bb
[refactor] quest header label ๋ณ€๊ฒฝ์„ ์œ„ํ•œ observable์„ ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
1f3d95d
[refactor] ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ output์„ header์™€ ์—ฐ๊ฒฐ
jinwoong16 Dec 8, 2022
d2490d5
[feat] if change user Iamge { notify }
Jeonhui Dec 8, 2022
d36e530
[fix] profileButtonImage aspectFill
Jeonhui Dec 8, 2022
02e40d8
[chore] ํ•„์š”ํ•œ ํŒŒ์ผ ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
eed1613
[fix] deleteStorageData file path -> url
Jeonhui Dec 8, 2022
c5bcc27
[feat] FriendQuest Usecase ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
9c26019
[feat] FriendCalendarUseCase ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
ff3bd14
[feat] BrowseView์—์„œ ์…€ ์„ ํƒ์‹œ, ํ•ด๋‹น user๋ฅผ emitํ•˜๋Š” publisher ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
da2ed1d
[refactor] FriendStatusView ์ˆ˜์ •
jinwoong16 Dec 8, 2022
555ec50
[refactor] QuestViewHeader์˜ ๋ฒ„ํŠผ ๋ณ€๊ฒฝ
jinwoong16 Dec 8, 2022
8e03823
[feat] FriendViewController ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
4be280a
[feat] FriendViewModel ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
7793ae0
[feat] ๊ด€๋ จ DI ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
ed76053
[feat] BrowseCoordinator์—์„œ FriendView๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€
jinwoong16 Dec 8, 2022
3a64271
[fix] update protocol
Jeonhui Dec 8, 2022
ac9c184
[feat] change user Image -> delete origin network data
Jeonhui Dec 8, 2022
cd5674f
[feat] error handling
Jeonhui Dec 8, 2022
0fab7cd
[refactor] ์บ˜๋ฆฐ๋” ์ •๋ณด๋ฅผ ํ•œ๋‹ฌ์น˜๋งŒ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ณ€๊ฒฝ
jinwoong16 Dec 8, 2022
9967776
[feat] Observable -> Single
Jeonhui Dec 8, 2022
fad99d5
[feat] create questSync
Jeonhui Dec 8, 2022
c3df464
[feat] Add description modify Alert
sprituz Dec 8, 2022
58d2133
[feat] create SyncManager
Jeonhui Dec 8, 2022
ba39a52
[feat] remove DefaultQuestsRepository - questsSync
Jeonhui Dec 8, 2022
47630da
Merge remote-tracking branch 'origin/feature/FriendView' into refactoโ€ฆ
Jeonhui Dec 8, 2022
5bb2184
[feat] update timeout
Jeonhui Dec 9, 2022
d76bb32
[feat] change user default allow
Jeonhui Dec 9, 2022
ee477df
[feat] browse view current user X
Jeonhui Dec 9, 2022
f3e87e9
[fix] deleteDataStorage error
Jeonhui Dec 9, 2022
11702a5
[fix] save user image update networkService & delete User fix
Jeonhui Dec 9, 2022
486f14e
Merge remote-tracking branch 'origin/refactor/QuestViewHeaderLabel' iโ€ฆ
Jeonhui Dec 9, 2022
8228c36
Merge branch 'feature/ProfileView' into refactor/userUseCase
Jeonhui Dec 9, 2022
b68f9b2
[feat] Observable -> Single
Jeonhui Dec 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@
345687FA2937815900CA51E3 /* QuantityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687F92937815900CA51E3 /* QuantityView.swift */; };
345687FE29378AB900CA51E3 /* EnrollViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345687FD29378AB900CA51E3 /* EnrollViewModel.swift */; };
34642AB62925D9E40052FA0E /* UserInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34642AB52925D9E40052FA0E /* UserInfoView.swift */; };
3472E8F129420D9600BB304F /* FriendViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3472E8F029420D9600BB304F /* FriendViewModel.swift */; };
3472E8F52942135D00BB304F /* FriendQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3472E8F42942135D00BB304F /* FriendQuestUseCase.swift */; };
3472E8F7294213BE00BB304F /* DefaultFriendQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3472E8F6294213BE00BB304F /* DefaultFriendQuestUseCase.swift */; };
3472E8F929421C7C00BB304F /* FriendCalendarUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3472E8F829421C7C00BB304F /* FriendCalendarUseCase.swift */; };
3472E8FB29421CB500BB304F /* DefaultFriendCalendarUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3472E8FA29421CB500BB304F /* DefaultFriendCalendarUseCase.swift */; };
347D258B292C60F40038FCA2 /* StatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347D258A292C60F40038FCA2 /* StatusView.swift */; };
347D258D292C6E220038FCA2 /* MessageBubble.swift in Sources */ = {isa = PBXBuildFile; fileRef = 347D258C292C6E220038FCA2 /* MessageBubble.swift */; };
34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34874A9F292509A4000570DF /* QuestViewHeader.swift */; };
Expand Down Expand Up @@ -163,6 +168,7 @@
A5AC96DF292239CA003B7637 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5AC96DE292239CA003B7637 /* RealmSwift */; };
A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E529223F06003B7637 /* QuestsStorage.swift */; };
A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */; };
A5BD61E629423FBB0075970F /* SyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5BD61E529423FBB0075970F /* SyncManager.swift */; };
A5D3C813293DB1BE00F43B76 /* DataConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */; };
A5D3C823293DDDAD00F43B76 /* ProtectedUserRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */; };
A5D3C828293DDEBE00F43B76 /* QuestsRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */; };
Expand Down Expand Up @@ -285,6 +291,11 @@
345687F92937815900CA51E3 /* QuantityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuantityView.swift; sourceTree = "<group>"; };
345687FD29378AB900CA51E3 /* EnrollViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrollViewModel.swift; sourceTree = "<group>"; };
34642AB52925D9E40052FA0E /* UserInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserInfoView.swift; sourceTree = "<group>"; };
3472E8F029420D9600BB304F /* FriendViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendViewModel.swift; sourceTree = "<group>"; };
3472E8F42942135D00BB304F /* FriendQuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendQuestUseCase.swift; sourceTree = "<group>"; };
3472E8F6294213BE00BB304F /* DefaultFriendQuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendQuestUseCase.swift; sourceTree = "<group>"; };
3472E8F829421C7C00BB304F /* FriendCalendarUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendCalendarUseCase.swift; sourceTree = "<group>"; };
3472E8FA29421CB500BB304F /* DefaultFriendCalendarUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFriendCalendarUseCase.swift; sourceTree = "<group>"; };
347D258A292C60F40038FCA2 /* StatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusView.swift; sourceTree = "<group>"; };
347D258C292C6E220038FCA2 /* MessageBubble.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBubble.swift; sourceTree = "<group>"; };
34874A9F292509A4000570DF /* QuestViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewHeader.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -373,6 +384,7 @@
A5AC96DB292237C3003B7637 /* QuestEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestEntity.swift; sourceTree = "<group>"; };
A5AC96E529223F06003B7637 /* QuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsStorage.swift; sourceTree = "<group>"; };
A5AC96E729223F27003B7637 /* RealmQuestsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmQuestsStorage.swift; sourceTree = "<group>"; };
A5BD61E529423FBB0075970F /* SyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncManager.swift; sourceTree = "<group>"; };
A5D3C812293DB1BE00F43B76 /* DataConfigure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataConfigure.swift; sourceTree = "<group>"; };
A5D3C822293DDDAD00F43B76 /* ProtectedUserRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtectedUserRepository.swift; sourceTree = "<group>"; };
A5D3C827293DDEBE00F43B76 /* QuestsRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepositoryTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -634,6 +646,7 @@
3449AD5E292219D600B87619 /* Common */ = {
isa = PBXGroup;
children = (
3472E8EF29420D8D00BB304F /* ViewModel */,
34FCD367293DEEBC00E0DC8A /* ViewController */,
3499551C292332DE007AB99E /* Cells */,
B50078D529222F3F0070AFC4 /* CircleCheckView.swift */,
Expand All @@ -654,6 +667,33 @@
path = View;
sourceTree = "<group>";
};
3472E8EF29420D8D00BB304F /* ViewModel */ = {
isa = PBXGroup;
children = (
3472E8F029420D9600BB304F /* FriendViewModel.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
3472E8F22942133B00BB304F /* Common */ = {
isa = PBXGroup;
children = (
3472E8F32942134000BB304F /* Protocols */,
3472E8FA29421CB500BB304F /* DefaultFriendCalendarUseCase.swift */,
3472E8F6294213BE00BB304F /* DefaultFriendQuestUseCase.swift */,
);
path = Common;
sourceTree = "<group>";
};
3472E8F32942134000BB304F /* Protocols */ = {
isa = PBXGroup;
children = (
3472E8F42942135D00BB304F /* FriendQuestUseCase.swift */,
3472E8F829421C7C00BB304F /* FriendCalendarUseCase.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
34995510292321FD007AB99E /* Utils */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -684,6 +724,7 @@
34995516292329F4007AB99E /* UseCases */ = {
isa = PBXGroup;
children = (
3472E8F22942133B00BB304F /* Common */,
3417B1402935DA1B00900454 /* Settings */,
3417B13F2935DA1500900454 /* Browse */,
3416FC85292B549900B504C5 /* Home */,
Expand Down Expand Up @@ -880,6 +921,7 @@
34ACC32E291DE9C000741371 /* SceneDelegate.swift */,
34A529D429247932001BAD34 /* AppCoordinator.swift */,
34A529E829248B58001BAD34 /* AppAppearance.swift */,
A5BD61E529423FBB0075970F /* SyncManager.swift */,
);
path = Application;
sourceTree = "<group>";
Expand Down Expand Up @@ -1291,6 +1333,7 @@
buildActionMask = 2147483647;
files = (
34404D94293EF9850007E661 /* SettingsUseCase.swift in Sources */,
3472E8F929421C7C00BB304F /* FriendCalendarUseCase.swift in Sources */,
A5A8C8362936EC7E00988C88 /* SubQuestEntity.swift in Sources */,
34EC71D1292DF27E004813CB /* Date+.swift in Sources */,
34D8360129359C8A001DE9DF /* BrowseRepository.swift in Sources */,
Expand Down Expand Up @@ -1332,6 +1375,7 @@
A50F9A3429266F45005C00FE /* NetworkService.swift in Sources */,
A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */,
A5AC96E629223F06003B7637 /* QuestsStorage.swift in Sources */,
3472E8F129420D9600BB304F /* FriendViewModel.swift in Sources */,
A51F01D52923407E0031ECA2 /* BrowseQuestEntity.swift in Sources */,
3416FC8A292B560800B504C5 /* DefaultQuestUseCase.swift in Sources */,
9BD8CCF32935BC0D00E6EA2F /* DefaultBrowseRepository.swift in Sources */,
Expand Down Expand Up @@ -1377,12 +1421,14 @@
A51189C329226E66008A9D33 /* QuestEntity+Mapping.swift in Sources */,
A51F01D3292340360031ECA2 /* BrowseQuestsStorage.swift in Sources */,
A50F9A3729266F6F005C00FE /* FirebaseService.swift in Sources */,
3472E8F52942135D00BB304F /* FriendQuestUseCase.swift in Sources */,
9B1CFB3F292B585700CCE97A /* QuestDTO+Mapping.swift in Sources */,
34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */,
342830F4292E19B700AE811B /* PlainCell.swift in Sources */,
34FCD36B293DF2F600E0DC8A /* FriendStatusView.swift in Sources */,
A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */,
345687F42937329E00CA51E3 /* EnrollViewController.swift in Sources */,
A5BD61E629423FBB0075970F /* SyncManager.swift in Sources */,
A511229029384FAF00384B4B /* DefaultUserRepository.swift in Sources */,
A5003ABB293F914500082A9C /* DefaultUserUseCase.swift in Sources */,
342830FF292E2B2A00AE811B /* NavigateCell.swift in Sources */,
Expand All @@ -1401,6 +1447,7 @@
34283101292E2D7A00AE811B /* ToggleItemViewModel.swift in Sources */,
34FCD366293DE62700E0DC8A /* DefaultEnrollUseCase.swift in Sources */,
A5AC96E829223F27003B7637 /* RealmQuestsStorage.swift in Sources */,
3472E8FB29421CB500BB304F /* DefaultFriendCalendarUseCase.swift in Sources */,
A5003AB4293F5FEC00082A9C /* SignUpViewModel.swift in Sources */,
345687F829374D2500CA51E3 /* DayNamePickerView.swift in Sources */,
349955122923220E007AB99E /* SwiftUIPreview.swift in Sources */,
Expand All @@ -1409,6 +1456,7 @@
9BED4DEE2941932200C60631 /* CameraIconView.swift in Sources */,
34ACC32F291DE9C000741371 /* SceneDelegate.swift in Sources */,
34A529D829247A87001BAD34 /* HomeCoordinator.swift in Sources */,
3472E8F7294213BE00BB304F /* DefaultFriendQuestUseCase.swift in Sources */,
34283103292E2D9B00AE811B /* ToggleCell.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,50 @@ import UIKit
final class BrowseSceneDIContainer {

lazy var browseQuestsStorage: BrowseQuestsStorage = RealmBrowseQuestsStorage()
lazy var questsStorage: QuestsStorage = RealmQuestsStorage()

// MARK: - Repositories
func makeBrowseRepository() -> BrowseRepository {
return DefaultBrowseRepository(persistentStorage: browseQuestsStorage)
}

func makeQuestsRepository() -> QuestsRepository {
return DefaultQuestsRepository(persistentStorage: questsStorage)
}

// MARK: - Use Cases
func makeBrowseUseCase() -> BrowseUseCase {
return DefaultBrowseUseCase(browseRepository: makeBrowseRepository())
}

func makeFriendQuestUseCase() -> FriendQuestUseCase {
return DefaultFriendUseCase(questsRepository: makeQuestsRepository())
}

func makeFriendCalendarUseCase(with user: User) -> FriendCalendarUseCase {
return DefaultFriendCalendarUseCase(user: user, questsRepository: makeQuestsRepository())
}

// MARK: - View Models
func makeBrowseViewModel() -> BrowseViewModel {
return BrowseViewModel(browseUseCase: makeBrowseUseCase())
}

func makeFriendViewModel(with user: User) -> FriendViewModel {
return FriendViewModel(user: user,
friendQuestUseCase: makeFriendQuestUseCase(),
friendCalendarUseCase: makeFriendCalendarUseCase(with: user))
}

// MARK: - View Controller
func makeBrowseViewController() -> BrowseViewController {
return BrowseViewController.create(with: makeBrowseViewModel())
}

func makeFriendViewController(with user: User) -> FriendViewController {
return FriendViewController.create(with: makeFriendViewModel(with: user))
}

// MARK: - Flow
func makeBrowseCoordinator(navigationController: UINavigationController,
browseSceneDIContainer: BrowseSceneDIContainer) -> BrowseCoordinator {
Expand Down
3 changes: 3 additions & 0 deletions DailyQuest/DailyQuest/Application/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.

let syncManager = SyncManager()
syncManager.sync()
}


Expand Down
82 changes: 82 additions & 0 deletions DailyQuest/DailyQuest/Application/SyncManager.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
//
// SyncManager.swift
// DailyQuest
//
// Created by ์ด์ „ํฌ on 2022/12/09.
//

import UIKit
import RxSwift

final class SyncManager {
private let app = UIApplication.shared
private let persistentStorage: RealmStorage = RealmStorage.shared
private let networkStorage: NetworkService = FirebaseService.shared

private let disposeBag = DisposeBag()

func sync(){
guard FirebaseService.shared.uid.value != nil else {return }
let taskId = app.beginBackgroundTask()
self.qusetsSync()
.timeout(.seconds(20), scheduler: MainScheduler.instance)
.subscribe(onSuccess:{ res in
print("โœ…",res)
self.app.endBackgroundTask(taskId)
},onFailure: { error in
print("โŒ",error)
self.app.endBackgroundTask(taskId)
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
}

private func qusetsSync() -> Single<Bool> {
self.fetchQuests()
.flatMap { [weak self] persistentStorageQuest in
guard let self = self else { return Single<[Quest]>.just([]) }
return self.networkStorage.read(type: QuestDTO.self, userCase: .currentUser, access: .quests, filter: nil)
.map { $0.toDomain() }
.toArray()
.map { networkServiceQuests in
let networkServiceQuestsDict = Dictionary(uniqueKeysWithValues: networkServiceQuests.map { ($0.uuid, $0) })
let quests = persistentStorageQuest.filter {
guard let dictQuest = networkServiceQuestsDict[$0.uuid] else { return true }
return dictQuest != $0
}
return quests
}
}
.flatMap{ [weak self] syncQuests in
guard let self = self else { return Single<Bool>.just(false)}
return Observable<Quest>.from(syncQuests)
.flatMap { quest in
self.networkStorage.create(userCase: .currentUser, access: .quests, dto: quest.toDTO())
}
.map{$0.toDomain()}
.toArray()
.map{ _ in true}
}
}

private func fetchQuests() -> Single<[Quest]> {
return Single.create { [weak self] single in
guard let persistentStorage = self?.persistentStorage else {
single(.failure(RealmStorageError.noDataError))
return Disposables.create()
}

do {
let quests = try persistentStorage
.fetchEntities(type: QuestEntity.self, filter: nil)
.compactMap { $0.toDomain() }
single(.success(quests))
} catch let error {
single(.failure(error))
}

return Disposables.create()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import RxSwift

protocol BrowseQuestsStorage {
func fetchBrowseQuests() -> Observable<[BrowseQuest]>
func fetchBrowseQuests() -> Single<[BrowseQuest]>
func saveBrowseQuest(browseQuest: BrowseQuest) -> Single<BrowseQuest>
func deleteBrowseQuests() -> Single<Bool>
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,18 @@ final class RealmBrowseQuestsStorage {
}

extension RealmBrowseQuestsStorage: BrowseQuestsStorage {
func fetchBrowseQuests() -> Observable<[BrowseQuest]> {
return Observable<[BrowseQuest]>.create { [weak self] observer in
func fetchBrowseQuests() -> Single<[BrowseQuest]> {
return Single<[BrowseQuest]>.create { [weak self] single in
guard let realmStorage = self?.realmStorage else {
return Disposables.create()
}

do {
let browseQuests = try realmStorage.fetchEntities(type: BrowseQuestEntity.self)
.compactMap { $0.toDomain() }
observer.onNext(browseQuests)
observer.onCompleted()
single(.success(browseQuests))
} catch let error {
observer.onError(error)
single(.failure(error))
}

return Disposables.create()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ import RxSwift

protocol QuestsStorage {
func saveQuests(with quests: [Quest]) -> Single<[Quest]>
func fetchQuests(by date: Date) -> Observable<[Quest]>
func fetchQuests(by date: Date) -> Single<[Quest]>
func updateQuest(with quest: Quest) -> Single<Quest>
func deleteQuest(with questId: UUID) -> Single<Quest>
func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]>
func deleteAllQuests() -> Single<[Quest]>
func fetchQuests() -> Single<[Quest]>
}
Loading