hvz/endpoints/
interactions.rs1use actix_web::{HttpRequest, HttpResponse, Responder, get, web};
2use chrono::NaiveDateTime;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6 interactions::{Interaction, InteractionType},
7 player::{Player, PlayerRole, PlayerState},
8 time::CustomDateTime,
9 token::Token,
10};
11
12#[derive(Serialize, Deserialize)]
14pub struct InteractionReturnType {
15 pub interaction_type: InteractionType,
16 pub player_alias: String,
17 pub target_alias: Option<String>,
18 pub date: Option<NaiveDateTime>,
19}
20
21#[derive(Serialize, Deserialize)]
23pub struct LeaderBoardPlayers {
24 pub alias: String,
25 pub kills: Vec<String>,
26 pub next_feeding: Option<CustomDateTime>,
27 pub state: PlayerState,
28 pub role: PlayerRole,
29}
30
31#[derive(Serialize, Deserialize)]
33pub struct ZombieTree {
34 pub hunter_alias: String,
35 pub target_alias: String,
36 pub date: NaiveDateTime,
37}
38
39#[get("/interactions/{url_id}")]
41pub async fn get_interactions(url_id: web::Path<String>, req: HttpRequest) -> impl Responder {
42 if let Err(e) = Token::check_token(&req, &url_id).await {
43 return HttpResponse::Forbidden().body(e);
44 }
45
46 match Player::get_player(url_id.into_inner()).await {
47 Ok(Some(player)) => player,
48 Ok(None) => return HttpResponse::NotFound().body("Player not found"),
49 Err(err) => return HttpResponse::InternalServerError().body(err),
50 };
51
52 let interactions = Interaction::get_all_interactions().await;
53
54 match interactions {
55 Ok(interactions) => HttpResponse::Ok().json(interactions),
56 Err(e) => HttpResponse::InternalServerError().body(e),
57 }
58}
59
60#[get("/interactions/leaderboard/{url_id}")]
62pub async fn leaderboard(url_id: web::Path<String>, req: HttpRequest) -> impl Responder {
63 if let Err(e) = Token::check_token(&req, &url_id).await {
64 return HttpResponse::Forbidden().body(e);
65 }
66
67 let player = match Player::get_player(url_id.into_inner()).await {
68 Ok(Some(player)) => player,
69 Ok(None) => return HttpResponse::NotFound().body("Player not found"),
70 Err(err) => return HttpResponse::InternalServerError().body(err),
71 };
72
73 let leaderboard = Interaction::get_leaderboard(player.is_zombie().await).await;
74
75 match leaderboard {
76 Ok(leaderboard) => HttpResponse::Ok().json(leaderboard),
77 Err(e) => HttpResponse::InternalServerError().body(e),
78 }
79}
80
81#[get("/interactions/tree/{url_id}")]
83pub async fn zombie_tree(url_id: web::Path<String>, req: HttpRequest) -> impl Responder {
84 if let Err(e) = Token::check_token(&req, &url_id).await {
85 return HttpResponse::Forbidden().body(e);
86 }
87
88 match Player::get_player(url_id.into_inner()).await {
89 Ok(Some(player)) => player,
90 Ok(None) => return HttpResponse::NotFound().body("Player not found"),
91 Err(err) => return HttpResponse::InternalServerError().body(err),
92 };
93
94 let tree = Interaction::get_zombie_tree().await;
95
96 match tree {
97 Ok(t) => HttpResponse::Ok().json(t),
98 Err(err) => HttpResponse::InternalServerError().body(err),
99 }
100}