APP-iOS3rd / PJ3T2_Mymory

멋쟁이사자처럼 iOS 앱스쿨 3기 팀 프로젝트
11 stars 3 forks source link

Feat/delete my account #212

Closed jeonguk29 closed 9 months ago

jeonguk29 commented 9 months ago

PR 가이드라인

PR Checklist

PR 날릴 때 체크 리스트

PR Type

어떤 종류의 PR인가요?

연관되는 issue 정보를 알려주세요

Issue Number: #211

PR 설명하기

탈퇴 버튼을 누르면 탈퇴하려는 사용자의 파이어베이스 상에 존재하는 모든 데이터를 삭제하는 로직을 구현했습니다.

어떻게 작동하나요? code 기반으로 설명해주세요

/// 사용자의 모든 기록을 지우는 메서드
    /// - Parameters:
    ///   - uid : 모든 기록을 삭제할 현재 사용자 uid 값
    /// - Returns: 없음
    func removeUserAllData(uid: String) {
        /*
           Memos - 사용자가 작성한 메모 지우기
           Memo-likes - 사용자가 작성한 메모 좋아요, 기록 지우기
           User-likes - 사용자가 좋아요. 누른 기록 지우기
           User-Following - 사용자가 팔로잉하는 목록 지우기
           User-Followers - 사용자를 팔로우하는 목록 지우기
           users - 사용자 지우기
           Authentication - 사용자 인증 기록 지우기

         */

        self.removeMemoData(uid: uid)
        self.removeUserLikes(uid: uid)
        self.removeUserFollowingAndFollowData(uid: uid)
        self.removeUser(uid: uid)
        self.fetchUserLogout {
            // Authentication에서 사용자 정보 지우기
            Auth.auth().currentUser?.delete { error in
                if let error = error {
                    print("사용자 정보 삭제 중 오류 발생:", error)
                } else {
                    print("사용자 정보가 성공적으로 삭제되었습니다.")
                }
            }
        }

    }

    /// 사용자가 작성한 메모, 좋아요 누른 메모 기록 지우기
    /// - Parameters:
    ///   - uid : 모든 기록을 삭제할 현재 사용자 uid 값
    /// - Returns: 없음
    /*
     동작 원리
       1. 내 메모 지우기전 Storage에 저장된 메모 이미지 지우기
       2. 매모 삭제
       3. 내 메모 좋아요 기록 지우기
       4. 내가 다른 메모에 누른 좋아요 기룩 지우기
     */
    func removeMemoData(uid: String) {

        // Memos 컬렉션에서 문서를 가져와서 조건을 확인하고 삭제
        COLLECTION_MEMOS.getDocuments { (snapshot, error) in
            if let error = error {
                print("Error getting documents: \(error)")
                return
            }

            guard let documents = snapshot?.documents else {
                print("No documents found")
                return
            }

            // Memos 컬렉션의 각 문서에 대해 조건 확인 후 삭제
            for document in documents {
                // 문서의 데이터 가져오기
                let data = document.data()

                // 데이터 중 userUid 필드와 주어진 uid가 일치하는지 확인
                if let userUid = data["userUid"] as? String, userUid == uid {
                    // 일치하는 경우 해당 문서 삭제
                    let memoID = document.documentID
                    if let memoImageUUIDs = data["memoImageUUIDs"] as? [String] {
                        // 메모 이미지 UUIDs를 deleteImage 함수에 전달하여 이미지 삭제
                        MemoService.shared.deleteImage(deleteMemoImageUUIDS: memoImageUUIDs)
                    }

                    COLLECTION_MEMOS.document(memoID).delete { error in
                        if let error = error {
                            print("Error removing Memo document: \(error)")
                        } else {
                            print("Memo document successfully removed!")

                            // Memo-likes 컬렉션에서도 해당 Memo에 대한 문서 삭제
                            self.removeMemoLikes(memoID: memoID)
                        }
                    }
                }
            }
        }

        // 내가 다른 메모에 누른 좋아요 기룩 삭제
        COLLECTION_MEMO_LIKES.getDocuments { (snapshot, error) in
            if let error = error {
                print("Error getting Memo Likes documents: \(error)")
                return
            }

            guard let memoLikesDocuments = snapshot?.documents else {
                print("No Memo Likes documents found")
                return
            }

            // 별도 분리 필요 위에는 메모 삭제할때이고 사용자 uid 값으로 파악하고 지워야함
            // Memo Likes 컬렉션의 각 문서에서 memoID 필드 삭제 또는 문서 삭제
            for memoLikesDocument in memoLikesDocuments {
                let documentData = memoLikesDocument.data()

                // 마지막 필드인 경우 문서 삭제
                print("documentData : \(documentData)")
                print("uid : \(uid)")

                if documentData.count == 1 && documentData.contains(where: { $0.key == uid }) {
                    memoLikesDocument.reference.delete { error in
                        if let error = error {
                            print("Error deleting Memo Likes document: \(error)")
                        } else {
                            print("Memo Likes document successfully deleted!")
                        }
                    }
                } else {
                    // 마지막 필드가 아닌 경우 memoID 필드 삭제
                    var updatedData = documentData
                    updatedData.removeValue(forKey: uid)

                    memoLikesDocument.reference.updateData(updatedData) { error in
                        if let error = error {
                            print("Error removing field from Memo Likes document: \(error)")
                        } else {
                            print("Field successfully removed from Memo Likes document!")
                        }
                    }
                }
            }
        }

    }

    /// 사용자가 작성한 메모의 받은 좋아요 기록을 삭제하는 메서드
    /// - Parameters:
    ///   - memoID  : 삭제할 사용자가 작성한 메모의 ID
    /// - Returns: 없음
    func removeMemoLikes(memoID: String) {

        COLLECTION_MEMO_LIKES.document(memoID).delete { error in
            if let error = error {
                print("Error removing Memo-likes document: \(error)")
            } else {
                print("Memo-likes document successfully removed!")
            }
        }
    }

    /// 사용자가 누른 메모 기록을 삭제하는 메서드
    /// - Parameters:
    ///   - uid  : 삭제할 사용자가 누른 메모 기록
    /// - Returns: 없음
    func removeUserLikes(uid: String) {
        // User-likes 컬렉션에서 uid가 일치하는 문서 삭제
        COLLECTION_USER_LIKES.document(uid).delete { error in
            if let error = error {
                print("Error removing Memo-likes document: \(error)")
            } else {
                print("Memo-likes document successfully removed!")
            }
        }

    }

    /// 사용자가 팔로잉한 사용자를 팔로우한 사람들의 데이터를 삭제하는 메서드
    /// - Parameters:
    ///   - uid : 팔로우, 팔로잉 기록을 삭제할 uid
    /// - Returns: 없음
    func removeUserFollowingAndFollowData(uid: String) {
        // User-Following 컬렉션에서 uid가 일치하는 문서 삭제
        COLLECTION_USER_Following.document(uid).delete { error in
            if let error = error {
                print("Error removing Memo-likes document: \(error)")
            } else {
                print("Memo-likes document successfully removed!")
            }
        }

        // User-Followers 컬렉션에서 uid가 일치하는 문서의 필드 삭제 또는 문서 삭제 (필드가 하나 밖에 없다면 필드만 삭제 할 수 없음)
        COLLECTION_USER_Followers.getDocuments { (snapshot, error) in
            if let error = error {
                print("Error getting Followers documents: \(error)")
                return
            }

            guard let followersDocuments = snapshot?.documents else {
                print("No Followers documents found")
                return
            }

            // User-Followers 컬렉션의 각 문서에서 uid 필드 삭제 또는 문서 삭제
            for followersDocument in followersDocuments {
                let documentData = followersDocument.data()

                // 마지막 필드인 경우 문서 삭제
                if documentData.count == 1 && documentData.contains(where: { $0.key == uid }) {
                    followersDocument.reference.delete { error in
                        if let error = error {
                            print("Error deleting Followers document: \(error)")
                        } else {
                            print("Followers document successfully deleted!")
                        }
                    }
                } else {
                    // 마지막 필드가 아닌 경우 uid 필드 삭제
                    var updatedData = documentData
                    updatedData.removeValue(forKey: uid)

                    followersDocument.reference.updateData(updatedData) { error in
                        if let error = error {
                            print("Error removing field from Followers document: \(error)")
                        } else {
                            print("Field successfully removed from Followers document!")
                        }
                    }
                }
            }
        }
    }

    /// 사용자 삭제 메서드
    /// - Parameters:
    ///   - uid : users 컬렉션에서 사용자 삭제를 위한 메서드
    /// - Returns: 없음 
    func removeUser(uid: String) {
        // users 컬렉션에서 uid와 일치하는 문서를 찾아 삭제

        COLLECTION_USERS.document(uid).delete { error in
            if let error = error {
                print("Error removing Memo-likes document: \(error)")
            } else {
                print("Memo-likes document successfully removed!")
            }
        }
    }

가능하다면 추가해주세요

변경 사항 스크린샷 혹은 화면 녹화

https://github.com/APP-iOS3rd/PJ3T2_Mymory/assets/54401641/2da4d306-c0cb-4d61-b194-1c1ccbbaf798

https://github.com/APP-iOS3rd/PJ3T2_Mymory/assets/54401641/727155d8-4b0b-4e61-9f53-3c3a3bcac6e8

Test 여부

Test 정보

//예시
let testDatas: [TestData] = [.init(...),...]

기타 언급해야 할 사항들