* /join route handler now uses hashmaps among and returns more sensible http codes
This commit is contained in:
		
							parent
							
								
									98803eec26
								
							
						
					
					
						commit
						9fac3aa117
					
				@ -1,4 +1,4 @@
 | 
			
		||||
use serde_json::Value;
 | 
			
		||||
use serde_json::{Value, json};
 | 
			
		||||
use serde::Serialize;
 | 
			
		||||
 | 
			
		||||
use mysql_async;
 | 
			
		||||
@ -16,6 +16,8 @@ use db::{UBigInt, BigInt};
 | 
			
		||||
use db::common::FromDB;
 | 
			
		||||
use db::member::Member;
 | 
			
		||||
 | 
			
		||||
use crate::http;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize)]
 | 
			
		||||
struct Invite {
 | 
			
		||||
@ -96,17 +98,31 @@ async fn use_invite(pool: &Pool, code: Option<BigInt>) -> Option<Member>{
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn join(pool: &Pool, response: &mut Response<Body>, params: Value) {
 | 
			
		||||
pub async fn join(pool: &Pool, response: &mut Response<Body>, params: HashMap<&str, &str>) {
 | 
			
		||||
    /*
 | 
			
		||||
     * Main dispatcher for dealing with an attempted join via a given invide code
 | 
			
		||||
     * 
 | 
			
		||||
     */
 | 
			
		||||
    let code = match params.get("invite-id") {
 | 
			
		||||
        Some(val) => val.as_i64(),
 | 
			
		||||
    let code = match params.get("code") {
 | 
			
		||||
        Some(val) => {
 | 
			
		||||
            // i64 because we're using unix timestamps and basically the database is dumb
 | 
			
		||||
            if let Ok(num) = (*val).to_string().parse::<i64>() {
 | 
			
		||||
                Some(num)
 | 
			
		||||
            } else {
 | 
			
		||||
                None
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
        },
 | 
			
		||||
        None => None
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Returns a new member if the code is used successfully
 | 
			
		||||
    match use_invite(&pool, code).await {
 | 
			
		||||
        Some(new_account) => *response.body_mut() = Body::from(serde_json::to_string(&new_account).unwrap()),
 | 
			
		||||
        Some(new_account) => {
 | 
			
		||||
            http::set_json_body(response, json!(new_account))
 | 
			
		||||
        },
 | 
			
		||||
        None => {
 | 
			
		||||
            *response.status_mut() = StatusCode::NOT_FOUND;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -166,7 +182,7 @@ pub async fn create(pool: &Pool, response: &mut Response<Body>, params: HashMap<
 | 
			
		||||
     * expires: Option<bool>
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    let id = crate::http::extract_uid(¶ms);
 | 
			
		||||
    let id = http::extract_uid(¶ms);
 | 
			
		||||
 | 
			
		||||
    let use_count = match params.get("uses")  {
 | 
			
		||||
        Some(val) => {
 | 
			
		||||
@ -203,7 +219,7 @@ pub async fn create(pool: &Pool, response: &mut Response<Body>, params: HashMap<
 | 
			
		||||
    match insert_new_invite(&pool, &invite).await {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            // return the id of the invite
 | 
			
		||||
            // Link format from here is basically hostname.io:4536/join/<id>
 | 
			
		||||
            // Link format from here is basically hostname.io:4536/join?code=<some-code>
 | 
			
		||||
            crate::http::set_json_body(response, serde_json::json!(invite))
 | 
			
		||||
        },
 | 
			
		||||
        Err(mysqle) => {
 | 
			
		||||
@ -227,21 +243,6 @@ mod invites_test {
 | 
			
		||||
 | 
			
		||||
    #[tokio::test]
 | 
			
		||||
    async fn create_invite_good() {
 | 
			
		||||
        // Generation of data
 | 
			
		||||
        let p = get_pool();
 | 
			
		||||
        let mut resp = hyper_resp();
 | 
			
		||||
        // expected params 
 | 
			
		||||
        let params: Value = serde_json::from_str(r#"
 | 
			
		||||
            {
 | 
			
		||||
                "uses": 3,
 | 
			
		||||
                "expire": null
 | 
			
		||||
            }
 | 
			
		||||
        "#).unwrap();
 | 
			
		||||
 | 
			
		||||
        // Collection
 | 
			
		||||
        super::join(&p, &mut resp, params).await;
 | 
			
		||||
        let _ = p.disconnect().await;
 | 
			
		||||
 | 
			
		||||
        assert_eq!(StatusCode::OK, resp.status());
 | 
			
		||||
        todo!()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user