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

QuestUseCase 작성 및 테스트 #30

Merged
merged 8 commits into from
Nov 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
92 changes: 88 additions & 4 deletions DailyQuest/DailyQuest.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,18 @@
objects = {

/* Begin PBXBuildFile section */
340FDFD3292B5CE300C4E3DC /* QuestsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAE317292B19A3007653AD /* QuestsRepository.swift */; };
340FDFD4292B5DA100C4E3DC /* QuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC87292B54DB00B504C5 /* QuestUseCase.swift */; };
340FDFD5292B5DB700C4E3DC /* DefaultQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */; };
34131397291E47D300E607E1 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 34131396291E47D300E607E1 /* RxCocoa */; };
34131399291E47D300E607E1 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 34131398291E47D300E607E1 /* RxSwift */; };
3413139C291E480500E607E1 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 3413139B291E480500E607E1 /* SnapKit */; };
3416FC88292B54DB00B504C5 /* QuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC87292B54DB00B504C5 /* QuestUseCase.swift */; };
3416FC8A292B560800B504C5 /* DefaultQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */; };
3416FC8E292B593C00B504C5 /* Quest+Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC8D292B593C00B504C5 /* Quest+Stub.swift */; };
3416FC93292B59D300B504C5 /* QuestRepositoryMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC92292B59D300B504C5 /* QuestRepositoryMock.swift */; };
3416FC95292B5AD600B504C5 /* QuestUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC94292B5AD600B504C5 /* QuestUseCaseTests.swift */; };
3416FC96292B5B5400B504C5 /* Quest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5A2922164B00B87619 /* Quest.swift */; };
3449AD5B2922164B00B87619 /* Quest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5A2922164B00B87619 /* Quest.swift */; };
3449AD5D2922197000B87619 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5C2922197000B87619 /* User.swift */; };
3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5F29222B3900B87619 /* UserInfoCell.swift */; };
Expand Down Expand Up @@ -40,14 +49,14 @@
34ACC32F291DE9C000741371 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34ACC32E291DE9C000741371 /* SceneDelegate.swift */; };
34ACC336291DE9C100741371 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC335291DE9C100741371 /* Assets.xcassets */; };
34ACC339291DE9C100741371 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC337291DE9C100741371 /* LaunchScreen.storyboard */; };
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 */; };
A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; };
Expand Down Expand Up @@ -87,6 +96,11 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
3416FC87292B54DB00B504C5 /* QuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCase.swift; sourceTree = "<group>"; };
3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultQuestUseCase.swift; sourceTree = "<group>"; };
3416FC8D292B593C00B504C5 /* Quest+Stub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Quest+Stub.swift"; sourceTree = "<group>"; };
3416FC92292B59D300B504C5 /* QuestRepositoryMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestRepositoryMock.swift; sourceTree = "<group>"; };
3416FC94292B5AD600B504C5 /* QuestUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCaseTests.swift; sourceTree = "<group>"; };
3449AD5A2922164B00B87619 /* Quest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Quest.swift; sourceTree = "<group>"; };
3449AD5C2922197000B87619 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
3449AD5F29222B3900B87619 /* UserInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoCell.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -120,11 +134,11 @@
34ACC338291DE9C100741371 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
34ACC33A291DE9C100741371 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
34ACC33F291DE9C100741371 /* DailyQuestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DailyQuestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
34ACC343291DE9C100741371 /* DailyQuestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestTests.swift; sourceTree = "<group>"; };
34ACC349291DE9C100741371 /* DailyQuestUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DailyQuestUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
34ACC34D291DE9C100741371 /* DailyQuestUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestUITests.swift; sourceTree = "<group>"; };
34ACC34F291DE9C100741371 /* DailyQuestUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestUITestsLaunchTests.swift; sourceTree = "<group>"; };
34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
34CAE317292B19A3007653AD /* QuestsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestsRepository.swift; sourceTree = "<group>"; };
34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = "<group>"; };
34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = "<group>"; };
A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -178,6 +192,63 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
340FDFD8292B61C200C4E3DC /* Presentation */ = {
isa = PBXGroup;
children = (
);
path = Presentation;
sourceTree = "<group>";
};
3416FC85292B549900B504C5 /* Home */ = {
isa = PBXGroup;
children = (
3416FC86292B54BF00B504C5 /* Protocols */,
3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */,
);
path = Home;
sourceTree = "<group>";
};
3416FC86292B54BF00B504C5 /* Protocols */ = {
isa = PBXGroup;
children = (
3416FC87292B54DB00B504C5 /* QuestUseCase.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
3416FC8B292B58F600B504C5 /* Domain */ = {
isa = PBXGroup;
children = (
3416FC90292B59BB00B504C5 /* UseCases */,
);
path = Domain;
sourceTree = "<group>";
};
3416FC8C292B592C00B504C5 /* Mocks */ = {
isa = PBXGroup;
children = (
3416FC8D292B593C00B504C5 /* Quest+Stub.swift */,
);
path = Mocks;
sourceTree = "<group>";
};
3416FC90292B59BB00B504C5 /* UseCases */ = {
isa = PBXGroup;
children = (
3416FC94292B5AD600B504C5 /* QuestUseCaseTests.swift */,
3416FC91292B59C700B504C5 /* Mocks */,
);
path = UseCases;
sourceTree = "<group>";
};
3416FC91292B59C700B504C5 /* Mocks */ = {
isa = PBXGroup;
children = (
3416FC92292B59D300B504C5 /* QuestRepositoryMock.swift */,
);
path = Mocks;
sourceTree = "<group>";
};
3449AD592922162E00B87619 /* Entities */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -231,6 +302,7 @@
34995516292329F4007AB99E /* UseCases */ = {
isa = PBXGroup;
children = (
3416FC85292B549900B504C5 /* Home */,
);
path = UseCases;
sourceTree = "<group>";
Expand All @@ -246,6 +318,7 @@
3499551829232A05007AB99E /* Repositories */ = {
isa = PBXGroup;
children = (
34CAE317292B19A3007653AD /* QuestsRepository.swift */,
);
path = Repositories;
sourceTree = "<group>";
Expand Down Expand Up @@ -387,7 +460,9 @@
34ACC342291DE9C100741371 /* DailyQuestTests */ = {
isa = PBXGroup;
children = (
34ACC343291DE9C100741371 /* DailyQuestTests.swift */,
340FDFD8292B61C200C4E3DC /* Presentation */,
3416FC8B292B58F600B504C5 /* Domain */,
3416FC8C292B592C00B504C5 /* Mocks */,
);
path = DailyQuestTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -734,11 +809,13 @@
34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */,
34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */,
34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */,
34CAE318292B19A3007653AD /* QuestsRepository.swift in Sources */,
3449AD5D2922197000B87619 /* User.swift in Sources */,
A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */,
A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */,
A5AC96E629223F06003B7637 /* UserQuestsStorage.swift in Sources */,
A51F01D52923407E0031ECA2 /* BrowseQuestEntity.swift in Sources */,
3416FC8A292B560800B504C5 /* DefaultQuestUseCase.swift in Sources */,
A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */,
34A529E429248178001BAD34 /* SettingsSceneDIContainer.swift in Sources */,
34A529E029247F1F001BAD34 /* HomeViewController.swift in Sources */,
Expand All @@ -761,6 +838,7 @@
A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */,
A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */,
A5AC96DC292237C3003B7637 /* UserQuestEntity.swift in Sources */,
3416FC88292B54DB00B504C5 /* QuestUseCase.swift in Sources */,
A51F01D029233C510031ECA2 /* UserInfoEntity+Mapping.swift in Sources */,
3499552B29236041007AB99E /* BrowseViewModel.swift in Sources */,
3449AD5B2922164B00B87619 /* Quest.swift in Sources */,
Expand All @@ -776,7 +854,13 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
34ACC344291DE9C100741371 /* DailyQuestTests.swift in Sources */,
3416FC96292B5B5400B504C5 /* Quest.swift in Sources */,
3416FC95292B5AD600B504C5 /* QuestUseCaseTests.swift in Sources */,
3416FC8E292B593C00B504C5 /* Quest+Stub.swift in Sources */,
340FDFD5292B5DB700C4E3DC /* DefaultQuestUseCase.swift in Sources */,
3416FC93292B59D300B504C5 /* QuestRepositoryMock.swift in Sources */,
340FDFD4292B5DA100C4E3DC /* QuestUseCase.swift in Sources */,
340FDFD3292B5CE300C4E3DC /* QuestsRepository.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,18 @@ extension UserQuestEntity {
convenience init(quest: Quest) {
self.init(uuid: quest.uuid,
title: quest.title,
startDay: quest.startDay,
endDay: quest.endDay,
startDay: Date(), // no more use
endDay: Date(), // no more use
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

quest Entity도 수정해 놓겠습니다

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Quest에 Date 추가해야 할 것 같습니다!

currentCount: quest.currentCount,
totalCount: quest.totalCount)
}
}

extension UserQuestEntity {
func toDomain() -> Quest {
return Quest(uuid: uuid,
return Quest(groupId: UUID(), // update here
uuid: uuid,
title: title,
startDay: startDay,
endDay: endDay,
repeat: `repeat`,
currentCount: currentCount,
totalCount: totalCount)
}
Expand Down
4 changes: 1 addition & 3 deletions DailyQuest/DailyQuest/Domain/Entities/Quest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@
import Foundation

struct Quest {
let groupId: UUID
let uuid: UUID
let title: String
let startDay: Date
let endDay: Date
let `repeat`: Int
var currentCount: Int
let totalCount: Int

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
//
// QuestsRepository.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/21.
//

import Foundation

import RxSwift

protocol QuestsRepository {
/**
해당 퀘스트를 저장합니다.

- Parameters:
- quest: 저장할 퀘스트입니다.
- Returns: 성공시 Quest를, 실패시, error를 방출하는 Observable입니다.
*/
func save(with quest: [Quest]) -> Single<[Quest]>

/**
해당 날짜의 퀘스트 배열을 받아옵니다.

- Parameters:
- date: 받아오길 원하는 날짜입니다.
- Returns: Quest의 배열을 방출하는 Observable입니다. 비어있다면 비어있는 배열을 방출합니다.
*/
func fetch(by date: Date) -> Observable<[Quest]>

/**
해당 날짜의 퀘스트 값(`currentCount`)을 업데이트 합니다.

- Parameters:
- quest: 업데이트될 퀘스트입니다.
- Returns: 성공시 Quest를, 실패시 error를 방출하는 Observable입니다.
*/
func update(with quest: Quest) -> Single<Quest>

/**
해당 날짜에 해당하는 퀘스트의 값을 업데이트 합니다.

- Parameters:
- questId: 삭제하고자 하는 퀘스트의 id입니다.
- Returns: 성공시 해당 Quest를, 실패시 error를 방출하는 Observable입니다.
*/
func delete(with questId: UUID) -> Single<Quest>

/**
해당 group의 Quest를 모두 삭제합니다.


- Parameters:
- groupId: 삭제하고자 하는 퀘스트 그룹의 id입니다.
- Returns: 성공시 해당 Quest 배열을, 실패시 error를 방출하는 Observable입니다.
*/
func deleteAll(with groupId: UUID) -> Single<[Quest]>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// DefaultQuestUseCase.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/21.
//

import Foundation

import RxSwift

final class DefaultQuestUseCase {
private let questsRepository: QuestsRepository

init(questsRepository: QuestsRepository) {
self.questsRepository = questsRepository
}
}

extension DefaultQuestUseCase: QuestUseCase {
func fetch(by date: Date) -> Observable<[Quest]> {
return questsRepository.fetch(by: date)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// QuestUseCase.swift
// DailyQuest
//
// Created by jinwoong Kim on 2022/11/21.
//

import Foundation

import RxSwift

protocol QuestUseCase {
func fetch(by date: Date) -> Observable<[Quest]>
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,26 @@ import RxSwift
final class BrowseViewModel {
let user1 = User(uuid: "", nickName: "jinwoong", profile: Data(), backgroundImage: Data(), description: "")
let quests1 = [
Quest(uuid: UUID(), title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 2, totalCount: 5),
Quest(uuid: UUID(), title: "코딩하기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 0, totalCount: 10)
Quest(groupId: UUID(), uuid: UUID(), title: "물마시기", currentCount: 2, totalCount: 5),
Quest(groupId: UUID(),uuid: UUID(), title: "코딩하기", currentCount: 0, totalCount: 10)
]

let user2 = User(uuid: "", nickName: "someone", profile: Data(), backgroundImage: Data(), description: "")
let quests2 = [
Quest(uuid: UUID(), title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 5),
Quest(uuid: UUID(), title: "책읽기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 9, totalCount: 20),
Quest(uuid: UUID(), title: "달리기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 9),
Quest(uuid: UUID(), title: "잠자기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 1)
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)
]

let user3 = User(uuid: "", nickName: "Max...", profile: Data(), backgroundImage: Data(), description: "")
let quests3 = [
Quest(uuid: UUID(), title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 5),
Quest(uuid: UUID(), title: "그림 그리기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 2),
Quest(uuid: UUID(), title: "달리기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 9),
Quest(uuid: UUID(), title: "책읽기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 1),
Quest(uuid: UUID(), title: "잠자기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 1),
Quest(uuid: UUID(), title: "행복하기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 0, totalCount: 1)
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)
]

let data: Observable<[(User, [Quest])]>
Expand Down
Loading