diff --git a/migrations/2023-08-27-090522_users/up.sql b/migrations/2023-08-27-090522_users/up.sql index 3230564..5275ad4 100644 --- a/migrations/2023-08-27-090522_users/up.sql +++ b/migrations/2023-08-27-090522_users/up.sql @@ -6,7 +6,9 @@ CREATE TABLE users ( account_id INTEGER references accounts(id), registered INTEGER NOT NULL, - username TEXT NOT NULL COLLATE case_insensitive, + -- idk why but we get weird errors if we use `COLLATE case_insensitive` + -- maybe troubleshoot later, this works fine for now. + username TEXT NOT NULL, -- COLLATE case_insensitive, stars INTEGER NOT NULL DEFAULT 0, demons INTEGER NOT NULL DEFAULT 0, diff --git a/src/endpoints/users/get_users.rs b/src/endpoints/users/get_users.rs index fe8530e..12ef4bf 100644 --- a/src/endpoints/users/get_users.rs +++ b/src/endpoints/users/get_users.rs @@ -3,7 +3,6 @@ use rocket::http::Status; use rocket::response::status; use diesel::prelude::*; -use diesel::result::Error; use crate::helpers; use crate::db; @@ -14,7 +13,7 @@ pub struct FormGetUsers { str: String } -#[post("/accounts/getGJUsers20.php", data = "")] +#[post("/getGJUsers20.php", data = "")] pub fn get_users(input: Form) -> status::Custom<&'static str> { let connection = &mut db::establish_connection_pg(); @@ -22,53 +21,75 @@ pub fn get_users(input: Form) -> status::Custom<&'static str> { use crate::schema::users::dsl::*; use crate::models::User; - let mut query = users.into_boxed(); + let mut query_users = users.into_boxed(); match input.str.parse::() { - Ok(id_value) => query = query.filter(id.eq(id_value)), - Err(_) => query = query.filter(username.like(input.str.to_owned() + "%")) + Ok(id_value) => query_users = query_users.filter(id.eq(id_value)), + Err(_) => query_users = query_users.filter(username.ilike(input.str.to_owned() + "%")) }; - let results = query - .order(stars.desc()) - .limit(10) - .offset(input.page * 10) - .get_result::(connection) - .expect("Fatal error loading users"); + let mut results: Vec = vec![]; - let response = helpers::format::format(hashmap! { - 1 => results.username, - 2 => results.id.to_string(), - 3 => results.stars.to_string(), - 4 => results.demons.to_string(), - 8 => results.creator_points.to_string(), - 9 => { - vec![ - results.cube, - results.ship, - results.ball, - results.ufo, - results.wave, - results.robot - ][results.icon_type as usize].to_string() - }, - 10 => results.color1.to_string(), - 11 => results.color2.to_string(), - 13 => results.coins.to_string(), - 14 => results.icon_type.to_string(), - 15 => results.special.to_string(), - 16 => { - match results.account_id { - Some(account_id_value) => account_id_value.to_string(), - None => match results.udid { - Some(udid_value) => udid_value.to_string(), - None => panic!("user has no account_id or udid?!?!?") + for result in { + query_users + .order(stars.desc()) + .offset(input.page * 10) + .limit(10) + .get_results::(connection) + .expect("Fatal error loading users") + } { + let formatted_result = helpers::format::format(hashmap! { + 1 => result.username, + 2 => result.id.to_string(), + 3 => result.stars.to_string(), + 4 => result.demons.to_string(), + 8 => result.creator_points.to_string(), + 9 => { + vec![ + result.cube, + result.ship, + result.ball, + result.ufo, + result.wave, + result.robot + ][result.icon_type as usize].to_string() + }, + 10 => result.color1.to_string(), + 11 => result.color2.to_string(), + 13 => result.coins.to_string(), + 14 => result.icon_type.to_string(), + 15 => result.special.to_string(), + 16 => { + match result.account_id { + Some(account_id_value) => account_id_value.to_string(), + None => match result.udid { + Some(udid_value) => udid_value.to_string(), + None => panic!("user has no account_id or udid?!?!?") + } } } - } - }); + }); - println!("{}", response); + results.push(formatted_result) + }; - return status::Custom(Status::Ok, "1") + let mut query_users_count = users.into_boxed(); + + match input.str.parse::() { + Ok(id_value) => query_users_count = query_users_count.filter(id.eq(id_value)), + Err(_) => query_users_count = query_users_count.filter(username.ilike(input.str.to_owned() + "%")) + }; + + let amount = query_users_count + .count() + .get_result::(connection) + .expect("Error querying user count"); + + let response = if amount < 1 { + String::from("-1") + } else { + vec![results.join("|"), format!("{}:#{}:10", amount, input.page * 10)].join("#") + }; + + return status::Custom(Status::Ok, Box::leak(response.into_boxed_str())) } \ No newline at end of file