Skip to content

Commit

Permalink
[feat] Observable -> Single
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeonhui committed Dec 9, 2022
1 parent 8228c36 commit b68f9b2
Show file tree
Hide file tree
Showing 24 changed files with 66 additions and 97 deletions.
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 @@ -17,40 +17,27 @@ final class RealmUserInfoStorage {
}

extension RealmUserInfoStorage: UserInfoStorage {
func fetchUserInfo() -> Observable<User> {
return Observable<User>.create { [weak self] observer in
guard let realmStorage = self?.realmStorage else {
// self가 존재하지 않을 경우, 반환하지 않고 종료
return Disposables.create()
}

func fetchUserInfo() -> Single<User> {
return Single<User>.create { [weak self] single in
do {
guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError }
guard let userInfoEntity = try realmStorage.fetchEntities(type: UserInfoEntity.self)
.first else {
throw RealmStorageError.noDataError
}

observer.onNext(userInfoEntity.toDomain())
observer.onCompleted()
single(.success(userInfoEntity.toDomain()))
} catch let error {
// Realm을 불러올 수 없을 경우, realmObjectError
// User 정보가 없을 경우, noDataError
observer.onError(error)
single(.failure(error))
}

return Disposables.create()
}
}

func updateUserInfo(user: User) -> Single<User> {
return Single.create { [weak self] single in
guard let realmStorage = self?.realmStorage else {
return Disposables.create()
}

let userInfo = UserInfoEntity(user: user)

do {
guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError }
// update 성공했을 경우, success(user)
try realmStorage.updateEntity(entity: userInfo)
single(.success(user))
Expand All @@ -65,12 +52,8 @@ extension RealmUserInfoStorage: UserInfoStorage {

func deleteUserInfo() -> Single<User> {
return Single.create { [weak self] single in
guard let realmStorage = self?.realmStorage else {
return Disposables.create()
}

do {
// update 성공했을 경우, success(user)
guard let realmStorage = self?.realmStorage else { throw RealmStorageError.realmObjectError }
guard let user = try realmStorage.deleteAllEntity(type: UserInfoEntity.self).first?.toDomain() else {
throw RealmStorageError.noDataError
}
Expand All @@ -79,7 +62,6 @@ extension RealmUserInfoStorage: UserInfoStorage {
// update 성공하지 못했을 경우, failure(error)
single(.failure(RealmStorageError.deleteError(error)))
}

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

protocol UserInfoStorage {
func fetchUserInfo() -> Observable<User>
func fetchUserInfo() -> Single<User>
func updateUserInfo(user: User) -> Single<User>
func deleteUserInfo() -> Single<User>
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ extension DefaultBrowseRepository: BrowseRepository {
/// Fetch BrowseQuests
/// Firebase 우선, 실패시 persistentStorage, persistentStorage도 실패시 Error반환
/// - Returns: Observable<[BrowseQuest]>
func fetch() -> Observable<[BrowseQuest]> {
return self.networkService.getAllowUsers(limit: 10)
func fetch() -> Single<[BrowseQuest]> {
let uid = networkService.uid.value
return networkService.getAllowUsers(limit: 10)
.map { $0.toDomain() }
.flatMap(fetchBrowseQuestNetworkService(user:))
.filter { !$0.quests.isEmpty }
.filter { !$0.quests.isEmpty && uid != $0.user.uuid }
.toArray()
.asObservable()
.do(afterNext: { [weak self] browseQuests in
.do(afterSuccess: { [weak self] browseQuests in
guard let self = self else { return }
self.persistentStorage.deleteBrowseQuests()
.asObservable()
Expand All @@ -45,20 +45,20 @@ extension DefaultBrowseRepository: BrowseRepository {
.disposed(by: self.disposeBag)
})
.timeout(.seconds(5), scheduler: MainScheduler.instance)
.catch { _ in
return self.persistentStorage.fetchBrowseQuests()
.catch { [weak self] _ in
guard let self = self else { return Single.just([])}
return self.persistentStorage.fetchBrowseQuests()
}
}
}

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

func saveBrowseQuestPersistentStorage(browseQuest: BrowseQuest) -> Observable<BrowseQuest> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@ extension DefaultQuestsRepository: QuestsRepository {
.flatMap (saveNetworkService(quests:))
}

func fetch(by date: Date) -> Observable<[Quest]> {
func fetch(by date: Date) -> Single<[Quest]> {
return persistentStorage.fetchQuests(by: date)
.asObservable()
.catch { [weak self] _ in
guard let self = self else { return Observable.just([]) }
guard let self = self else { return Single.just([]) }
return self.fetchNetworkService(date: date)
}
.catchAndReturn([])
Expand All @@ -49,14 +48,13 @@ extension DefaultQuestsRepository: QuestsRepository {
.flatMap(deleteAllNetworkService(quests:))
}

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

Expand All @@ -74,11 +72,10 @@ private extension DefaultQuestsRepository {
.toArray()
}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,14 @@ extension DefaultUserRepository: UserRepository {
func readUser() -> Single<User> {
return self.persistentStorage.fetchUserInfo()
.catch { [weak self] _ in
guard let self = self else { return Observable.just(User()) }
guard let self = self else { return Single.just(User()) }
return self.fetchUserNetworkService()
}
.asSingle()
}

func updateUser(by user: User) -> Single<User> {
return persistentStorage.updateUserInfo(user: user)
.asObservable()
.flatMap(updateUserNetworkService(user:))
.asSingle()
}

func fetchUser(by uuid: String) -> Single<User> {
Expand All @@ -67,13 +64,12 @@ extension DefaultUserRepository: UserRepository {
return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: userDto)
}
.map { $0.toDomain() }
.asSingle()
}
.flatMap(updateUser(by:))
.map { _ in true }
.catchAndReturn(false)
.do(afterSuccess: { _ in
NotificationCenter.default.post(name: .userUpdated, object: nil)
.do(afterSuccess: { result in
NotificationCenter.default.post(name: .userUpdated, object: result)
})
}

Expand All @@ -92,7 +88,6 @@ extension DefaultUserRepository: UserRepository {
return self.networkService.update(userCase: .currentUser, access: .userInfo, dto: userDto)
}
.map { $0.toDomain() }
.asSingle()
}
.flatMap(updateUser(by:))
.map { _ in true }
Expand All @@ -105,20 +100,19 @@ extension DefaultUserRepository: UserRepository {
}

extension DefaultUserRepository: ProtectedUserRepository {
func deleteUser() -> Observable<Bool> {
func deleteUser() -> Single<Bool> {
return networkService
.delete(userCase: .currentUser, access: .userInfo, dto: UserDTO())
.flatMap { [weak self] _ in
guard let self = self else { return .just(true) }
guard let self = self else { return .just(false) }
return self.networkService.deleteUser()
.flatMap { _ in
return self.persistentStorage.deleteUserInfo()
.map{ _ in true}
}
}
.catchAndReturn(false)
.asObservable()
.do(onNext: { [weak self]_ in
.do(onSuccess: { [weak self]_ in
guard let self = self else { return }
self.networkService.signOut().subscribe()
.disposed(by: self.disposeBag)
Expand All @@ -127,15 +121,15 @@ extension DefaultUserRepository: ProtectedUserRepository {
}

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

func updateUserNetworkService(user: User) -> Observable<User> {
func updateUserNetworkService(user: User) -> Single<User> {
networkService.update(userCase: .currentUser, access: .userInfo, dto: user.toDTO())
.map { $0.toDomain() }
.asObservable()
.catchAndReturn(user)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ import RxSwift

protocol BrowseRepository {
// TODO: 무한 스크롤을 위한 페이징 추가
func fetch() -> Observable<[BrowseQuest]>
func fetch() -> Single<[BrowseQuest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ import RxSwift
protocol ProtectedUserRepository {
/// 유저정보를 삭제합니다.
/// - Returns: 삭제 성공 여부를 방출하는 Observable입니다.
func deleteUser() -> Observable<Bool>
func deleteUser() -> Single<Bool>
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protocol QuestsRepository {
- date: 받아오길 원하는 날짜입니다.
- Returns: Quest의 배열을 방출하는 Observable입니다. 비어있다면 비어있는 배열을 방출합니다.
*/
func fetch(by date: Date) -> Observable<[Quest]>
func fetch(by date: Date) -> Single<[Quest]>

/**
해당 날짜의 퀘스트 값(`currentCount`)을 업데이트 합니다.
Expand Down Expand Up @@ -56,5 +56,5 @@ protocol QuestsRepository {
*/
func deleteAll(with groupId: UUID) -> Single<[Quest]>

func fetch(by uuid: String, date: Date) -> Observable<[Quest]>
func fetch(by uuid: String, date: Date) -> Single<[Quest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ final class DefaultBrowseUseCase {
}

extension DefaultBrowseUseCase: BrowseUseCase {
func excute() -> Observable<[BrowseQuest]> {
func excute() -> Single<[BrowseQuest]> {
return browseRepository.fetch()
}
}

final class BrowseMockRepo: BrowseRepository {
func fetch() -> RxSwift.Observable<[BrowseQuest]> {
func fetch() -> Single<[BrowseQuest]> {
return .just([BrowseQuest(user: User(uuid: "", nickName: "test", profileURL: "", backgroundImageURL: "", introduce: "", allow: false), quests: [])])
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ import Foundation
import RxSwift

protocol BrowseUseCase {
func excute() -> Observable<[BrowseQuest]>
func excute() -> Single<[BrowseQuest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ extension DefaultFriendCalendarUseCase {

return self.questsRepository
.fetch(by: self.user.uuid, date: date)
.asObservable()
.map { quests -> DailyQuestCompletion in
let isSelected = (try? self.selectedDate.value().startOfDay == date) ?? false

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ final class DefaultFriendUseCase {
}

extension DefaultFriendUseCase: FriendQuestUseCase {
func fetch(with uuid: String, by date: Date) -> Observable<[Quest]> {
func fetch(with uuid: String, by date: Date) -> Single<[Quest]> {
return questsRepository.fetch(by: uuid, date: date)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ import Foundation
import RxSwift

protocol FriendQuestUseCase {
func fetch(with uuid: String, by date: Date) -> Observable<[Quest]>
func fetch(with uuid: String, by date: Date) -> Single<[Quest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ final class DefaultEnrollUseCase {
}

extension DefaultEnrollUseCase: EnrollUseCase {
func save(with quests: [Quest]) -> Observable<Bool> {
func save(with quests: [Quest]) -> Single<Bool> {
return questsRepository
.save(with: quests)
.map { _ in
Expand All @@ -29,6 +29,5 @@ extension DefaultEnrollUseCase: EnrollUseCase {
let dates = quests.map { $0.date }
NotificationCenter.default.post(name: .updated, object: dates)
})
.asObservable()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ final class DefaultQuestUseCase {
}

extension DefaultQuestUseCase: QuestUseCase {
func fetch(by date: Date) -> Observable<[Quest]> {
func fetch(by date: Date) -> Single<[Quest]> {
return questsRepository.fetch(by: date)
}

func update(with quest: Quest) -> Observable<Bool> {
func update(with quest: Quest) -> Single<Bool> {
return questsRepository
.update(with: quest)
.do(onSuccess: { quest in
Expand All @@ -32,6 +32,5 @@ extension DefaultQuestUseCase: QuestUseCase {
})
.map { _ in true }
.catchAndReturn(false)
.asObservable()
}
}
Loading

0 comments on commit b68f9b2

Please sign in to comment.