기존의 메모들을 불러오는 로직들을 수정하여 신고 누적횟수 5회 미만의 메모들만 불러옵니다.
어떻게 작동하나요? code 기반으로 설명해주세요
신고하기 로직
// MemoService.swift
func fetchReportMemo(memo: Memo, type: String, reason: String) async -> Result<Bool, ReportError> {
guard let reportedUser = Auth.auth().currentUser else {
return .failure(.isNotLogin)
}
guard let memoid = memo.id else {
return .failure(.invalidMemo)
}
let reportRef = COLLECTION_MEMO_REPORT.document(memoid)
let memoRef = COLLECTION_MEMOS.document(memoid)
let memoData: [String : Any] = [
"types": [type],
"reasons": [reason],
"isCompleted": false,
"reportUserUids": [reportedUser.uid],
"reportCount": 1
]
do {
let reportDocument = try await reportRef.getDocument()
// 신고 메모가 이미 신고된 이력이 있을 경우를 위한 분기처리
if reportDocument.exists {
let data = reportDocument.data()
// 신고자의 아이디가 신고자 배열에 속해있는 경우 Error를 반환합니다.
if let uids = data?["reportUserUids"] as? [String], uids.contains(where: { $0 == reportedUser.uid }) {
return .failure(.duplicatedReport)
}
// 기존에 신고된 이력이 있는 메모가 다시 신고받는 경우 업데이트 및 성공시 true를 반환합니다.
try await reportRef.updateData([
"types": FieldValue.arrayUnion([type]),
"reasons": FieldValue.arrayUnion([reason]),
"reportUserUids": FieldValue.arrayUnion([reportedUser.uid]),
"reportCount": FieldValue.increment(Int64(1))
])
} else {
try await reportRef.setData(memoData)
}
try await memoRef.updateData([
"reportCount": FieldValue.increment(Int64(1))
])
return .success(true)
} catch {
return .failure(.firebaseError)
}
}
신고하기 에러처리
// ReportViewModel.swift
func fetchReport(memo: Memo, type: String, reason: String) async -> String? {
let result = await memoService.fetchReportMemo(memo: memo,
type: type,
reason: reason)
switch result {
case .success:
return nil
case .failure(let failure):
var errorMessage: String
switch failure {
case .firebaseError :
errorMessage = "서버에러가 발생하였습니다. 잠시 후 다시 시도해주세요."
case .invalidMemo:
errorMessage = "메모가 유효하지 않습니다. 다시 시도해주세요."
case .isNotLogin:
errorMessage = "로그인 중이 아닙니다. 로그인 후 시도해주세요."
case .duplicatedReport:
errorMessage = "이전에 신고한 메모입니다. 2회 이상 신고할 수 없습니다."
}
return errorMessage
}
}
PR 가이드라인
PR Checklist
PR 날릴 때 체크 리스트
PR Type
어떤 종류의 PR인가요?
연관되는 issue 정보를 알려주세요
Issue Number: #176
PR 설명하기
신고하기 기능을 추가했습니다.
어떻게 작동하나요? code 기반으로 설명해주세요
신고하기 로직
신고하기 에러처리
가능하다면 추가해주세요
변경 사항 스크린샷 혹은 화면 녹화
스크린샷
https://github.com/APP-iOS3rd/PJ3T2_Mymory/assets/79817557/d755ffc3-a947-4c5a-b10a-ba6208e5edae
Test 여부
Test 정보
기타 언급해야 할 사항들