-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #34 from boostcampwm-2022/feature/QuestRepository
Feature/quest repository
- Loading branch information
Showing
26 changed files
with
778 additions
and
190 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
// | ||
// DTO.swift | ||
// DailyQuest | ||
// | ||
// Created by 이전희 on 2022/11/21. | ||
// | ||
|
||
import Foundation | ||
|
||
protocol DTO: Codable { | ||
var uuid: UUID { get } | ||
} |
26 changes: 26 additions & 0 deletions
26
DailyQuest/DailyQuest/Data/Network/DataMapping/QuestDTO+Mapping.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// | ||
// QuestDTO+Mapping.swift | ||
// DailyQuest | ||
// | ||
// Created by 이다연 on 2022/11/21. | ||
// | ||
|
||
import Foundation | ||
|
||
struct QuestDTO: DTO { | ||
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
DailyQuest/DailyQuest/Data/PersistentStorages/QuestsStorage/QuestsStorage.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// | ||
// QuestsStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by 이전희 on 2022/11/14. | ||
// | ||
|
||
import Foundation | ||
import RxSwift | ||
|
||
protocol QuestsStorage { | ||
func saveQuests(with quests: [Quest]) -> Single<[Quest]> | ||
func fetchQuests(by date: Date) -> Observable<[Quest]> | ||
func updateQuest(with quest: Quest) -> Single<Quest> | ||
func deleteQuest(with questId: UUID) -> Single<Quest> | ||
func deleteQuestGroup(with groupId: UUID) -> Single<[Quest]> | ||
} |
31 changes: 31 additions & 0 deletions
31
...ata/PersistentStorages/QuestsStorage/RealmStorage/EntityMapping/QuestEntity+Mapping.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// | ||
// QuestEntity+Mapping.swift | ||
// DailyQuest | ||
// | ||
// Created by 이전희 on 2022/11/14. | ||
// | ||
|
||
import Foundation | ||
|
||
extension QuestEntity { | ||
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) | ||
} | ||
} | ||
|
||
extension QuestEntity { | ||
func toDomain() -> Quest { | ||
return Quest(groupId: groupId, | ||
uuid: uuid, | ||
date: date.toDate() ?? Date(), | ||
title: title, | ||
currentCount: currentCount, | ||
totalCount: totalCount) | ||
} | ||
} |
123 changes: 123 additions & 0 deletions
123
...st/DailyQuest/Data/PersistentStorages/QuestsStorage/RealmStorage/RealmQuestsStorage.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
// | ||
// RealmQuestsStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by 이전희 on 2022/11/14. | ||
// | ||
|
||
import Foundation | ||
import RxSwift | ||
|
||
final class RealmQuestsStorage { | ||
|
||
private let realmStorage: RealmStorage | ||
|
||
init(realmStorage: RealmStorage = RealmStorage.shared) { | ||
self.realmStorage = realmStorage | ||
} | ||
} | ||
|
||
extension RealmQuestsStorage: QuestsStorage { | ||
|
||
func saveQuests(with quests: [Quest]) -> Single<[Quest]> { | ||
return Single.create { [weak self] single in | ||
guard let realmStorage = self?.realmStorage else { | ||
return Disposables.create() | ||
} | ||
|
||
do { | ||
for quest in quests { | ||
let questEntity = QuestEntity(quest: quest) | ||
try realmStorage.saveEntity(entity: questEntity) | ||
} | ||
single(.success(quests)) | ||
} catch let error { | ||
single(.failure(RealmStorageError.saveError(error))) | ||
|
||
} | ||
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: QuestEntity.self, filter: NSPredicate(format: "date == %@", date.toString)) | ||
.compactMap { $0.toDomain() } | ||
observer.onNext(quests) | ||
observer.onCompleted() | ||
} catch let error { | ||
observer.onError(error) | ||
} | ||
|
||
return Disposables.create() | ||
} | ||
} | ||
|
||
func updateQuest(with quest: Quest) -> Single<Quest> { | ||
return Single.create { [weak self] single in | ||
guard let realmStorage = self?.realmStorage else { | ||
return Disposables.create() | ||
} | ||
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() | ||
} | ||
} | ||
|
||
func deleteQuest(with questId: UUID) -> Single<Quest> { | ||
return Single.create { [weak self] single in | ||
guard let realmStorage = self?.realmStorage else { | ||
return Disposables.create() | ||
} | ||
|
||
do { | ||
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(quest)) | ||
|
||
} catch let error { | ||
single(.failure(RealmStorageError.saveError(error))) | ||
} | ||
|
||
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: 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(quests)) | ||
|
||
} catch let error { | ||
single(.failure(RealmStorageError.saveError(error))) | ||
} | ||
|
||
return Disposables.create() | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.