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/firebase #65

Merged
merged 4 commits into from
Nov 30, 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
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import Firebase
import RxSwift
import RxRelay
import FirebaseCore
import FirebaseAuth
import FirebaseFirestoreSwift
Expand All @@ -18,24 +19,24 @@ final class FirebaseService: NetworkService {
private let db: Firestore
private let storage: Storage

private(set) var uid: String?
private(set) var uid: BehaviorRelay<String?> = BehaviorRelay(value: nil)

private init() {
FirebaseApp.configure()
db = Firestore.firestore()
auth = Auth.auth()
storage = Storage.storage()
uid = auth.currentUser?.uid
uid.accept(auth.currentUser?.uid)
}

@discardableResult
private func documentReference(userCase: UserCase) throws -> DocumentReference {
switch userCase {
case .currentUser:
guard let currentUserUid = uid else { throw NetworkServiceError.noAuthError }
return db.collection("users").document(currentUserUid)
guard let currentUserUid = uid.value else { throw NetworkServiceError.noAuthError }
return db.collection(userCase.path).document(currentUserUid)
case let .anotherUser(uid):
return db.collection("users").document(uid)
return db.collection(userCase.path).document(uid)
}
}

Expand Down Expand Up @@ -66,6 +67,8 @@ final class FirebaseService: NetworkService {
if let error = error {
single(.failure(error))
}

self.uid.accept(self.auth.currentUser?.uid)
single(.success(true))
}
} catch let error {
Expand All @@ -80,6 +83,8 @@ final class FirebaseService: NetworkService {
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
try self.auth.signOut()

self.uid.accept(self.auth.currentUser?.uid)
single(.success(true))
} catch let error {
single(.failure(error))
Expand All @@ -99,15 +104,15 @@ final class FirebaseService: NetworkService {
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
try self.checkPermission(crud: .create, userCase: userCase, access: access)
guard let uid = self.uid else { throw NetworkServiceError.noAuthError }
guard let uid = self.uid.value else { throw NetworkServiceError.noAuthError }
let ref = try self.documentReference(userCase: userCase)
switch access {
case .quests:
try ref.collection("quests")
try ref.collection(access.path)
.document("\(dto.uuid)")
.setData(from: dto)
case .receiveQuests:
try ref.collection("receiveQuests")
try ref.collection(access.path)
.document(uid)
.setData(from: dto)
case .userInfo:
Expand All @@ -129,27 +134,28 @@ final class FirebaseService: NetworkService {
/// - access: quests / receiveQuests / userInfo
/// - condition: quests - today(date) / month(date) / year(date)
/// - Returns: Observable<T>
func read<T: DTO>(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition? = nil) -> Observable<T> {
func read<T: DTO>(type: T.Type, userCase: UserCase, access: Access, filter: NetworkDateFilter? = nil) -> Observable<T> {
return Observable<T>.create { [weak self] observer in
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
try self.checkPermission(crud: .read, userCase: userCase, access: access)
let ref = try self.documentReference(userCase: userCase)
switch access {
case .quests:
guard let condition = condition else { throw NetworkServiceError.needConditionError }
guard let filter = filter else { throw NetworkServiceError.needFilterError }
var query: Query? = nil
switch condition {
switch filter {
case let .today(date):
query = ref.collection("quests").whereField("date", isEqualTo: date.toString)
query = ref.collection(access.path)
.whereField("date", isEqualTo: date.toString)
case let .month(date):
let month = date.toString.components(separatedBy: "-")[0...1].joined(separator: "-")
query = ref.collection("quests")
query = ref.collection(access.path)
.whereField("date", isGreaterThan: "\(month)-00")
.whereField("date", isLessThan: "\(month)-40")
case let .year(date):
let year = date.toString.components(separatedBy: "-")[0]
query = ref.collection("quests")
query = ref.collection(access.path)
.whereField("date", isGreaterThan: "\(year)-01-00")
.whereField("date", isLessThan: "\(year)-12-40")
}
Expand All @@ -165,7 +171,7 @@ final class FirebaseService: NetworkService {
observer.onCompleted()
}
case .receiveQuests:
ref.collection("receiveQuests").getDocuments { (querySnapshot, error) in
ref.collection(access.path).getDocuments { (querySnapshot, error) in
for document in querySnapshot!.documents {
do {
let quest = try document.data(as: type)
Expand Down Expand Up @@ -205,15 +211,15 @@ final class FirebaseService: NetworkService {
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
try self.checkPermission(crud: .update, userCase: userCase, access: access)
guard let uid = self.uid else { throw NetworkServiceError.noAuthError }
guard let uid = self.uid.value else { throw NetworkServiceError.noAuthError }
let ref = try self.documentReference(userCase: userCase)
switch access {
case .quests:
try ref.collection("quests")
try ref.collection(access.path)
.document("\(dto.uuid)")
.setData(from: dto, merge: true)
case .receiveQuests:
try ref.collection("receiveQuests")
try ref.collection(access.path)
.document(uid)
.setData(from: dto, merge: true)
case .userInfo:
Expand All @@ -239,19 +245,19 @@ final class FirebaseService: NetworkService {
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
try self.checkPermission(crud: .delete, userCase: userCase, access: access)
guard let uid = self.uid else { throw NetworkServiceError.noAuthError }
guard let uid = self.uid.value else { throw NetworkServiceError.noAuthError }
let ref = try self.documentReference(userCase: userCase)
switch access {
case .quests:
ref.collection("quests").document("\(dto.uuid)").delete() { error in
ref.collection(access.path).document("\(dto.uuid)").delete() { error in
if let error = error {
single(.failure(error))
} else {
single(.success(dto))
}
}
case .receiveQuests:
ref.collection("receiveQuests").document(uid).delete() { error in
ref.collection(access.path).document(uid).delete() { error in
if let error = error {
single(.failure(error))
} else {
Expand Down Expand Up @@ -283,7 +289,7 @@ final class FirebaseService: NetworkService {
return Single<String>.create { [weak self] single in
do {
guard let self = self else { throw NetworkServiceError.noNetworkService }
guard let uid = self.uid else { throw NetworkServiceError.noAuthError }
guard let uid = self.uid.value else { throw NetworkServiceError.noAuthError }
let fileName = "\(path.path)/\(uid)-\(UUID())"
let StorageReference = self.storage.reference().child("\(fileName)")

Expand Down Expand Up @@ -336,7 +342,7 @@ final class FirebaseService: NetworkService {
return Disposables.create()
}
}

/// deleteDataStorage
/// - Parameter fileName: File Name
/// - Returns: success -> true, Data, failure -> error
Expand Down
12 changes: 10 additions & 2 deletions DailyQuest/DailyQuest/Infrastructure/NetworkConfigure.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,20 @@ import Foundation
enum UserCase {
case currentUser
case anotherUser(_ uid: String)

var path: String {
return "users"
}
}

enum Access {
enum Access: String {
case quests
case receiveQuests
case userInfo

var path: String {
return self.rawValue
}
}

enum CRUD {
Expand All @@ -25,7 +33,7 @@ enum CRUD {
case delete
}

enum NetworkCondition {
enum NetworkDateFilter {
case today(_ date: Date)
case month(_ date: Date)
case year(_date: Date)
Expand Down
7 changes: 4 additions & 3 deletions DailyQuest/DailyQuest/Infrastructure/NetworkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,26 @@
//

import RxSwift
import RxRelay
import Foundation

enum NetworkServiceError: Error {
case noNetworkService // NetworkService X
case noAuthError // uid X
case permissionDenied // wrong access
case needConditionError
case needFilterError
case noUrlError
case noDataError
}

protocol NetworkService {
var uid: String? { get }
var uid: BehaviorRelay<String?> { get }

func signIn(email: String, password: String) -> Single<Bool>
func signOut() -> Single<Bool>

func create<T: DTO>(userCase: UserCase, access: Access, dto: T) -> Single<T>
func read<T: DTO>(type: T.Type, userCase: UserCase, access: Access, condition: NetworkCondition?) -> Observable<T>
func read<T: DTO>(type: T.Type, userCase: UserCase, access: Access, filter: NetworkDateFilter?) -> Observable<T>
func update<T: DTO>(userCase: UserCase, access: Access, dto: T) -> Single<T>
func delete<T: DTO>(userCase: UserCase, access: Access, dto: T) -> Single<T>

Expand Down