Skip to content

Instantly share code, notes, and snippets.

@eugeniobaglieri
Created April 12, 2017 16:26
Show Gist options
  • Save eugeniobaglieri/bdfb0e7cbfc937f8ca5b15e37fda88d0 to your computer and use it in GitHub Desktop.
Save eugeniobaglieri/bdfb0e7cbfc937f8ca5b15e37fda88d0 to your computer and use it in GitHub Desktop.
enum UserRequest {
case create(username: String, password: String, email: String, birthDate: Date, gender: Gender, weight: Int, height: Int)
case login(username: String, password: String)
case logout
case update(user: Rider)
case getProfile(userId: Int)
case resetPassword(email: String)
case search(name: String)
case getFriends(userId: Int)
case addFriend(userId: Int, friendUserId: Int)
case getBicycles(userId: Int)
case getSessions(userId: Int)
}
extension UserRequest: Request {
var path: String {
switch self {
case .create: return "Riders"
case .login: return "Riders/login"
case .logout: return "Riders/logout"
case .update(let user): return "Riders/" + "\(user.id)"
case .getProfile(let userId): return "Riders/" + "\(userId)"
case .resetPassword: return "Riders/reset"
case .search: return "Riders"
case .getFriends(let userId): return "Riders/\(userId)" + "/friends"
case .addFriend(let userId, _): return "Riders/\(userId)" + "/friends"
case .getBicycles(let userId): return "Riders/\(userId)" + "/bicycles"
case .getSessions(let userId): return "Riders/\(userId)" + "/sessions"
}
}
var method: HTTPMethod {
switch self {
case .create,
.login,
.logout,
.resetPassword,
.addFriend: return .post
case .update: return .patch
case .getProfile,
.search,
.getFriends,
.getBicycles,
.getSessions: return .get
}
}
var parameters: RequestParams? {
switch self {
case .create(let username, let password, let email,
let birthDate, let gender, let weight,
let height):
let dict: [String : Any] = [
Rider.JSONKey.username : username,
Rider.JSONKey.email : email,
Rider.JSONKey.password : password,
Rider.JSONKey.birthDate : Rider.apiDateFormatter.string(from: birthDate),
Rider.JSONKey.gender : gender.rawValue,
Rider.JSONKey.weight : weight,
Rider.JSONKey.height : height
]
return .body(dict)
case .login(let username, let password):
let dict = [
Rider.JSONKey.username : username,
Rider.JSONKey.password : password
]
return .body(dict)
case .logout: return nil
case .resetPassword(let email):
let dict = [Rider.JSONKey.email : email]
return .body(dict)
case .update(let user):
var dict: [String : Any] = [
Rider.JSONKey.username : user.username,
Rider.JSONKey.password : user.password,
Rider.JSONKey.gender : user.gender.rawValue,
Rider.JSONKey.weight : user.weight,
Rider.JSONKey.height : user.height
]
if let email = user.email {
dict[Rider.JSONKey.email] = email
}
if let avatar = user.avatar {
dict[Rider.JSONKey.avatar] = avatar
}
if let birthDate = user.birthDate {
dict[Rider.JSONKey.birthDate] = Rider.apiDateFormatter.string(from: birthDate)
}
return .body(dict)
case .getProfile(_): return nil
case .search(let name):
let searchDict = [Rider.JSONKey.username : ["regexp": ".*\(name).*"]]
let dict = [ "filter" : ["where" : searchDict] ]
return .body(dict)
case .getFriends(_):
let filter = [ "include" : ["friend"]]
let dict = [ "filter" : filter ]
return .body(dict)
case .addFriend(_, let friendUserId):
let dict: [String : Any] = [ "friendId" : friendUserId ]
return .body(dict)
case .getBicycles(_):
let fields: [String : Any] = [ "fields" : ["id", "beacon"] ]
let dict = [ "filter" : fields]
return .body(dict)
case .getSessions(_): return nil
}
}
var headers: HTTPHeaders? { return nil }
var dataType: DataType { return .JSON }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment