use axum::{ Extension, Json, extract::{Path, State}, }; use serde::Deserialize; use serde_json::{Value, json}; use crate::{ auth::AuthenticatedSession, error::ApiError, service::{RotateSecretPayload, SecretPayload}, state::AppState, }; #[derive(Deserialize)] pub struct WorkspacePath { pub workspace_id: String, } #[derive(Deserialize)] pub struct WorkspaceSecretPath { pub workspace_id: String, pub secret_id: String, } pub async fn list_secrets( Path(path): Path, State(state): State, ) -> Result, ApiError> { let items = state .service .list_secrets(&path.workspace_id.as_str().into()) .await?; Ok(Json(json!({ "items": items }))) } pub async fn create_secret( Path(path): Path, State(state): State, Extension(session): Extension, Json(payload): Json, ) -> Result, ApiError> { let secret = state .service .create_secret( &path.workspace_id.as_str().into(), Some(&session.user.id), payload, ) .await?; Ok(Json(json!(secret))) } pub async fn get_secret( Path(path): Path, State(state): State, ) -> Result, ApiError> { let secret = state .service .get_secret( &path.workspace_id.as_str().into(), &path.secret_id.as_str().into(), ) .await?; Ok(Json(json!(secret))) } pub async fn rotate_secret( Path(path): Path, State(state): State, Extension(session): Extension, Json(payload): Json, ) -> Result, ApiError> { let secret = state .service .rotate_secret( &path.workspace_id.as_str().into(), &path.secret_id.as_str().into(), Some(&session.user.id), payload, ) .await?; Ok(Json(json!(secret))) } pub async fn delete_secret( Path(path): Path, State(state): State, ) -> Result, ApiError> { state .service .delete_secret( &path.workspace_id.as_str().into(), &path.secret_id.as_str().into(), ) .await?; Ok(Json(json!({ "ok": true }))) }