|
14 | 14 | namespace RestApia.Extensions.ValuesProvider.AzureKeyVault;
|
15 | 15 |
|
16 | 16 | [SuppressMessage("Performance", "CA1822:Mark members as static")]
|
17 |
| -public class KeyVaultValuesProvider: IUserValuesProvider |
| 17 | +public class KeyVaultValuesProvider : IUserValuesProvider |
18 | 18 | {
|
19 | 19 | private const string ValuesLoadedDateKey = "ValuesLoadedDate";
|
20 | 20 |
|
21 |
| - private readonly ILogger _logger; |
22 |
| - private readonly IExtensionDialogs _dialogs; |
23 |
| - |
24 |
| - public KeyVaultValuesProvider(ILogger logger, IExtensionDialogs dialogs) |
25 |
| - { |
26 |
| - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
27 |
| - _dialogs = dialogs ?? throw new ArgumentNullException(nameof(dialogs)); |
28 |
| - } |
29 |
| - |
30 |
| - public ValuesProviderSettings GetProviderSettings() => new () |
| 21 | + private static readonly ValuesProviderSettings Settings = new () |
31 | 22 | {
|
32 | 23 | Title = "Azure KeyVault Secrets",
|
33 | 24 | DefaultName = "Azure Secrets",
|
34 | 25 | CanBeReloaded = true,
|
35 | 26 | HelpPageUrl = "https://github.com/RestApia/RestApia.Shared/tree/main/src/Extensions/RestApia.Extensions.ValuesProvider.AzureKeyVault",
|
36 | 27 | ReservedValues =
|
37 | 28 | [
|
38 |
| - new () { Name = "KeyVaultUrl", Description = "KeyVault URL", IsRequired = true }, |
| 29 | + new () { Name = nameof(KeyVaultSettings.KeyVaultUrl), Description = "KeyVault URL", IsRequired = true, Placeholder = "https://my-keyvault.vault.azure.net" }, |
39 | 30 | ],
|
40 | 31 | };
|
41 | 32 |
|
42 |
| - // public async Task<IReadOnlyCollection<ExtensionValueModel>> GetInjectionAsync(Guid settingsId, IReadOnlyCollection<ExtensionValueModel> userValues, bool forceReload) |
43 |
| - // { |
44 |
| - // var stored = _storage.GetValues(settingsId); |
45 |
| - // |
46 |
| - // // let's see if values are already loaded |
47 |
| - // if (stored.Any(x => x.Name.Equals(ValuesLoadedDateKey, StringComparison.Ordinal) && x.Type == ValueTypeEnum.Other)) |
48 |
| - // return stored; |
49 |
| - // |
50 |
| - // stored = await GetRemoteValuesAsync(userValues); |
51 |
| - // _storage.SetValues(stored, settingsId); |
52 |
| - // |
53 |
| - // return stored; |
54 |
| - // } |
| 33 | + private readonly ILogger _logger; |
| 34 | + private readonly IExtensionDialogs _dialogs; |
55 | 35 |
|
56 |
| - public async Task<ReloadValuesResults> ReloadValuesAsync(IReadOnlyCollection<ValueModel> inputValues, ValuesReloadMode mode) |
| 36 | + public KeyVaultValuesProvider(ILogger logger, IExtensionDialogs dialogs) |
57 | 37 | {
|
58 |
| - var validInputs = inputValues.All(x => x.Value.Parts.All(y => !y.IsTemplatedVariable)); |
59 |
| - if (!validInputs) return ReloadValuesResults.Failed; |
60 |
| - |
61 |
| - return new ReloadValuesResults |
62 |
| - { Values = await GetRemoteValuesAsync(inputValues), Status = ValueReloadResultType.Success }; |
| 38 | + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
| 39 | + _dialogs = dialogs ?? throw new ArgumentNullException(nameof(dialogs)); |
63 | 40 | }
|
64 | 41 |
|
65 |
| - private async Task<IReadOnlyCollection<ValueModel>> GetRemoteValuesAsync(IReadOnlyCollection<ValueModel> userValues) |
| 42 | + public ValuesProviderSettings GetProviderSettings() => Settings; |
| 43 | + |
| 44 | + public async Task<ReloadValuesResults> ReloadValuesAsync(IReadOnlyCollection<ValueModel> inputValues, ValuesReloadMode mode) |
66 | 45 | {
|
67 |
| - if (VariablesConverter.TryDeserialize(userValues, out KeyVaultSettings settings) is FalseResult error) |
| 46 | + // all templated values must be replaced |
| 47 | + var hasUnresolvedValues = inputValues.All(x => x.Value.Parts.All(y => !y.IsTemplatedVariable)); |
| 48 | + if (!hasUnresolvedValues) return ReloadValuesResults.Failed; |
| 49 | + |
| 50 | + // validate settings |
| 51 | + if (!Settings.ValidateReserved(inputValues, out var errors)) |
68 | 52 | {
|
69 |
| - _dialogs.ShowError(error.Message ?? "Cannot read KeyVault settings."); |
70 |
| - return []; |
| 53 | + var resultError = errors.Count == 1 |
| 54 | + ? errors.ElementAt(0) |
| 55 | + : errors.Select(x => $"- {x}").JoinString("\r\n"); |
| 56 | + return ReloadValuesResults.FailedWithMessage(resultError); |
71 | 57 | }
|
72 | 58 |
|
73 |
| - if (settings.KeyVaultUrl.IsEmpty() || !Uri.TryCreate(settings.KeyVaultUrl, UriKind.Absolute, out var keyVaultUrl)) |
| 59 | + // try to deserialize settings |
| 60 | + if (!VariablesConverter.TryDeserialize<KeyVaultSettings>(inputValues, out var settings)) |
| 61 | + return ReloadValuesResults.Failed; |
| 62 | + |
| 63 | + return new ReloadValuesResults |
| 64 | + { Values = await GetRemoteValuesAsync(settings), Status = ValueReloadResultType.Success }; |
| 65 | + } |
| 66 | + |
| 67 | + private async Task<IReadOnlyCollection<ValueModel>> GetRemoteValuesAsync(KeyVaultSettings settings) |
| 68 | + { |
| 69 | + if (!Uri.TryCreate(settings.KeyVaultUrl, UriKind.Absolute, out var keyVaultUrl)) |
74 | 70 | {
|
75 | 71 | _dialogs.ShowError("Cannot read KeyVault secret values. KeyVault URL is not valid.");
|
76 | 72 | return [];
|
|
0 commit comments