feat(auth): 인증 후 콘텐츠 설정과 개발용 모의 인증을 추가한다
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#if AUTH_VERIFICATION_MOCK
|
||||
import Foundation
|
||||
|
||||
final class AuthVerificationMock {
|
||||
static let shared = AuthVerificationMock()
|
||||
|
||||
final class Session {
|
||||
fileprivate let token: String
|
||||
fileprivate var preference: (isAdultContentVisible: Bool, contentType: ContentType)?
|
||||
|
||||
fileprivate init(token: String) {
|
||||
self.token = token
|
||||
}
|
||||
}
|
||||
|
||||
private let lock = NSLock()
|
||||
private var loginSession: Session?
|
||||
|
||||
private init() {}
|
||||
|
||||
func confirm(request: AuthVerifyRequest, requestToken: String) -> Data? {
|
||||
lock.lock()
|
||||
defer { lock.unlock() }
|
||||
guard let session = currentSession(for: requestToken) else { return nil }
|
||||
|
||||
session.preference = (request.isAdultContentVisible, request.isAdultContentVisible ? request.contentType : .ALL)
|
||||
return Data(#"{"success":true,"data":{"gender":0}}"#.utf8)
|
||||
}
|
||||
|
||||
func session(for requestToken: String) -> Session? {
|
||||
lock.lock()
|
||||
defer { lock.unlock() }
|
||||
return currentSession(for: requestToken)
|
||||
}
|
||||
|
||||
func resetSession(_ changes: () -> Void) {
|
||||
lock.lock()
|
||||
defer { lock.unlock() }
|
||||
loginSession = nil
|
||||
changes()
|
||||
}
|
||||
|
||||
func overlayMemberResponse<Member: Decodable>(_ data: Data, statusCode: Int, requestToken: String,
|
||||
session: Session?, as type: Member.Type) -> Data {
|
||||
lock.lock()
|
||||
defer { lock.unlock() }
|
||||
guard isActive(session, requestToken: requestToken), let preference = session?.preference,
|
||||
(200..<300).contains(statusCode),
|
||||
let decoded = try? JSONDecoder().decode(ApiResponse<Member>.self, from: data),
|
||||
decoded.success, decoded.data != nil,
|
||||
var envelope = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any],
|
||||
var member = envelope["data"] as? [String: Any] else { return data }
|
||||
|
||||
member["isAuth"] = true
|
||||
member["isAdultContentVisible"] = preference.isAdultContentVisible
|
||||
member["contentType"] = preference.contentType.rawValue
|
||||
envelope["data"] = member
|
||||
return (try? JSONSerialization.data(withJSONObject: envelope)) ?? data
|
||||
}
|
||||
|
||||
func updateContentPreference(from data: Data, statusCode: Int, requestToken: String, session: Session?) {
|
||||
lock.lock()
|
||||
defer { lock.unlock() }
|
||||
guard isActive(session, requestToken: requestToken), let session = session, session.preference != nil,
|
||||
(200..<300).contains(statusCode),
|
||||
let decoded = try? JSONDecoder().decode(ApiResponse<UpdateContentPreferenceResponse>.self, from: data),
|
||||
decoded.success, let preference = decoded.data else { return }
|
||||
|
||||
session.preference = (preference.isAdultContentVisible, preference.isAdultContentVisible ? preference.contentType : .ALL)
|
||||
}
|
||||
|
||||
private func currentSession(for requestToken: String) -> Session? {
|
||||
guard !requestToken.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty,
|
||||
requestToken == UserDefaults.string(forKey: .token) else { return nil }
|
||||
if loginSession?.token != requestToken {
|
||||
loginSession = Session(token: requestToken)
|
||||
}
|
||||
return loginSession
|
||||
}
|
||||
|
||||
private func isActive(_ session: Session?, requestToken: String) -> Bool {
|
||||
guard let session = session, session === loginSession else { return false }
|
||||
return session.token == requestToken && requestToken == UserDefaults.string(forKey: .token)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user