use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use sqlx::FromRow; use utoipa::ToSchema; /// Team player positions #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ToSchema)] #[serde(rename_all = "lowercase")] pub enum PlayerPosition { Captain, #[serde(rename = "co-captain")] CoCaptain, Member, } impl PlayerPosition { pub fn as_str(&self) -> &'static str { match self { PlayerPosition::Captain => "captain", PlayerPosition::CoCaptain => "co-captain", PlayerPosition::Member => "member", } } pub fn from_str(s: &str) -> Option { match s.to_lowercase().as_str() { "captain" => Some(PlayerPosition::Captain), "co-captain" => Some(PlayerPosition::CoCaptain), "member" => Some(PlayerPosition::Member), _ => None, } } } /// Team player status #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ToSchema)] pub enum TeamPlayerStatus { Pending = 0, Active = 1, } impl From for TeamPlayerStatus { fn from(val: i32) -> Self { match val { 1 => TeamPlayerStatus::Active, _ => TeamPlayerStatus::Pending, } } } /// Team player model representing the team_players table #[derive(Debug, Clone, Serialize, Deserialize, FromRow, ToSchema)] pub struct TeamPlayer { pub id: i32, pub date_created: DateTime, pub team_id: i32, pub player_id: i32, pub position: String, pub status: i32, } /// Join team request #[derive(Debug, Deserialize, ToSchema)] pub struct JoinTeamRequest { pub team_id: i32, } /// Change position request #[derive(Debug, Deserialize, ToSchema)] pub struct ChangePositionRequest { pub position: String, }