use crate::app::App;
use crate::middleware::authorization::CurrentPlayer;
use crate::response::from_err;
use crate::{bail_if_city_is_not_owned_by, bail_if_player_is_not_pending, res};
use axum::extract::{Extension, Json, State};
use axum::response::Response;
use nil_core::infrastructure::building::r#impl::workshop::recruit_catalog::WorkshopRecruitCatalog;
use nil_payload::request::infrastructure::workshop::*;
use nil_payload::response::infrastructure::workshop::*;
pub async fn add_recruit_order(
State(app): State<App>,
Extension(player): Extension<CurrentPlayer>,
Json(req): Json<AddWorkshopRecruitOrderRequest>,
) -> Response {
match app.get(req.world) {
Ok(world) => {
let result = try {
let mut world = world.write().await;
bail_if_player_is_not_pending!(world, &player.0);
bail_if_city_is_not_owned_by!(world, &player.0, req.request.coord);
world.add_workshop_recruit_order(&req.request)?;
};
result
.map(|()| res!(OK))
.unwrap_or_else(from_err)
}
Err(err) => from_err(err),
}
}
pub async fn cancel_recruit_order(
State(app): State<App>,
Extension(player): Extension<CurrentPlayer>,
Json(req): Json<CancelWorkshopRecruitOrderRequest>,
) -> Response {
match app.get(req.world) {
Ok(world) => {
let result = try {
let mut world = world.write().await;
bail_if_player_is_not_pending!(world, &player.0);
bail_if_city_is_not_owned_by!(world, &player.0, req.coord);
world.cancel_workshop_recruit_order(req.coord, req.id)?;
};
result
.map(|()| res!(OK))
.unwrap_or_else(from_err)
}
Err(err) => from_err(err),
}
}
pub async fn get_recruit_catalog(
State(app): State<App>,
Extension(player): Extension<CurrentPlayer>,
Json(req): Json<GetWorkshopRecruitCatalogRequest>,
) -> Response {
match app.get(req.world) {
Ok(world) => {
let result = try {
let world = world.read().await;
bail_if_city_is_not_owned_by!(world, &player.0, req.coord);
let infra = world.city(req.coord)?.infrastructure();
WorkshopRecruitCatalog::new(infra)
};
result
.map(|catalog| res!(OK, GetWorkshopRecruitCatalogResponse(catalog)))
.unwrap_or_else(from_err)
}
Err(err) => from_err(err),
}
}