import { AzureService, ServiceResult } from './base-service.js';
import { CacheKeys } from '../lib/cache.js';
interface KeyVault {
name: string;
resourceGroup: string;
location: string;
vaultUri: string;
}
interface Key {
name: string;
enabled: boolean;
created: string;
updated: string;
keyType: string;
}
interface Secret {
name: string;
enabled: boolean;
created: string;
updated: string;
contentType: string;
}
export class KeyVaultService extends AzureService {
readonly serviceName = 'Key Vault';
readonly cliPrefix = 'keyvault';
async list(resourceGroup?: string): Promise<ServiceResult<KeyVault[]>> {
const cacheKey = CacheKeys.service('keyvault', 'vaults', resourceGroup ?? '');
return this.cachedExecute(cacheKey, async () => {
const opts: Record<string, string> = {};
if (resourceGroup) opts['resource-group'] = resourceGroup;
const result = await this.execute('list', opts);
return this.toResult<KeyVault[]>(result);
});
}
async getVault(vaultName: string, resourceGroup: string): Promise<ServiceResult> {
const result = await this.execute('show', {
'name': vaultName,
'resource-group': resourceGroup
});
return this.toResult(result);
}
async listKeys(vaultName: string): Promise<ServiceResult<Key[]>> {
const cacheKey = CacheKeys.service('keyvault', 'keys', vaultName);
return this.cachedExecute(cacheKey, async () => {
const result = await this.execute('key list', { 'vault-name': vaultName });
return this.toResult<Key[]>(result);
});
}
async getKey(vaultName: string, keyName: string): Promise<ServiceResult> {
const result = await this.execute('key show', {
'vault-name': vaultName,
'name': keyName
});
return this.toResult(result);
}
async createKey(vaultName: string, keyName: string, keyType: string = 'RSA'): Promise<ServiceResult> {
const result = await this.execute('key create', {
'vault-name': vaultName,
'name': keyName,
'kty': keyType
});
return this.toResult(result);
}
async listSecrets(vaultName: string): Promise<ServiceResult<Secret[]>> {
const cacheKey = CacheKeys.service('keyvault', 'secrets', vaultName);
return this.cachedExecute(cacheKey, async () => {
const result = await this.execute('secret list', { 'vault-name': vaultName });
return this.toResult<Secret[]>(result);
});
}
async getSecret(vaultName: string, secretName: string): Promise<ServiceResult> {
const result = await this.execute('secret show', {
'vault-name': vaultName,
'name': secretName
});
return this.toResult(result);
}
async listCertificates(vaultName: string): Promise<ServiceResult> {
const cacheKey = CacheKeys.service('keyvault', 'certs', vaultName);
return this.cachedExecute(cacheKey, async () => {
const result = await this.execute('certificate list', { 'vault-name': vaultName });
return this.toResult(result);
});
}
}