Files
sodalive-ios/SodaLive/Sources/V2/Auth/AuthVerificationMock.swift
T

87 lines
3.5 KiB
Swift

#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