EinsatzOnline/src/modules/api/resources/vehicles/create.rs

99 lines
4.5 KiB
Rust

use rocket::State;
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use rocket::serde::json::Json;
use crate::database::model::vehicles::Vehicle;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_uuid_string};
use crate::database::controller::entities::generate_entity;
use crate::database::controller::vehicles::add_vehicle;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::database::controller::roles::{add_permission_context, get_role_permission_id};
#[derive(Queryable, Clone, Deserialize, Serialize)]
pub struct CreateVehicleData{
pub(crate) identifier: String,
pub(crate) numberplate: Option<String>,
pub(crate) description: Option<String>,
pub(crate) is_operational: bool,
pub(crate) admissible_total_weight: Option<i32>,
pub(crate) vehicle_category: Option<String>,
pub(crate) required_license: Option<String>,
}
#[post("/api/resources/vehicles", format = "json", data = "<create_vehicle_data>")]
pub fn create_vehicle(
settings: &State<Settings>,
cookie: SessionCookie,
create_vehicle_data: Json<CreateVehicleData>,
) -> Result<Json<Vehicle>, Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
if !caller.has_permission("modules.resource_management.vehicles.core.create".to_string()) {
return Err(Json(
ApiError::new(403, "Keine Berechtigung, Fahrzeug anzulegen!".to_string()).to_wrapper(),
));
}
let vehicle_create_data = create_vehicle_data.into_inner();
let entity_id2 = match generate_entity(settings){
Ok(ent) => ent,
Err(_e) => return Err(Json(ApiError::new(500, "Konnte keine neue Entität anlegen!".to_string()).to_wrapper()))
};
let vehicle_category = match vehicle_create_data.vehicle_category{
Some(category) => Some(parse_uuid_string(category)?),
None => None,
};
let vehicle = Vehicle{
entity_id: entity_id2,
identifier: vehicle_create_data.identifier,
numberplate: vehicle_create_data.numberplate,
description: vehicle_create_data.description,
is_operational: vehicle_create_data.is_operational,
admissible_total_weight: vehicle_create_data.admissible_total_weight,
required_license: vehicle_create_data.required_license,
vehicle_category,
};
match add_vehicle(settings, vehicle){
Ok(vehicle) => {
let rpi = match get_role_permission_id(settings, "admin".to_string(), crate::permissions::modules::resource_management::vehicles::core::EDIT){
Some(rpi) => rpi,
None => return Err(Json(ApiError::new(500, "Couldn't add permission".to_string()).to_wrapper()))
};
let rpi2 = match get_role_permission_id(settings, "admin".to_string(), crate::permissions::modules::scheduler::appointments::VIEW){
Some(rpi) => rpi,
None => return Err(Json(ApiError::new(500, "Couldn't add permission".to_string()).to_wrapper()))
};
let rpi3 = match get_role_permission_id(settings, "admin".to_string(), crate::permissions::modules::scheduler::appointments::EDIT){
Some(rpi) => rpi,
None => return Err(Json(ApiError::new(500, "Couldn't add permission".to_string()).to_wrapper()))
};
let rpi4 = match get_role_permission_id(settings, "admin".to_string(), crate::permissions::modules::resource_management::vehicles::core::DELETE){
Some(rpi) => rpi,
None => return Err(Json(ApiError::new(500, "Couldn't add permission".to_string()).to_wrapper()))
};
match add_permission_context(settings, rpi, vehicle.entity_id){
Ok(_) => {},
Err(e) => return Err(translate_diesel(e))
};
match add_permission_context(settings, rpi3, vehicle.entity_id){
Ok(_) => {},
Err(e) => return Err(translate_diesel(e))
};
match add_permission_context(settings, rpi2, vehicle.entity_id){
Ok(_) => {},
Err(e) => return Err(translate_diesel(e))
};
match add_permission_context(settings, rpi4, vehicle.entity_id){
Ok(_) => Ok(Json(vehicle)),
Err(e) => Err(translate_diesel(e))
}
},
Err(e) => Err(translate_diesel(e)),
}
}