Skip to content

Commit df1f9f6

Browse files
authored
feat: add /players/me endpoint (stadust#197)
Signed-off-by: Emanuel Pilz <[email protected]>
1 parent c683aa1 commit df1f9f6

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

pointercrate-demonlist-api/src/endpoints/player.rs

+18
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,24 @@ pub async fn ranking(pool: &State<PointercratePool>, query: Query<RankingPaginat
4545
Ok(pagination_response("/api/v1/players/ranking/", query.0, &mut *pool.connection().await?).await?)
4646
}
4747

48+
#[rocket::get("/me")]
49+
pub async fn get_me(auth: Option<Auth<ApiToken>>, pool: &State<PointercratePool>) -> Result<Tagged<FullPlayer>> {
50+
let Some(auth) = auth else {
51+
return Err(CoreError::Unauthorized.into());
52+
};
53+
54+
let mut connection = pool.connection().await?;
55+
56+
let user = auth.user.into_user();
57+
let Some(player_claim) = PlayerClaim::by_user(user.id, &mut *connection).await? else {
58+
return Err(CoreError::NotFound.into());
59+
};
60+
let player = Player::by_id(player_claim.player.id, &mut *connection).await?;
61+
let full_player = player.upgrade(&mut *connection).await?;
62+
63+
Ok(Tagged(full_player))
64+
}
65+
4866
#[rocket::get("/<player_id>")]
4967
pub async fn get(player_id: i32, pool: &State<PointercratePool>) -> Result<Tagged<FullPlayer>> {
5068
let mut connection = pool.connection().await?;

pointercrate-demonlist-api/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub fn setup(rocket: Rocket<Build>) -> Rocket<Build> {
4444
"/api/v1/players/",
4545
rocket::routes![
4646
endpoints::player::get,
47+
endpoints::player::get_me,
4748
endpoints::player::paginate,
4849
endpoints::player::patch,
4950
endpoints::player::ranking,

pointercrate-test/tests/demonlist/player/mod.rs

+46
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,49 @@ async fn test_patch_player_nationality(pool: Pool<Postgres>) {
168168
assert_eq!(result["data"]["nation_code"], "BE");
169169
assert_eq!(result["data"]["subdivision_code"], "ENG");
170170
}
171+
172+
#[sqlx::test(migrations = "../migrations")]
173+
async fn test_me(pool: Pool<Postgres>) {
174+
let (client, mut connection) = pointercrate_test::demonlist::setup_rocket(pool).await;
175+
176+
// Assert 401 without authentication
177+
client.get("/api/v1/players/me").expect_status(Status::Unauthorized).execute().await;
178+
179+
let authenticated_user = pointercrate_test::user::add_normal_user(&mut *connection).await;
180+
let user = authenticated_user.user();
181+
182+
// Assert 404 when authorized, but claim doesn't exist
183+
client
184+
.get("/api/v1/players/me")
185+
.authorize_as(&authenticated_user)
186+
.expect_status(Status::NotFound)
187+
.execute()
188+
.await;
189+
190+
// Create claim
191+
let player = DatabasePlayer::by_name_or_create("stardust1971", &mut *connection).await.unwrap();
192+
player
193+
.initiate_claim(user.id, &mut *connection)
194+
.await
195+
.unwrap()
196+
.set_verified(true, &mut *connection)
197+
.await
198+
.unwrap();
199+
let player = Player::by_id(player.id, &mut *connection)
200+
.await
201+
.unwrap()
202+
.upgrade(&mut *connection)
203+
.await
204+
.unwrap();
205+
206+
// Authorized and claim exists
207+
assert_eq!(
208+
client
209+
.get("/api/v1/players/me")
210+
.authorize_as(&authenticated_user)
211+
.expect_status(Status::Ok)
212+
.get_success_result::<FullPlayer>()
213+
.await,
214+
player
215+
);
216+
}

0 commit comments

Comments
 (0)