Skip to content

Commit

Permalink
[Edit] post, drink 좋아요 메서드 로직 수정 #142
Browse files Browse the repository at this point in the history
  • Loading branch information
Phangg committed Mar 10, 2024
1 parent 2b59a8d commit 6e62434
Show file tree
Hide file tree
Showing 7 changed files with 327 additions and 261 deletions.
2 changes: 1 addition & 1 deletion JUDA/Model/Drink.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ struct Drink {
let taggedPosts: [Post]
let agePreference: AgePreference
let GenderPreference: GenderPreference
let likedCount: Int // Firestore likedUsersUID Collection에 해당하는 Document 갯수
let likedUsersID: [String]
}

// MARK: - Firebase에서 사용하는 Drink Model
Expand Down
56 changes: 45 additions & 11 deletions JUDA/ViewModel/Auth/AuthViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import SwiftUI
import FirebaseCore
import FirebaseFirestore
import FirebaseAuth
import GoogleSignIn
import CryptoKit
Expand Down Expand Up @@ -45,8 +46,16 @@ final class AuthViewModel: ObservableObject {
private let firebaseAuthService = FirebaseAuthService()
// Firebase User Service
private let firebaseUserService = FirebaseUserService()
// Firebase Post Service
private let firestorePostService = FirestorePostService()
// Firebase Drink Service
private let firestoreDrinkService = FirestoreDrinkService()
// FireStorage Service
private let fireStorageService = FireStorageService()
// Firestore - db 연결
private let db = Firestore.firestore()
private let postCollection = "posts"
private let drinkCollection = "drinks"

init() {
Task {
Expand Down Expand Up @@ -187,44 +196,69 @@ extension AuthViewModel {
func updateLikedDrinks(isLiked: Bool, sellectedDrink: Drink) async {
if !isLiked { // 좋아요 X -> O
currentUser?.likedDrinks.removeAll { $0.drinkField.drinkID == sellectedDrink.drinkField.drinkID }
await deleteUserLikedList(type: .drinks, id: sellectedDrink.drinkField.drinkID)
} else { // 좋아요 O -> X
if let user = currentUser,
!user.likedDrinks.contains(where: { $0.drinkField.drinkID == sellectedDrink.drinkField.drinkID }) {
currentUser?.likedDrinks.append(sellectedDrink)
await addUserLikedList(type: .drinks, id: sellectedDrink.drinkField.drinkID)
}
}
await updateUserLikedList(type: .drinks)
}

// 유저가 좋아하는 게시글 (술상) 리스트에 추가 or 삭제
func updateLikedPosts(isLiked: Bool, sellectedPost: Post) async {
if !isLiked { // 좋아요 X -> O
currentUser?.likedPosts.removeAll { $0.postField.postID == sellectedPost.postField.postID }
await deleteUserLikedList(type: .posts, id: sellectedPost.postField.postID)
} else { // 좋아요 O -> X
if let user = currentUser,
!user.likedPosts.contains(where: { $0.postField.postID == sellectedPost.postField.postID }) {
currentUser?.likedPosts.append(sellectedPost)
await addUserLikedList(type: .posts, id: sellectedPost.postField.postID)
}
}
await updateUserLikedList(type: .posts)
}

// 유저 정보 업데이트 - [ LikedPosts / LikedDrinks ] in [ Posts / Drinks ]
private func deleteUserLikedList(type: UserLikedListType, id: String?) async {
do {
guard let id = id else { return }
let uid = try checkCurrentUserID()
let likedUsersIDCollection = "likedUsersID"
switch type {
case .posts:
let documentRef = db.collection(postCollection).document(id)
.collection(likedUsersIDCollection).document(uid)
try await firestorePostService.deletePostDocument(document: documentRef)
case .drinks:
let documentRef = db.collection(drinkCollection).document(id)
.collection(likedUsersIDCollection).document(uid)
try await firestoreDrinkService.deleteDrinkDocument(document: documentRef)
}
} catch {
print("error :: deleteUserLikedList / \(type) :", error.localizedDescription)
}
}

// 유저 정보 업데이트 - LikedPosts / LikedDrinks
private func updateUserLikedList(type: UserLikedListType) async {
// 유저 정보 업데이트 - [ LikedPosts / LikedDrinks ] in [ Posts / Drinks ]
private func addUserLikedList(type: UserLikedListType, id: String?) async {
do {
guard let id = id else { return }
let uid = try checkCurrentUserID()
var list = [Any]()
let likedUsersIDCollection = "likedUsersID"
switch type {
case .posts:
list = currentUser?.likedPosts ?? [] as [Post]
let collectionRef = db.collection(postCollection).document(id)
.collection(likedUsersIDCollection)
await firestorePostService.uploadPostLikedUsersID(collection: collectionRef, uid: uid)
case .drinks:
list = currentUser?.likedDrinks ?? [] as [Drink]
let collectionRef = db.collection(drinkCollection).document(id)
.collection(likedUsersIDCollection)
await firestoreDrinkService.uploadDrinkLikedUsersID(collection: collectionRef, uid: uid)
}
await firebaseAuthService.updateUserLikedList(uid: uid,
documentName: type.rawValue,
list: list)
} catch {
print("error :: userLiked\(type)Update :", error.localizedDescription)
print("error :: addUserLikedList / \(type) :", error.localizedDescription)
}
}

Expand Down
9 changes: 0 additions & 9 deletions JUDA/ViewModel/Auth/FirebaseAuthService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,6 @@ extension FirebaseAuthService {
print("error :: updateUserName", error.localizedDescription)
}
}

// 유저 정보 업데이트 - LikedPosts / LikedDrinks
func updateUserLikedList(uid: String, documentName: String, list: [Any]) async {
do {
try await db.collection(userCollection).document(uid).updateData([documentName: list])
} catch {
print("error :: userLikedListUpdate", error.localizedDescription)
}
}
}

// MARK: - 데이터 실시간 업데이트
Expand Down
72 changes: 52 additions & 20 deletions JUDA/ViewModel/Drink/FirestoreDrinkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ enum Age: String, CaseIterable {
case fifty = "50"
}

enum DrinkFetchError: Error {
case drinkField
case drinkDocument
case drinkCollection
enum DrinkError: Error {
case fetchDrinkField
case fetchDrinkDocument
case fetchDrinkCollection
case delete
}

@MainActor
Expand All @@ -46,7 +47,7 @@ extension FirestoreDrinkService {
return result
} catch let error {
print("error :: fetchDrinkCollection", error.localizedDescription)
throw DrinkFetchError.drinkCollection
throw DrinkError.fetchDrinkCollection
}
}

Expand All @@ -63,20 +64,20 @@ extension FirestoreDrinkService {
let taggedPosts = await fetchTaggedPosts(ref: taggedPostsRef)
let agePreference = await fetchAgePreferenceUID(ref: agePreferenceUIDRef)
let genderPreference = await fetchGenderPreferenceUID(ref: genderPreferenceUIDRef)
let likedCount = await fetchLikedCount(ref: likedUsersIDRef)
let likedUsersID = await fetchDrinkLikedUsersID(ref: likedUsersIDRef)

return Drink(drinkField: drikField,
taggedPosts: taggedPosts,
agePreference: agePreference,
GenderPreference: genderPreference,
likedCount: likedCount)
} catch DrinkFetchError.drinkField {
likedUsersID: likedUsersID)
} catch DrinkError.fetchDrinkField {
print("error :: fetchDrinkField() -> fetch drink field data failure")
throw DrinkFetchError.drinkField
throw DrinkError.fetchDrinkField
} catch {
print("error :: fetchDrinkField() -> fetch drink field data failure")
print(error.localizedDescription)
throw DrinkFetchError.drinkDocument
throw DrinkError.fetchDrinkDocument
}
}

Expand Down Expand Up @@ -107,7 +108,7 @@ extension FirestoreDrinkService {
return try await document.getDocument(as: DrinkField.self)
} catch {
print(error.localizedDescription)
throw DrinkFetchError.drinkField
throw DrinkError.fetchDrinkField
}
}

Expand Down Expand Up @@ -164,15 +165,19 @@ extension FirestoreDrinkService {
}

// drinks/likedUsersID collection
// 위 collection에 해당하는 ducument의 갯수를 count
func fetchLikedCount(ref: CollectionReference) async -> Int {
do {
return try await ref.getDocuments().count
} catch {
print("error :: fetchLikedCount() -> fetch likedUsersID collection data failure")
print(error.localizedDescription)
return 0
}
func fetchDrinkLikedUsersID(ref: CollectionReference) async -> [String] {
var likedUsersID = [String]()
do {
let snapshot = try await ref.getDocuments()
for document in snapshot.documents {
let userID = document.documentID
likedUsersID.append(userID)
}
} catch {
print("error :: fetchDrinkLikedUsersID() -> fetch Drink likedUsersID collection data failure")
print(error.localizedDescription)
}
return likedUsersID
}
}

Expand All @@ -190,3 +195,30 @@ extension FirestoreDrinkService {
}
}
}

// MARK: Firestore drink document delete
extension FirestoreDrinkService {
// drinks collection에서 삭제하고싶은 drink에 해당하는 document 삭제 메서드
func deleteDrinkDocument(document: DocumentReference) async throws {
do {
try await document.delete()
} catch {
print("error :: deleteDrinkDocument() -> delete drink document data failure")
print(error.localizedDescription)
throw DrinkError.delete
}
}
}

// MARK: Firestore drink document upload
extension FirestoreDrinkService {
// likedUsersID 하위 컬렉션에 업로드
func uploadDrinkLikedUsersID(collection: CollectionReference, uid: String) async {
do {
try await collection.document(uid).setData([:])
} catch {
print("error :: uploadDrinkLikedUsersID() -> upload drink liked users id data failure")
print(error.localizedDescription)
}
}
}
Loading

0 comments on commit 6e62434

Please sign in to comment.