xecute-cli 0.1.3

NestJS-style project and resource generator for Xecute
//! HTTP routes; validate payloads before calling business operations.
use std::sync::Arc;
use axum::{extract::State, http::StatusCode, Json};
use garde::Validate;
use xecute::{controller, injectable};
use super::{dto::Create__TYPE__Dto, entity::__TYPE__, service::__TYPE__Service};

/// Injectable HTTP controller for this resource.
#[injectable]
pub struct __TYPE__Controller { service: Arc<__TYPE__Service> }
#[controller("/__FEATURE__")]
impl __TYPE__Controller {
    /// Retrieve the collection.
    #[get("")]
    async fn list(State(controller): State<Arc<Self>>) -> Json<Vec<__TYPE__>> {
        Json(controller.service.list().await)
    }
    /// Validate a JSON payload and return 201, or a safe 422 error envelope.
    #[post("")]
    async fn create(State(controller): State<Arc<Self>>, Json(payload): Json<Create__TYPE__Dto>)
        -> Result<(StatusCode, Json<__TYPE__>), StatusCode> {
        // Do not expose submitted values in logs or validation error messages.
        payload.validate().map_err(|_| StatusCode::UNPROCESSABLE_ENTITY)?;
        let entity = controller.service.create(payload).await
            .map_err(|_| StatusCode::SERVICE_UNAVAILABLE)?;
        Ok((StatusCode::CREATED, Json(entity)))
    }
}