use std::sync::Arc; use geoffrey_models::models::link::Link; use geoffrey_models::models::parameters::register_params::RegisterParameters; use geoffrey_models::models::player::{Player, UserID}; use geoffrey_models::models::response::api_error::GeoffreyAPIError; use geoffrey_models::models::CommandLevel; use geoffrey_models::GeoffreyDatabaseModel; use crate::api_endpoint::{ApiEndpoint, RequestType}; use crate::commands::Command; use crate::context::Context; use crate::Result; pub struct Register {} impl ApiEndpoint for Register { fn endpoint_name() -> String { "register".to_string() } fn request_type() -> RequestType { RequestType::POST } } impl Command for Register { type Req = RegisterParameters; type Resp = Player; fn command_level() -> CommandLevel { CommandLevel::ALL } fn run_command(ctx: Arc, req: &Self::Req, _: Option) -> Result { if let Some(link_code) = &req.link_code { let link: Option = ctx .db .filter(|_, link: &Link| link.is_valid(link_code.clone()))? .next(); return if let Some(link) = link { ctx.db.remove::(link.id().unwrap())?; let mut player = ctx.db.get::(link.player_id)?; player.user_ids.insert(req.user_id.clone()); ctx.db.insert(player).map_err(GeoffreyAPIError::from) } else { Err(GeoffreyAPIError::AccountLinkInvalid) }; } if !matches!(&req.user_id, UserID::MinecraftUUID { mc_uuid: _ }) { return Err(GeoffreyAPIError::PlayerRegistrationWithoutMCUUID); } let player = Player::new(req.username.as_str(), req.user_id.clone()); ctx.db.insert(player).map_err(GeoffreyAPIError::from) } }