87 lines
3.5 KiB
Swift
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
|