use axum::{
extract::{State, Path},
Json,
};
use lmrc_http_common::{HttpResult, SuccessResponse, EmptyResponse};
use crate::state::AppState;
use super::{service::VaultService, models::*};
pub async fn read_secret(
State(state): State<AppState>,
Path(path): Path<String>,
) -> HttpResult<Json<SuccessResponse<SecretResponse>>> {
tracing::info!("Reading secret from path: {}", path);
let service = VaultService::new(
state.config.vault_addr.clone(),
state.config.vault_token.clone(),
)?;
let secret = service.read_secret(&path).await?;
Ok(Json(SuccessResponse::new(secret)))
}
pub async fn write_secret(
State(state): State<AppState>,
Path(path): Path<String>,
Json(request): Json<WriteSecretRequest>,
) -> HttpResult<Json<SuccessResponse<SecretResponse>>> {
tracing::info!("Writing secret to path: {}", path);
let service = VaultService::new(
state.config.vault_addr.clone(),
state.config.vault_token.clone(),
)?;
let secret = service.write_secret(&path, request.data).await?;
Ok(Json(SuccessResponse::new(secret)))
}
pub async fn delete_secret(
State(state): State<AppState>,
Path(path): Path<String>,
) -> HttpResult<Json<EmptyResponse>> {
tracing::info!("Deleting secret from path: {}", path);
let service = VaultService::new(
state.config.vault_addr.clone(),
state.config.vault_token.clone(),
)?;
service.delete_secret(&path).await?;
Ok(Json(EmptyResponse::new()))
}
pub async fn create_token(
State(state): State<AppState>,
Json(request): Json<CreateTokenRequest>,
) -> HttpResult<Json<SuccessResponse<TokenResponse>>> {
tracing::info!("Creating Vault token with policies: {:?}", request.policies);
let service = VaultService::new(
state.config.vault_addr.clone(),
state.config.vault_token.clone(),
)?;
let token = service.create_token(request.policies, request.ttl).await?;
Ok(Json(SuccessResponse::new(token)))
}