use super::{CreateStorageBackendRequest, UpdateStorageBackendRequest};
use crate::{AppState, AuthClaims};
use axum::{
extract::{Path, State},
http::StatusCode,
response::IntoResponse,
Json,
};
use uuid::Uuid;
pub async fn create_storage_backend(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Json(payload): Json<CreateStorageBackendRequest>,
) -> Result<impl IntoResponse, StatusCode> {
let id = Uuid::new_v4();
let mut tx = state
.pool
.begin()
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
if payload.is_default_sfs {
crate::db::unset_default_sfs(&mut tx)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
}
sqlx::query(
r#"
INSERT INTO storage_backends (id, name, description, backend_type, config, is_default_sfs)
VALUES ($1, $2, $3, $4, $5, $6)
"#,
)
.bind(id)
.bind(&payload.name)
.bind(&payload.description)
.bind(&payload.backend_type)
.bind(&payload.config)
.bind(payload.is_default_sfs)
.execute(&mut *tx)
.await
.map_err(|e| {
tracing::error!("Failed to create storage backend: {:?}", e);
StatusCode::INTERNAL_SERVER_ERROR
})?;
tx.commit()
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok((StatusCode::CREATED, Json(serde_json::json!({ "id": id }))))
}
pub async fn list_storage_backends(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
) -> Result<impl IntoResponse, StatusCode> {
let backends = crate::db::list_storage_backends(&state.pool)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(Json(backends))
}
pub async fn get_storage_backend(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<impl IntoResponse, StatusCode> {
let backend = crate::db::get_storage_backend(&state.pool, id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
.ok_or(StatusCode::NOT_FOUND)?;
Ok(Json(backend))
}
pub async fn update_storage_backend(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
Json(payload): Json<UpdateStorageBackendRequest>,
) -> Result<impl IntoResponse, StatusCode> {
let mut tx = state
.pool
.begin()
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
if let Some(true) = payload.is_default_sfs {
crate::db::unset_default_sfs(&mut tx)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
}
crate::db::update_storage_backend(&mut tx, id, &payload)
.await
.map_err(|e| {
tracing::error!("Failed to update storage backend: {:?}", e);
StatusCode::INTERNAL_SERVER_ERROR
})?;
tx.commit()
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(StatusCode::OK)
}
pub async fn delete_storage_backend(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<impl IntoResponse, StatusCode> {
crate::db::delete_storage_backend(&state.pool, id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(StatusCode::NO_CONTENT)
}
pub async fn list_run_artifacts(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<impl IntoResponse, StatusCode> {
let artifacts = crate::db::list_run_artifacts(&state.pool, id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(Json(artifacts))
}
pub async fn list_run_test_reports(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<impl IntoResponse, StatusCode> {
let reports = crate::db::list_run_test_reports(&state.pool, id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(Json(reports))
}
pub async fn list_run_test_summaries(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> Result<impl IntoResponse, StatusCode> {
let summaries = crate::db::list_run_test_summaries(&state.pool, id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(Json(summaries))
}
pub async fn get_test_report(
AuthClaims(_claims): AuthClaims,
State(state): State<AppState>,
Path((_run_id, report_id)): Path<(Uuid, Uuid)>,
) -> Result<impl IntoResponse, StatusCode> {
let report = crate::db::get_test_report(&state.pool, report_id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
.ok_or(StatusCode::NOT_FOUND)
.map(|c: String| serde_json::json!({ "content": c }))?;
Ok(Json(report))
}