weareopensource/Swift

View on GitHub
waosSwift/modules/auth/services/AuthService.swift

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Dependencies
 */

import UIKit
import RxSwift

/**
 * Service
 */

protocol AuthServiceType {
    func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable<MyResult<SignResponse, CustomError>>
    func signIn(email: String, password: String) -> Observable<MyResult<SignResponse, CustomError>>
    func token() -> Observable<MyResult<TokenResponse, CustomError>>
    func forgot(email: String) -> Observable<MyResult<ForgotResponse, CustomError>>
    func oauth(strategy: Bool, key: String, value: String, firstName: String, lastName: String, email: String) -> Observable<MyResult<SignResponse, CustomError>>

    var user: Observable<User?> { get }
}

final class AuthService: CoreService, AuthServiceType {

    fileprivate let networking = Networking<AuthApi>(plugins: [CookiePlugin()])

    fileprivate let userSubject = ReplaySubject<User?>.create(bufferSize: 1)
    lazy var user: Observable<User?> = self.userSubject.asObservable()
        .share(replay: 1)

    func signUp(firstName: String, lastName: String, email: String, password: String) -> Observable<MyResult<SignResponse, CustomError>> {
        log.verbose("🔌 service : signIn")
        return self.networking
            .request(.signUp(firstName: firstName, lastName: lastName, email: email, password: password))
            .map(SignResponse.self)
            .map { response in
                self.userSubject.on(.next(response.user))
                return response
            }
            .asObservable()
            .map(MyResult.success)
            .catch { err in .just(.error(getError(err)))}
    }

    func signIn(email: String, password: String) -> Observable<MyResult<SignResponse, CustomError>> {
        log.verbose("🔌 service : signIn")
        return self.networking
            .request(.signIn(email: email, password: password))
            .map(SignResponse.self)
            .map { response in
                print(response)
                self.userSubject.on(.next(response.user))
                return response
            }
            .asObservable()
            .map(MyResult.success)
            .catch { err in .just(.error(getError(err)))}
    }

    func token() -> Observable<MyResult<TokenResponse, CustomError>> {
        log.verbose("🔌 service : token")
        return self.networking
            .request(.token)
            .map(TokenResponse.self)
            .map { response in
                self.userSubject.on(.next(response.user))
                return response
            }
            .asObservable()
            .map(MyResult.success)
            .catch { err in .just(.error(getError(err)))}
    }

    func forgot(email: String) -> Observable<MyResult<ForgotResponse, CustomError>> {
        log.verbose("🔌 service : forgot")
        return self.networking
            .request(.forgot(email: email))
            .map(ForgotResponse.self)
            .map { response in
                return response
            }
            .asObservable()
            .map(MyResult.success)
            .catch { err in .just(.error(getError(err)))}
    }

    func oauth(strategy: Bool, key: String, value: String, firstName: String, lastName: String, email: String) -> Observable<MyResult<SignResponse, CustomError>> {
           log.verbose("🔌 service : signIn")
           return self.networking
            .request(.oauth(strategy:strategy, key:key, value:value, firstName:firstName, lastName:lastName, email: email))
               .map(SignResponse.self)
               .map { response in
                   self.userSubject.on(.next(response.user))
                   return response
               }
               .asObservable()
               .map(MyResult.success)
                .catch { err in .just(.error(getError(err)))}
       }

}