use std::sync::Arc; use rand::distributions::Alphanumeric; use rand::Rng; use geoffrey_models::models::parameters::add_token_params::AddTokenParams; use geoffrey_models::models::player::Player; use geoffrey_models::models::response::api_error::GeoffreyAPIError; use geoffrey_models::models::token::Token; use geoffrey_models::models::CommandLevel; use crate::api_endpoint::{ApiEndpoint, RequestType}; use crate::commands::Command; use crate::context::Context; use crate::Result; pub struct AddToken {} impl ApiEndpoint for AddToken { fn endpoint_name() -> String { "add_token".to_string() } fn request_type() -> RequestType { RequestType::POST } } impl Command for AddToken { type Req = AddTokenParams; type Resp = Token; fn command_level() -> CommandLevel { CommandLevel::ADMIN } fn run_command(ctx: Arc, req: &Self::Req, _: Option) -> Result { let mut token = Token::default(); let secret: String = rand::thread_rng() .sample_iter(&Alphanumeric) .take(64) .map(char::from) .collect(); token.secret = secret; for permission in &req.permissions { token.set_permission(*permission); } ctx.db.insert(token).map_err(GeoffreyAPIError::from) } }