feat: implement admin api v1

This commit is contained in:
a.tolmachev
2026-03-25 19:12:58 +03:00
parent 0f72f2a6cb
commit aef87f582f
14 changed files with 1880 additions and 57 deletions
@@ -0,0 +1,31 @@
use axum::{
Json,
extract::{Path, State},
};
use serde_json::{Value, json};
use crate::{error::ApiError, service::AuthProfilePayload, state::AppState};
pub async fn list_auth_profiles(State(state): State<AppState>) -> Result<Json<Value>, ApiError> {
let items = state.service.list_auth_profiles().await?;
Ok(Json(json!({ "items": items })))
}
pub async fn create_auth_profile(
State(state): State<AppState>,
Json(payload): Json<AuthProfilePayload>,
) -> Result<Json<Value>, ApiError> {
let profile = state.service.create_auth_profile(payload).await?;
Ok(Json(json!(profile)))
}
pub async fn get_auth_profile(
Path(auth_profile_id): Path<String>,
State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
let profile = state
.service
.get_auth_profile(&auth_profile_id.as_str().into())
.await?;
Ok(Json(json!(profile)))
}
+168
View File
@@ -0,0 +1,168 @@
use axum::{
Json,
extract::{Path, Query, State},
http::{HeaderMap, StatusCode, header},
response::IntoResponse,
};
use serde_json::{Value, json};
use crate::{
error::ApiError,
service::{
ExportQuery, GenerateDraftPayload, ImportQuery, NewVersionPayload, OperationPayload,
PublishPayload, TestRunPayload,
},
state::AppState,
};
pub async fn list_operations(State(state): State<AppState>) -> Result<Json<Value>, ApiError> {
let items = state.service.list_operations().await?;
Ok(Json(json!({ "items": items })))
}
pub async fn create_operation(
State(state): State<AppState>,
Json(payload): Json<OperationPayload>,
) -> Result<Json<Value>, ApiError> {
let created = state.service.create_operation(payload).await?;
Ok(Json(json!(created)))
}
pub async fn get_operation(
Path(operation_id): Path<String>,
State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
let operation = state
.service
.get_operation(&operation_id.as_str().into())
.await?;
Ok(Json(json!(operation)))
}
pub async fn get_operation_version(
Path((operation_id, version)): Path<(String, u32)>,
State(state): State<AppState>,
) -> Result<Json<Value>, ApiError> {
let version = state
.service
.get_operation_version(&operation_id.as_str().into(), version)
.await?;
Ok(Json(json!(version)))
}
pub async fn create_version(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<NewVersionPayload>,
) -> Result<Json<Value>, ApiError> {
let created = state
.service
.create_version(&operation_id.as_str().into(), payload)
.await?;
Ok(Json(json!(created)))
}
pub async fn publish_operation(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<PublishPayload>,
) -> Result<Json<Value>, ApiError> {
let published = state
.service
.publish_operation(&operation_id.as_str().into(), payload.version)
.await?;
Ok(Json(json!(published)))
}
pub async fn run_test(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<TestRunPayload>,
) -> Result<Json<Value>, ApiError> {
let result = state
.service
.run_test(&operation_id.as_str().into(), payload)
.await?;
Ok(Json(json!(result)))
}
pub async fn upload_input_json(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<Value>,
) -> Result<Json<Value>, ApiError> {
let sample = state
.service
.save_json_sample(
&operation_id.as_str().into(),
mcpaas_registry::SampleKind::InputJson,
&payload,
)
.await?;
Ok(Json(json!({
"sample_id": sample.id.as_str(),
"sample_kind": sample.sample_kind,
"version": sample.version
})))
}
pub async fn upload_output_json(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<Value>,
) -> Result<Json<Value>, ApiError> {
let sample = state
.service
.save_json_sample(
&operation_id.as_str().into(),
mcpaas_registry::SampleKind::OutputJson,
&payload,
)
.await?;
Ok(Json(json!({
"sample_id": sample.id.as_str(),
"sample_kind": sample.sample_kind,
"version": sample.version
})))
}
pub async fn generate_draft(
Path(operation_id): Path<String>,
State(state): State<AppState>,
Json(payload): Json<GenerateDraftPayload>,
) -> Result<Json<Value>, ApiError> {
let draft = state
.service
.generate_draft(&operation_id.as_str().into(), payload)
.await?;
Ok(Json(json!(draft)))
}
pub async fn export_operation(
Path(operation_id): Path<String>,
Query(query): Query<ExportQuery>,
State(state): State<AppState>,
) -> Result<impl IntoResponse, ApiError> {
let yaml = state
.service
.export_operation(&operation_id.as_str().into(), query)
.await?;
let mut headers = HeaderMap::new();
headers.insert(
header::CONTENT_TYPE,
header::HeaderValue::from_static("application/yaml"),
);
Ok((StatusCode::OK, headers, yaml))
}
pub async fn import_operation(
Query(query): Query<ImportQuery>,
State(state): State<AppState>,
body: String,
) -> Result<Json<Value>, ApiError> {
let imported = state.service.import_operation(query, &body).await?;
Ok(Json(json!(imported)))
}