49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
|
use crate::commands::{Command, RequestType};
|
||
|
use crate::context::Context;
|
||
|
use crate::Result;
|
||
|
use geoffrey_db::helper::load_location;
|
||
|
use geoffrey_models::models::locations::{Location, LocationDb};
|
||
|
use geoffrey_models::models::parameters::delete_params::DeleteParams;
|
||
|
use geoffrey_models::models::player::Player;
|
||
|
use geoffrey_models::models::response::api_error::GeoffreyAPIError;
|
||
|
use geoffrey_models::models::CommandLevel;
|
||
|
use std::sync::Arc;
|
||
|
|
||
|
pub struct Delete {}
|
||
|
|
||
|
impl Command for Delete {
|
||
|
type Req = DeleteParams;
|
||
|
type Resp = Location;
|
||
|
|
||
|
fn command_name() -> String {
|
||
|
"delete".to_string()
|
||
|
}
|
||
|
|
||
|
fn request_type() -> RequestType {
|
||
|
RequestType::POST
|
||
|
}
|
||
|
|
||
|
fn command_level() -> CommandLevel {
|
||
|
CommandLevel::REGISTERED
|
||
|
}
|
||
|
|
||
|
fn run_command(ctx: Arc<Context>, req: &Self::Req, user: Option<Player>) -> Result<Self::Resp> {
|
||
|
let user = user.unwrap();
|
||
|
let filter = regex::Regex::new(format!(r"(?i)^{}$", req.location).as_str()).unwrap();
|
||
|
|
||
|
let location: LocationDb = ctx
|
||
|
.db
|
||
|
.filter(|_, loc: &LocationDb| {
|
||
|
filter.is_match(&loc.name) && loc.owners().contains(&user.id.unwrap())
|
||
|
})?
|
||
|
.next()
|
||
|
.ok_or(GeoffreyAPIError::EntryNotFound)?;
|
||
|
|
||
|
let location = load_location(&ctx.db, &location).map_err(GeoffreyAPIError::from)?;
|
||
|
|
||
|
ctx.db.remove::<LocationDb>(location.id)?;
|
||
|
|
||
|
Ok(location)
|
||
|
}
|
||
|
}
|