Skip to main content

hvz/endpoints/
interactions.rs

1use 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/// Struct representing an interaction
13#[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/// Struct representing a player in the leaderboard
22#[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/// Struct representing a zombie tree
32#[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}** - Get all interactions
40#[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}** - Get the zombie leaderboard
61#[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}** - Gets the zombie ancestry tree
82#[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}