use std::sync::Arc;
use business::domain::{{ snake }}::use_cases::create_{{ snake }}::{Create{{ pascal }}Params, Create{{ pascal }}UseCaseTrait};
use poem_openapi::{OpenApi, payload::Json};
use crate::api::error::IntoErrorResponse;
use crate::api::tags::ApiTags;
use crate::api::{{ snake }}::dto::{Create{{ pascal }}Request, {{ pascal }}Dto};
use crate::api::{{ snake }}::responses::Create{{ pascal }}Response;
pub struct {{ pascal }}Api {
pub create_{{ snake }}: Arc<dyn Create{{ pascal }}UseCaseTrait>,
}
#[OpenApi]
impl {{ pascal }}Api {
/// Create a new {{ pascal }}
#[oai(path = "/{{ plural }}", method = "post", tag = "ApiTags::{{ pascal }}")]
async fn create(&self, body: Json<Create{{ pascal }}Request>) -> Create{{ pascal }}Response {
match self
.create_{{ snake }}
.execute(Create{{ pascal }}Params { name: body.name.clone() })
.await
{
Ok(entity) => Create{{ pascal }}Response::Created(Json({{ pascal }}Dto::from_domain(&entity))),
Err(err) => {
let (status, error) = err.into_error_response();
tracing::warn!(code = %error.0.name, "create_{{ snake }} failed");
Create{{ pascal }}Response::from_status(status, error)
}
}
}
}