sfrs/src/api.rs
2020-02-20 20:02:09 +08:00

49 lines
1.1 KiB
Rust

use crate::DbConn;
use crate::user;
use rocket::http::Status;
use rocket::response::status::Custom;
use rocket_contrib::json::Json;
use serde::Serialize;
use std::vec::Vec;
pub fn routes() -> impl Into<Vec<rocket::Route>> {
routes![auth]
}
#[derive(Serialize)]
#[serde(untagged)]
enum Response<T: Serialize> {
Error {
errors: Vec<String>
},
Success(T)
}
// Some shorthands
type JsonResp<T> = Json<Response<T>>;
fn success_resp<T: Serialize>(resp: T) -> Custom<JsonResp<T>> {
Custom(Status::Ok, Json(Response::Success(resp)))
}
fn error_resp<T: Serialize>(status: Status, errors: Vec<String>) -> Custom<JsonResp<T>> {
Custom(status, Json(Response::Error {
errors
}))
}
#[derive(Serialize)]
struct AuthResult {
token: String
}
#[post("/auth", format = "json", data = "<new_user>")]
fn auth(db: DbConn, new_user: Json<user::NewUser>) -> Custom<JsonResp<AuthResult>> {
match user::User::create(&db.0, &new_user) {
Ok(_) => success_resp(AuthResult {
token: "aaaa".to_string()
}),
Err(user::UserOpError(e)) =>
error_resp(Status::InternalServerError, vec![e])
}
}