Skip to content

Commit

Permalink
Get players by rank id endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
jorgeberrex committed Sep 16, 2024
1 parent 5aa1b7c commit cb51940
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
23 changes: 16 additions & 7 deletions src/database/mod.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
use std::{str::FromStr, time::Duration};
use std::collections::HashSet;

use anyhow::anyhow;
use futures::stream::FuturesUnordered;
use futures::StreamExt;
use mars_api_rs_macro::IdentifiableDocument;
use mongodb::{bson::{doc, oid::ObjectId}, Client, Collection, Cursor, options::{ClientOptions, FindOneOptions, UpdateOptions}, results::DeleteResult};
use mongodb::options::FindOptions;
use mongodb::{options::{ClientOptions, FindOneOptions, UpdateOptions}, Client, Collection, bson::{doc, oid::ObjectId}, Cursor, results::DeleteResult};
use models::tag::Tag;
use rand::Rng;
use rocket::form::validate::Contains;
use rocket::serde::DeserializeOwned;
use futures::StreamExt;
use serde::Serialize;
use anyhow::anyhow;
use futures::stream::FuturesUnordered;
use rocket::form::validate::Contains;

use models::tag::Tag;

use crate::{database::models::player::Player, util::r#macro::unwrap_helper};
use crate::database::models::ip_identity::IpIdentity;
use crate::database::models::player::SimplePlayer;
use crate::util::validation::verbose_result_ok;

use self::models::{achievement::Achievement, death::Death, level::Level, r#match::Match, punishment::Punishment, rank::Rank, session::Session};
use self::models::{achievement::Achievement, death::Death, level::Level, punishment::Punishment, r#match::Match, rank::Rank, session::Session};

pub mod models;
pub mod migrations;
Expand Down Expand Up @@ -209,6 +211,13 @@ impl Database {
let cursor = self.matches.find(doc! {}, Some(opts)).await.ok();
Self::consume_cursor_into_owning_vec_option(cursor).await
}

pub async fn get_players_by_rank(&self, rank: &Rank) -> Vec<SimplePlayer> {
let cursor = self.players.find(doc! { "rankIds": rank.id.clone() }, None).await.ok();
let players = Self::consume_cursor_into_owning_vec_option(cursor).await;
let simple_players = players.into_iter().map(|player| player.to_simple()).collect::<Vec<_>>();
simple_players
}
}

const DB_NAME: &'static str = "mars-api";
Expand Down
19 changes: 16 additions & 3 deletions src/http/rank/mod.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use std::vec;

use futures::future::join_all;
use mongodb::bson::doc;
use rocket::{Rocket, Build, State, serde::json::Json};
use rocket::{Build, Rocket, serde::json::Json, State};
use uuid::Uuid;

use crate::{MarsAPIState, http::rank::payload::RankCreateRequest, database::{models::{rank::Rank, player::Player}, Database}, util::{error::ApiErrorResponder, time::get_u64_time_millis, auth::AuthorizationToken, r#macro::unwrap_helper}};
use crate::{database::{Database, models::{player::Player, rank::Rank}}, http::rank::payload::RankCreateRequest, MarsAPIState, util::{auth::AuthorizationToken, error::ApiErrorResponder, r#macro::unwrap_helper, time::get_u64_time_millis}};
use crate::database::models::player::SimplePlayer;

use self::payload::RankUpdateRequest;

Expand Down Expand Up @@ -53,6 +56,16 @@ async fn get_rank_by_id(state: &State<MarsAPIState>, rank_id: &str) -> Result<Js
Ok(Json(rank))
}

#[get("/<rank_id>/players")]
async fn get_players_by_rank_by_id(state: &State<MarsAPIState>, rank_id: &str) -> Result<Json<Vec<SimplePlayer>>, ApiErrorResponder> {
let rank = unwrap_helper::return_default!(Database::find_by_id(&state.database.ranks, rank_id).await, Err(ApiErrorResponder::missing_rank()));
if rank.apply_on_join || !rank.staff {
return Ok(Json(vec![]));
};
let players = Database::get_players_by_rank(&state.database, &rank).await;
Ok(Json(players))
}


#[delete("/<rank_id>")]
async fn delete_rank(state: &State<MarsAPIState>, rank_id: &str, _auth_guard: AuthorizationToken) -> Result<(), ApiErrorResponder> {
Expand Down Expand Up @@ -120,5 +133,5 @@ async fn update_rank(
}

pub fn mount(rocket: Rocket<Build>) -> Rocket<Build> {
rocket.mount("/mc/ranks", routes![create_rank, get_ranks, get_rank_by_id, delete_rank, update_rank])
rocket.mount("/mc/ranks", routes![create_rank, get_ranks, get_rank_by_id, get_players_by_rank_by_id, delete_rank, update_rank])
}

0 comments on commit cb51940

Please sign in to comment.