From 000fb8994f1e7a543a343e8586d4bc3ff353f604 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Mon, 2 Feb 2026 01:25:48 +0300 Subject: [PATCH] crates/server: add jobset input CRUD API routes Signed-off-by: NotAShelf Change-Id: Ic43064296a4a7eb5a7ee4f52529dae2f6a6a6964 --- crates/server/src/routes/jobsets.rs | 72 ++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/crates/server/src/routes/jobsets.rs b/crates/server/src/routes/jobsets.rs index 74501a6..b0443bb 100644 --- a/crates/server/src/routes/jobsets.rs +++ b/crates/server/src/routes/jobsets.rs @@ -3,7 +3,8 @@ use axum::{ extract::{Path, State}, routing::get, }; -use fc_common::{Jobset, UpdateJobset, Validate}; +use fc_common::{Jobset, JobsetInput, UpdateJobset, Validate}; +use serde::Deserialize; use uuid::Uuid; use crate::auth_middleware::RequireAdmin; @@ -46,9 +47,68 @@ async fn delete_jobset( Ok(Json(serde_json::json!({ "deleted": true }))) } -pub fn router() -> Router { - Router::new().route( - "/projects/{project_id}/jobsets/{id}", - get(get_jobset).put(update_jobset).delete(delete_jobset), - ) +// --- Jobset input routes --- + +async fn list_jobset_inputs( + State(state): State, + Path((_project_id, jobset_id)): Path<(Uuid, Uuid)>, +) -> Result>, ApiError> { + let inputs = fc_common::repo::jobset_inputs::list_for_jobset(&state.pool, jobset_id) + .await + .map_err(ApiError)?; + Ok(Json(inputs)) +} + +#[derive(Debug, Deserialize)] +struct CreateJobsetInputRequest { + name: String, + input_type: String, + value: String, + revision: Option, +} + +async fn create_jobset_input( + _auth: RequireAdmin, + State(state): State, + Path((_project_id, jobset_id)): Path<(Uuid, Uuid)>, + Json(body): Json, +) -> Result, ApiError> { + let input = fc_common::repo::jobset_inputs::create( + &state.pool, + jobset_id, + &body.name, + &body.input_type, + &body.value, + body.revision.as_deref(), + ) + .await + .map_err(ApiError)?; + Ok(Json(input)) +} + +async fn delete_jobset_input( + _auth: RequireAdmin, + State(state): State, + Path((_project_id, _jobset_id, input_id)): Path<(Uuid, Uuid, Uuid)>, +) -> Result, ApiError> { + fc_common::repo::jobset_inputs::delete(&state.pool, input_id) + .await + .map_err(ApiError)?; + Ok(Json(serde_json::json!({ "deleted": true }))) +} + +pub fn router() -> Router { + Router::new() + .route( + "/projects/{project_id}/jobsets/{id}", + get(get_jobset).put(update_jobset).delete(delete_jobset), + ) + .route( + "/projects/{project_id}/jobsets/{jobset_id}/inputs", + get(list_jobset_inputs).post(create_jobset_input), + ) + .route( + "/projects/{project_id}/jobsets/{jobset_id}/inputs/{input_id}", + axum::routing::delete(delete_jobset_input), + ) }