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

일반 회원가입 Username 확인 API, 인증 코드 전송 API, 인증 코드 검증 API 연동 #170

Open
wants to merge 13 commits into
base: feature/network_tony
Choose a base branch
from

Conversation

minsangKang
Copy link
Member

@minsangKang minsangKang commented Oct 13, 2024

리뷰 요청

  • 🙋 꼭 리뷰를 받고 싶어요!
  • 리뷰 긴급도: D-14 (10/26)

개요


스크린샷

ScreenRecording_10-13-2024 12-03-01_1

변경사항

AuthV2API 생성, 세 가지 API 추가

  • /api/auth path 의 Moya API
enum AuthV2API {
    /// 존재하는 Username인지 확인해요.
    case checkUsername(request: CheckUsernameRequest)
    /// 인증 코드를 생성하여 대상에게 전송해요.
    case postAuthcode(request: PostAuthCodeRequest)
    /// 인증 코드를 검증해요.
    case verifyAuthcode(request: VerifyAuthCodeRequest)
}
  • 각 Repository, UseCase, Request, Response 생성

TTErrorResponse 공통 Error Alert 문구 추가

  • 백엔드에서 발생하는 공통 Error의 경우 Alert로 표시하기 위한 title, message를 추가하였습니다.
  • 해당 문구는 추구 논의를 통해 TLR 반영 및 현지화 문장으로 수정될 예정입니다.
struct TTErrorResponse: Decodable {
    let code: String
    let message: String
    let errors: [TTError]

    var logMessage: String {
        return self.errors
            .map { $0.logMessage }
            .joined(separator: "\n")
    }

    var errorTitle: String {
        switch self.code {
        case "E9000":
            return "잘못된 입력 오류"
        case "E9001", "E9002", "E9003", "E9004", "E9005":
            return "잘못된 요청 오류"
        case "E9006":
            return "인증정보 오류"
        case "E9007":
            return "잘못된 권한 오류"
        case "E9999":
            return "서버 오류"
        default:
            return "오류 발생"
        }
    }

    var errorMessage: String {
        switch code {
        case "E9000":
            return "입력값을 확인 후 다시 시도해주세요"
        case "E9001", "E9002", "E9003", "E9004", "E9005":
            return "개발자 실수로 오류가 발생했어요 🥲\n(\(self.code))"
        case "E9006":
            return "인증정보가 만료되어 다시 로그인해주세요"
        case "E9007":
            return "계속 문제가 발생하는 경우 문의해주세요\n(\(self.code))"
        case "E9999":
            return "서버문제가 발생했어요 🥲\n(\(self.code))"
        default:
            return "계속 문제가 발생하는 경우 문의해주세요\n(\(self.code))"
        }
    }
}

TTProvider debug 로직 수정

  • 네트워킹 요청의 success, failure 각각 모두 디버깅을 위한 문장 출력 구문을 생성하였습니다.
// success 의 경우
let debugInfo = """
✅ TTProvider success
================================================
1️⃣ moya: \(token)
2️⃣ URL: \(url)
3️⃣ Request Body: \(requestBody ?? "nil")
4️⃣ Response Body: \(responseBody ?? "nil")
================================================
"""

// failure 의 경우
let debugInfo = """
🚨 TTProvider failure
================================================
1️⃣ moya: \(token)
2️⃣ URL: \(url)
3️⃣ errorCode: \(error.errorCode)
4️⃣ errorDescription: \(error.localizedDescription)
================================================
"""

SignupEmailModel 의 Action 추가

  • 단방향 아키텍처의 구조 중 State, Action 을 Combine 으로 구현하는 방법을 고민해봤습니다.
  • 그 중 View(ViewController) 에서 ViewModel 로 요청하는 Action 부분을 해당 형식으로 구현해봤습니다.
// MARK: Action

enum Action {
    case resendAuthCode
    case verifyAuthCode
}

public func action(_ action: Action) {
    switch action {
    case .resendAuthCode:
        self.postAuthCode()
    case .verifyAuthCode:
        self.verifyAuthCode()
    }
}

사용법

model.action(.verifyAuthCode)

5분 타이머 로직 구현

  • Model 단에서 인증 코드 전송 API 가 동작된 이후 timer가 동작됩니다.
  • API 요청 직전의 Date() + 5분의 시각을 저장하여 현재 Date() 로부터 얼마나 시간이 남았는지를 초 단위로 계산합니다.
  • View 에서 해당 초 값의 변화를 수신받아 0보다 큰 경우는 타이머가 '분:초' 형식으로 표시되고, 0초인 경우는 사라지며 '재전송' 버튼이 표시되는 원리입니다.

리뷰 받고 싶은 내용

  • Combine의 Action 구조 피드백
  • TTErrorResponse 를 통한 Alert 문구 통합 관리 피드백

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature 기능 추가/변경/삭제 pr: needed review PR 리뷰필요 priority: medium 우선순위 보통 작업
Projects
None yet
1 participant