use axum::{ extract::{Path, State}, http::StatusCode, Json, }; use crate::{ models::{EnvVar, SetEnvVar}, AppState, }; pub async fn list( State(s): State, Path(app_id): Path, ) -> Result>, StatusCode> { let vars = sqlx::query_as::<_, EnvVar>( "SELECT * FROM env_vars WHERE app_id = ? ORDER BY key", ) .bind(&app_id) .fetch_all(&s.db) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; Ok(Json(vars)) } pub async fn set( State(s): State, Path(app_id): Path, Json(payload): Json, ) -> Result { sqlx::query( "INSERT INTO env_vars (app_id, key, value) VALUES (?, ?, ?) ON CONFLICT(app_id, key) DO UPDATE SET value = excluded.value", ) .bind(&app_id) .bind(&payload.key) .bind(&payload.value) .execute(&s.db) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; Ok(StatusCode::NO_CONTENT) } pub async fn remove( State(s): State, Path((app_id, key)): Path<(String, String)>, ) -> Result { sqlx::query("DELETE FROM env_vars WHERE app_id = ? AND key = ?") .bind(&app_id) .bind(&key) .execute(&s.db) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; Ok(StatusCode::NO_CONTENT) }