112 lines
3.2 KiB
Swift
112 lines
3.2 KiB
Swift
//
|
|
// DefaultImplementations.swift
|
|
// RxExample
|
|
//
|
|
// Created by Krunoslav Zaher on 12/6/15.
|
|
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
#if !RX_NO_MODULE
|
|
import RxSwift
|
|
#endif
|
|
|
|
|
|
class GitHubDefaultValidationService: GitHubValidationService {
|
|
let API: GitHubAPI
|
|
|
|
static let sharedValidationService = GitHubDefaultValidationService(API: GitHubDefaultAPI.sharedAPI)
|
|
|
|
init (API: GitHubAPI) {
|
|
self.API = API
|
|
}
|
|
|
|
// validation
|
|
|
|
let minPasswordCount = 5
|
|
|
|
func validateUsername(username: String) -> Observable<ValidationResult> {
|
|
if username.characters.count == 0 {
|
|
return just(.Empty)
|
|
}
|
|
|
|
// this obviously won't be
|
|
if username.rangeOfCharacterFromSet(NSCharacterSet.alphanumericCharacterSet().invertedSet) != nil {
|
|
return just(.Failed(message: "Username can only contain numbers or digits"))
|
|
}
|
|
|
|
let loadingValue = ValidationResult.Validating
|
|
|
|
return API
|
|
.usernameAvailable(username)
|
|
.map { available in
|
|
if available {
|
|
return .OK(message: "Username available")
|
|
}
|
|
else {
|
|
return .Failed(message: "Username already taken")
|
|
}
|
|
}
|
|
.startWith(loadingValue)
|
|
}
|
|
|
|
func validatePassword(password: String) -> ValidationResult {
|
|
let numberOfCharacters = password.characters.count
|
|
if numberOfCharacters == 0 {
|
|
return .Empty
|
|
}
|
|
|
|
if numberOfCharacters < minPasswordCount {
|
|
return .Failed(message: "Password must be at least \(minPasswordCount) characters")
|
|
}
|
|
|
|
return .OK(message: "Password acceptable")
|
|
}
|
|
|
|
func validateRepeatedPassword(password: String, repeatedPassword: String) -> ValidationResult {
|
|
if repeatedPassword.characters.count == 0 {
|
|
return .Empty
|
|
}
|
|
|
|
if repeatedPassword == password {
|
|
return .OK(message: "Password repeated")
|
|
}
|
|
else {
|
|
return .Failed(message: "Password different")
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
class GitHubDefaultAPI : GitHubAPI {
|
|
let URLSession: NSURLSession
|
|
|
|
static let sharedAPI = GitHubDefaultAPI(
|
|
URLSession: NSURLSession.sharedSession()
|
|
)
|
|
|
|
init(URLSession: NSURLSession) {
|
|
self.URLSession = URLSession
|
|
}
|
|
|
|
func usernameAvailable(username: String) -> Observable<Bool> {
|
|
// this is ofc just mock, but good enough
|
|
|
|
let URL = NSURL(string: "https://github.com/\(URLEscape(username))")!
|
|
let request = NSURLRequest(URL: URL)
|
|
return self.URLSession.rx_response(request)
|
|
.map { (maybeData, response) in
|
|
return response.statusCode == 404
|
|
}
|
|
.catchErrorJustReturn(false)
|
|
}
|
|
|
|
func signup(username: String, password: String) -> Observable<Bool> {
|
|
// this is also just a mock
|
|
let signupResult = arc4random() % 5 == 0 ? false : true
|
|
return just(signupResult)
|
|
.concat(never())
|
|
.throttle(2, scheduler: MainScheduler.sharedInstance)
|
|
.take(1)
|
|
}
|
|
} |