Geoffrey-rs/geoffrey_api/src/commands/set_portal.rs

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::set_portal_params::SetPortalParams;
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 SetPortal {}
impl Command for SetPortal {
type Req = SetPortalParams;
type Resp = Location;
fn command_name() -> String {
"set_portal".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.loc_name).as_str()).unwrap();
let mut location: LocationDb = ctx
.db
.filter(|_, loc: &LocationDb| {
loc.owners().contains(&user.id.unwrap()) && filter.is_match(loc.name.as_str())
})?
.next()
.ok_or(GeoffreyAPIError::EntryNotFound)?;
location.portal = Some(req.portal);
let location = ctx.db.insert(location)?;
load_location(&ctx.db, &location).map_err(|err| err.into())
}
}