-
Notifications
You must be signed in to change notification settings - Fork 0
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
Feature/realm #13
Feature/realm #13
Changes from all commits
70ec690
6fd8c3e
a0afb83
6bc2655
cb9e264
f6e1201
30c4e86
414153a
82a17b2
b878715
93053d8
9019f67
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// | ||
// BrowseQuest.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
|
||
// Domain-Entities μ΄λ | ||
struct BrowseQuest { | ||
let uuid: UUID | ||
let nickName: String | ||
let quests: [Quest] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// | ||
// BrowseQuestsStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import RxSwift | ||
|
||
protocol BrowseQuestsStorage { | ||
func fetchBrowseQuests() -> Observable<[BrowseQuest]> | ||
func saveBrowseQuest(browseQuest: BrowseQuest) -> Single<BrowseQuest> | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// | ||
// BrowseQuestEntity+Mapping.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
|
||
extension BrowseQuestEntity { | ||
convenience init(browseQuest: BrowseQuest) { | ||
let questsEntities = browseQuest.quests.compactMap { UserQuestEntity(quest: $0) } | ||
self.init(uuid: browseQuest.uuid, | ||
nickName: browseQuest.nickName, | ||
quests: questsEntities) | ||
} | ||
} | ||
|
||
extension BrowseQuestEntity { | ||
func toDomain() -> BrowseQuest { | ||
let quests = Array(quests).compactMap { $0.toDomain() } | ||
return BrowseQuest(uuid: uuid, | ||
nickName: nickName, | ||
quests: quests) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,58 @@ | ||||||||||||
// | ||||||||||||
// RealmBrowseQuestsStorage.swift | ||||||||||||
// DailyQuest | ||||||||||||
// | ||||||||||||
// Created by μ΄μ ν¬ on 2022/11/15. | ||||||||||||
// | ||||||||||||
|
||||||||||||
import RxSwift | ||||||||||||
|
||||||||||||
final class RealmBrowseQuestsStorage { | ||||||||||||
|
||||||||||||
private let realmStorage: RealmStorage | ||||||||||||
|
||||||||||||
init(realmStorage: RealmStorage = RealmStorage.shared) { | ||||||||||||
self.realmStorage = realmStorage | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
extension RealmBrowseQuestsStorage: BrowseQuestsStorage { | ||||||||||||
func fetchBrowseQuests() -> Observable<[BrowseQuest]> { | ||||||||||||
return Observable<[BrowseQuest]>.create { [weak self] observer in | ||||||||||||
guard let realmStorage = self?.realmStorage else { | ||||||||||||
return Disposables.create() | ||||||||||||
Comment on lines
+22
to
+23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. assertion μλ¬λ₯Ό λμμ£Όλ©΄ μ’μ κ² κ°μ΅λλ€. λΉλ‘ μ±μ΄ μ£½μ§λ§, κ°λ°νλ λμμλ νμ€ν indicateλ₯Ό λ°μ μ μμ κ² κ°μμ :)
Suggested change
|
||||||||||||
} | ||||||||||||
|
||||||||||||
do { | ||||||||||||
let browseQuests = try realmStorage.fetchEntities(type: BrowseQuestEntity.self) | ||||||||||||
.compactMap { $0.toDomain() } | ||||||||||||
observer.onNext(browseQuests) | ||||||||||||
observer.onCompleted() | ||||||||||||
} catch let error { | ||||||||||||
observer.onError(error) | ||||||||||||
} | ||||||||||||
|
||||||||||||
return Disposables.create() | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
func saveBrowseQuest(browseQuest: BrowseQuest) -> Single<BrowseQuest> { | ||||||||||||
return Single.create { [weak self] single in | ||||||||||||
guard let realmStorage = self?.realmStorage else { | ||||||||||||
return Disposables.create() | ||||||||||||
} | ||||||||||||
|
||||||||||||
let browseQuestEntity = BrowseQuestEntity(browseQuest: browseQuest) | ||||||||||||
|
||||||||||||
do { | ||||||||||||
try realmStorage.updateEntity(entity: browseQuestEntity) | ||||||||||||
single(.success(browseQuest)) | ||||||||||||
} catch let error { | ||||||||||||
single(.failure(RealmStorageError.saveError(error))) | ||||||||||||
} | ||||||||||||
|
||||||||||||
return Disposables.create() | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// | ||
// BrowseQuestEntity.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
import RealmSwift | ||
|
||
final class BrowseQuestEntity: Object { | ||
@Persisted var uuid: UUID | ||
@Persisted var nickName: String | ||
@Persisted var quests: List<UserQuestEntity> | ||
|
||
override init() { } | ||
|
||
init(uuid: UUID, nickName: String, quests: [UserQuestEntity]) { | ||
self.uuid = uuid | ||
self.nickName = nickName | ||
let realmList = List<UserQuestEntity>() | ||
realmList.append(objectsIn: quests) | ||
self.quests = realmList | ||
} | ||
|
||
override class func primaryKey() -> String? { | ||
"uuid" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// | ||
// UserInfoEntity.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
import RealmSwift | ||
|
||
final class UserInfoEntity: Object { | ||
@Persisted var uuid: UUID | ||
@Persisted var nickName: String | ||
@Persisted var profile: Data | ||
@Persisted var backgroundImage: Data | ||
@Persisted var userDescription: String | ||
|
||
override init() { } | ||
|
||
init(uuid: UUID, nickName: String, profile: Data, backgroundImage: Data, description: String) { | ||
self.uuid = uuid | ||
self.nickName = nickName | ||
self.profile = profile | ||
self.backgroundImage = backgroundImage | ||
self.userDescription = description | ||
} | ||
|
||
override class func primaryKey() -> String? { | ||
"uuid" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// | ||
// UserQuestEntity.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/14. | ||
// | ||
|
||
import Foundation | ||
import RealmSwift | ||
|
||
final class UserQuestEntity: Object { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. final ν€μλλ‘ μ±λ₯ν₯μ μ’μμ ~ :) |
||
@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 | ||
|
||
override init() { } | ||
|
||
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 | ||
} | ||
|
||
override class func primaryKey() -> String? { | ||
"uuid" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// | ||
// RealmStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/14. | ||
// | ||
|
||
import RealmSwift | ||
import Foundation | ||
|
||
enum RealmStorageError: Error { | ||
case realmObjectError | ||
case noDataError | ||
case readError(Error) | ||
case saveError(Error) | ||
case deleteError(Error) | ||
} | ||
|
||
final class RealmStorage { | ||
static let shared = RealmStorage() | ||
|
||
private init() { | ||
// Realm file path | ||
print(Realm.Configuration.defaultConfiguration.fileURL!) | ||
} | ||
|
||
private let persistentContainer = try? Realm() | ||
|
||
func updateEntity(entity: Object) throws { | ||
guard let persistentContainer = persistentContainer else { | ||
throw RealmStorageError.realmObjectError | ||
} | ||
try persistentContainer.write { | ||
persistentContainer.add(entity) | ||
} | ||
} | ||
|
||
func fetchEntities<O: Object>(type: O.Type) throws -> [O] { | ||
guard let persistentContainer = persistentContainer else { | ||
throw RealmStorageError.realmObjectError | ||
} | ||
return Array(persistentContainer.objects(type)) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// | ||
// UserInfoEntity+Mapping.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import Foundation | ||
|
||
// DomainObject -> RealmObject | ||
extension UserInfoEntity { | ||
convenience init(user: User) { | ||
self.init(uuid: user.uuid, | ||
nickName: user.nickName, | ||
profile: user.profile, | ||
backgroundImage: user.backgroundImage, | ||
description: user.description) | ||
} | ||
} | ||
|
||
// RealmObject -> DomainObject | ||
extension UserInfoEntity { | ||
func toDomain() -> User { | ||
return User(uuid: uuid, | ||
nickName: nickName, | ||
profile: profile, | ||
backgroundImage: backgroundImage, | ||
description: description) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// | ||
// RealmUserInfoStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import RxSwift | ||
|
||
final class RealmUserInfoStorage { | ||
|
||
private let realmStorage: RealmStorage | ||
|
||
init(realmStorage: RealmStorage = RealmStorage.shared) { | ||
self.realmStorage = realmStorage | ||
} | ||
} | ||
|
||
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() | ||
} | ||
|
||
do { | ||
guard let userInfoEntity = try realmStorage.fetchEntities(type: UserInfoEntity.self) | ||
.first else { | ||
throw RealmStorageError.noDataError | ||
} | ||
|
||
observer.onNext(userInfoEntity.toDomain()) | ||
observer.onCompleted() | ||
} catch let error { | ||
// Realmμ λΆλ¬μ¬ μ μμ κ²½μ°, realmObjectError | ||
// User μ λ³΄κ° μμ κ²½μ°, noDataError | ||
observer.onError(error) | ||
} | ||
|
||
return Disposables.create() | ||
} | ||
} | ||
|
||
func saveUserInfo(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 { | ||
// update μ±κ³΅νμ κ²½μ°, success(user) | ||
try realmStorage.updateEntity(entity: userInfo) | ||
single(.success(user)) | ||
} catch let error { | ||
// update μ±κ³΅νμ§ λͺ»νμ κ²½μ°, failure(error) | ||
single(.failure(RealmStorageError.saveError(error))) | ||
} | ||
|
||
return Disposables.create() | ||
} | ||
} | ||
|
||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// | ||
// UserInfoStorage.swift | ||
// DailyQuest | ||
// | ||
// Created by μ΄μ ν¬ on 2022/11/15. | ||
// | ||
|
||
import RxSwift | ||
|
||
protocol UserInfoStorage { | ||
func fetchUserInfo() -> Observable<User> | ||
func saveUserInfo(user: User) -> Single<User> | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
μ΄λ κ²λ μ¬μ©ν μ μμ΅λλ€!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
μ§μ λμ΄ μλ €μ£Όμ λ°©λ²μ΄ λ κΉλν΄λ³΄μ΄λ€μ 리ν©ν λ§ λΈλμΉνμ Assertionμ΄λ κ°μ΄ κ³ μ³λ³΄κ² μ΅λλ€