lmrc-cli 0.3.16

CLI tool for scaffolding LMRC Stack infrastructure projects
Documentation
//! HTTP handlers for Vault secrets endpoints

use axum::{
    extract::{State, Path},
    Json,
};
use lmrc_http_common::{HttpResult, SuccessResponse, EmptyResponse};
use crate::state::AppState;
use super::{service::VaultService, models::*};

/// GET /api/vault/secrets/*path
/// Read secret from Vault
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)))
}

/// POST /api/vault/secrets/*path
/// Write secret to Vault
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)))
}

/// DELETE /api/vault/secrets/*path
/// Delete secret from Vault
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()))
}

/// POST /api/vault/auth/token
/// Generate Vault token for service authentication
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)))
}