64 lines
1.8 KiB
Rust
64 lines
1.8 KiB
Rust
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<Context>, req: &Self::Req, _: Option<Player>) -> Result<Self::Resp> {
|
|
if let Some(link_code) = &req.link_code {
|
|
let link: Option<Link> = ctx
|
|
.db
|
|
.filter(|_, link: &Link| link.is_valid(link_code.clone()))?
|
|
.next();
|
|
|
|
return if let Some(link) = link {
|
|
ctx.db.remove::<Link>(link.id().unwrap())?;
|
|
|
|
let mut player = ctx.db.get::<Player>(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)
|
|
}
|
|
}
|