use axum::extract::{Query, State};
use axum::http::HeaderMap;
use axum::response::Json;
use crate::dto::schema::{
SchemaDto, SchemaGetQuery, SchemaReplaceBody, SchemaReplaceDto, SchemaUploadBody,
SchemaUploadDto, SchemaValidateBody, SchemaValidateDto,
};
use crate::error::ApiError;
use crate::port::Outcome;
use crate::state::EdgeState;
pub async fn get(
State(state): State<EdgeState>,
headers: HeaderMap,
Query(query): Query<SchemaGetQuery>,
) -> Result<Json<SchemaDto>, ApiError> {
let req = query.to_request();
let ident = state.resolve(&headers).await?;
let client = state.client_for(&ident.credential).await?;
let out = client.get_schema(&req).await;
state.record("get_schema", &ident, Outcome::of(&out));
let resp = out.map_err(|e| ApiError::from_brain(&e))?;
Ok(Json(SchemaDto::from(resp)))
}
pub async fn upload(
State(state): State<EdgeState>,
headers: HeaderMap,
Json(body): Json<SchemaUploadBody>,
) -> Result<Json<SchemaUploadDto>, ApiError> {
let req = body.to_request();
let ident = state.resolve(&headers).await?;
let client = state.client_for(&ident.credential).await?;
let out = client.upload_schema(&req).await;
state.record("upload_schema", &ident, Outcome::of(&out));
let resp = out.map_err(|e| ApiError::from_brain(&e))?;
Ok(Json(SchemaUploadDto::from(resp)))
}
pub async fn validate(
State(state): State<EdgeState>,
headers: HeaderMap,
Json(body): Json<SchemaValidateBody>,
) -> Result<Json<SchemaValidateDto>, ApiError> {
let req = body.to_request();
let ident = state.resolve(&headers).await?;
let client = state.client_for(&ident.credential).await?;
let out = client.validate_schema(&req).await;
state.record("validate_schema", &ident, Outcome::of(&out));
let resp = out.map_err(|e| ApiError::from_brain(&e))?;
Ok(Json(SchemaValidateDto::from(resp)))
}
pub async fn replace(
State(state): State<EdgeState>,
headers: HeaderMap,
Json(body): Json<SchemaReplaceBody>,
) -> Result<Json<SchemaReplaceDto>, ApiError> {
let req = body.to_request().map_err(ApiError::bad_request)?;
let ident = state.resolve(&headers).await?;
let client = state.client_for(&ident.credential).await?;
let out = client.replace_schema(&req).await;
state.record("replace_schema", &ident, Outcome::of(&out));
let resp = out.map_err(|e| ApiError::from_brain(&e))?;
Ok(Json(SchemaReplaceDto::from(resp)))
}