2025-01-13 18:51:26 +00:00
using AIStudio.Tools.Rust ;
2025-02-15 14:41:12 +00:00
namespace AIStudio.Tools.Services ;
2025-01-13 18:51:26 +00:00
public sealed partial class RustService
{
/// <summary>
/// Try to get the API key for the given secret ID.
/// </summary>
/// <param name="secretId">The secret ID to get the API key for.</param>
/// <param name="isTrying">Indicates if we are trying to get the API key. In that case, we don't log errors.</param>
2026-01-11 15:02:28 +00:00
/// <param name="storeType">The secret store type. Defaults to LLM_PROVIDER for backward compatibility.</param>
2025-01-13 18:51:26 +00:00
/// <returns>The requested secret.</returns>
2026-01-11 15:02:28 +00:00
public async Task < RequestedSecret > GetAPIKey ( ISecretId secretId , SecretStoreType storeType , bool isTrying = false )
2025-01-13 18:51:26 +00:00
{
2026-01-11 15:02:28 +00:00
var prefix = storeType . Prefix ( ) ;
var secretRequest = new SelectSecretRequest ( $"{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key" , Environment . UserName , isTrying ) ;
2025-01-13 18:51:26 +00:00
var result = await this . http . PostAsJsonAsync ( "/secrets/get" , secretRequest , this . jsonRustSerializerOptions ) ;
if ( ! result . IsSuccessStatusCode )
{
if ( ! isTrying )
2026-01-11 15:02:28 +00:00
this . logger ! . LogError ( $"Failed to get the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key' due to an API issue: '{result.StatusCode}'" ) ;
2025-05-04 12:59:30 +00:00
return new RequestedSecret ( false , new EncryptedText ( string . Empty ) , TB ( "Failed to get the API key due to an API issue." ) ) ;
2025-01-13 18:51:26 +00:00
}
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
var secret = await result . Content . ReadFromJsonAsync < RequestedSecret > ( this . jsonRustSerializerOptions ) ;
if ( ! secret . Success & & ! isTrying )
2026-01-11 15:02:28 +00:00
this . logger ! . LogError ( $"Failed to get the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key': '{secret.Issue}'" ) ;
this . logger ! . LogDebug ( $"Successfully retrieved the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key'." ) ;
2025-01-13 18:51:26 +00:00
return secret ;
}
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
/// <summary>
/// Try to store the API key for the given secret ID.
/// </summary>
/// <param name="secretId">The secret ID to store the API key for.</param>
/// <param name="key">The API key to store.</param>
2026-01-11 15:02:28 +00:00
/// <param name="storeType">The secret store type. Defaults to LLM_PROVIDER for backward compatibility.</param>
2025-01-13 18:51:26 +00:00
/// <returns>The store secret response.</returns>
2026-01-11 15:02:28 +00:00
public async Task < StoreSecretResponse > SetAPIKey ( ISecretId secretId , string key , SecretStoreType storeType )
2025-01-13 18:51:26 +00:00
{
2026-01-11 15:02:28 +00:00
var prefix = storeType . Prefix ( ) ;
2025-01-13 18:51:26 +00:00
var encryptedKey = await this . encryptor ! . Encrypt ( key ) ;
2026-01-11 15:02:28 +00:00
var request = new StoreSecretRequest ( $"{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key" , Environment . UserName , encryptedKey ) ;
2025-01-13 18:51:26 +00:00
var result = await this . http . PostAsJsonAsync ( "/secrets/store" , request , this . jsonRustSerializerOptions ) ;
if ( ! result . IsSuccessStatusCode )
{
2026-01-11 15:02:28 +00:00
this . logger ! . LogError ( $"Failed to store the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key' due to an API issue: '{result.StatusCode}'" ) ;
2025-05-04 12:59:30 +00:00
return new StoreSecretResponse ( false , TB ( "Failed to get the API key due to an API issue." ) ) ;
2025-01-13 18:51:26 +00:00
}
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
var state = await result . Content . ReadFromJsonAsync < StoreSecretResponse > ( this . jsonRustSerializerOptions ) ;
if ( ! state . Success )
2026-01-11 15:02:28 +00:00
this . logger ! . LogError ( $"Failed to store the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key': '{state.Issue}'" ) ;
this . logger ! . LogDebug ( $"Successfully stored the API key for '{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key'." ) ;
2025-01-13 18:51:26 +00:00
return state ;
}
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
/// <summary>
/// Tries to delete the API key for the given secret ID.
/// </summary>
/// <param name="secretId">The secret ID to delete the API key for.</param>
2026-01-11 15:02:28 +00:00
/// <param name="storeType">The secret store type. Defaults to LLM_PROVIDER for backward compatibility.</param>
2025-01-13 18:51:26 +00:00
/// <returns>The delete secret response.</returns>
2026-01-11 15:02:28 +00:00
public async Task < DeleteSecretResponse > DeleteAPIKey ( ISecretId secretId , SecretStoreType storeType )
2025-01-13 18:51:26 +00:00
{
2026-01-11 15:02:28 +00:00
var prefix = storeType . Prefix ( ) ;
var request = new SelectSecretRequest ( $"{prefix}::{secretId.SecretId}::{secretId.SecretName}::api_key" , Environment . UserName , false ) ;
2025-01-13 18:51:26 +00:00
var result = await this . http . PostAsJsonAsync ( "/secrets/delete" , request , this . jsonRustSerializerOptions ) ;
if ( ! result . IsSuccessStatusCode )
{
this . logger ! . LogError ( $"Failed to delete the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'" ) ;
2025-05-04 12:59:30 +00:00
return new DeleteSecretResponse { Success = false , WasEntryFound = false , Issue = TB ( "Failed to delete the API key due to an API issue." ) } ;
2025-01-13 18:51:26 +00:00
}
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
var state = await result . Content . ReadFromJsonAsync < DeleteSecretResponse > ( this . jsonRustSerializerOptions ) ;
if ( ! state . Success )
this . logger ! . LogError ( $"Failed to delete the API key for secret ID '{secretId.SecretId}': '{state.Issue}'" ) ;
2026-01-11 15:02:28 +00:00
2025-01-13 18:51:26 +00:00
return state ;
}
}