updated the response when creating new users

This commit is contained in:
shockrah 2020-03-10 16:48:21 -07:00
parent 924c15a436
commit 8ae877f3f9
3 changed files with 57 additions and 37 deletions

View File

@ -3,20 +3,13 @@ use diesel::{self, prelude::*};
use rocket_contrib::json::Json;
use rand::random;
use crate::DBConn;
use crate::models::{User, Invite};
use crate::models::Invite;
use crate::schema;
use crate::users::new_user_response;
use crate::payload;
use chrono::{Duration, Utc};
macro_rules! blankNewUser {
() => {
User {
userid: 0,
username: "".into(),
key: "".into(),
date: 0,
}
}
}
/*
TODO: both the generation and usage endpoints for invites need the following
* meaningful responses
@ -26,9 +19,10 @@ TODO: both the generation and usage endpoints for invites need the following
#[get("/generate")]
pub fn generate_invite(conn: DBConn) -> Json<Invite> {
let dt = Utc::now() + Duration::minutes(30);
// TODO:[maybe] ensure no collisions by doing a quick database check here
let mut new_invite = Invite {
id: random::<u64>(), // hopefully there won't ever be collision with this size of pool
uses: Some(1), // default/hardcorded for now
uses: 1, // default/hardcorded for now
expires: dt.timestamp() as u64
};
// Next we cache this invite
@ -36,6 +30,7 @@ pub fn generate_invite(conn: DBConn) -> Json<Invite> {
.values(&new_invite)
.execute(&conn.0);
// Finally we attempt to return _something_
match result {
Ok(_val) => {
Json(new_invite)
@ -43,34 +38,42 @@ pub fn generate_invite(conn: DBConn) -> Json<Invite> {
Err(_e) => {
new_invite.id = 0;
new_invite.expires = 0;
new_invite.uses = Some(0);
new_invite.uses = 0;
Json(new_invite)
}
}
}
#[get("/<hash>")]
pub fn use_invite(hash: u64, conn: DBConn) -> Json<User> {
pub fn use_invite(hash: u64, conn: DBConn) -> Json<payload::NewUserResponse> {
// Grab the token from our table to make sure it's even there to begin with
use schema::invites::dsl::*;
use schema::users::dsl::*;
let diesel_result: Result<Invite, diesel::result::Error> = invites.filter(id.eq(hash)).first(&conn.0);
// TODO: this is getting moved elsewhere to clean up so ignore this for now
match diesel_result {
Ok(_data) => {
// we may have an unnecssary struct here but its not that big a deal raelly
let user = crate::users::create_new_user();
if let Ok(_v) = diesel::insert_into(users).values(&user).execute(&conn.0) {
Json(user)
if let Ok(data) = diesel_result {
match data.uses {
1 ... std::i32::MAX => {
let user = crate::users::create_new_user();
match diesel::insert_into(users).values(&user).execute(&conn.0) {
Ok(_v) => Json(new_user_response(&Some(user), None)),
// an issue on our end gets a 500 response
Err(_e) => Json(new_user_response(&None, Some("Unable to create user")))
}
}
else {
Json(blankNewUser!())
// The invite has been used up and thus should be removed
std::i32::MIN ... 0 => {
// bruh
let _ = diesel::delete(invites.filter(id.eq(data.id)))
.execute(&conn.0)
.expect("Could not delete invite");
Json(new_user_response(&None, Some("Invalid invite")))
}
}
Err(_e) => {
Json(blankNewUser!())
}
}
else {
Json(new_user_response(&None, Some("Could not create user")))
}
}
@ -121,12 +124,10 @@ mod invite_tests {
let mut r = client.get("/invite/generate").dispatch();
let invite: Invite = serde_json::from_str(&r.body_string().unwrap()).unwrap();
// request a user account using the new invite data
// TODO: for some reason we can't use a regular struct so figure that out at some point
let mut response = client.get(format!("/invite/{}", invite.id)).dispatch();
let data: User = serde_json::from_str(&response.body_string().unwrap()).unwrap();
// make sure the user object isn't fugged
assert_ne!(0, data.userid);
assert_ne!(0, data.date);
println!("{:#?}", data);
let body: String = response.body_string().unwrap();
println!("{}", body);
}
}

View File

@ -5,10 +5,10 @@
// This structure allows us to provide some critical data for the client to reconnect to
// the server without having to go through a sign in process everytime
#[derive(Serialize)]
pub struct NewUserInfo {
pub userid: u64, // userid which later will be discoverable via the
pub username: String,
pub key: String,
pub valid: bool
#[derive(Serialize, Deserialize, Debug)]
pub struct NewUserResponse {
pub userid: Option<u64>,
pub username: Option<String>,
pub key: Option<String>,
pub err: Option<&'static str>,
}

View File

@ -1,6 +1,7 @@
use chrono::Utc;
use crate::rand_utils::{new_user_id, new_key};
use crate::models::User;
use crate::payload::NewUserResponse;
// Returns a struct of payload::NewUserInfo
pub fn create_new_user() -> User {
@ -15,6 +16,24 @@ pub fn create_new_user() -> User {
}
}
pub fn new_user_response(user: &Option<User>, msg: Option<&'static str>) -> NewUserResponse {
if let Some(u) = user {
NewUserResponse {
userid: Some(u.userid),
username: Some(u.username.clone()),
key: Some(u.key.clone()),
err: None
}
}
else{
NewUserResponse {
userid: None,
username: None,
key: None,
err: Some(msg.unwrap())
}
}
}
#[cfg(test)]
mod user_tests {
use super::create_new_user;