File: Secrets\SecretStoreResolver.cs
Web Access
Project: src\src\Aspire.Cli\Aspire.Cli.csproj (aspire)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Cli.Projects;
using Aspire.Shared.UserSecrets;
 
namespace Aspire.Cli.Secrets;
 
/// <summary>
/// Resolves the UserSecretsId for an AppHost and creates a SecretsStore.
/// </summary>
internal sealed class SecretStoreResolver(
    IProjectLocator projectLocator,
    IAppHostProjectFactory projectFactory)
{
    /// <summary>
    /// Resolves the secrets store for the given (or auto-discovered) AppHost project.
    /// </summary>
    public async Task<SecretsStoreResult?> ResolveAsync(
        FileInfo? projectFile,
        bool autoInit,
        CancellationToken cancellationToken)
    {
        var searchResult = await projectLocator.UseOrFindAppHostProjectFileAsync(
            projectFile,
            MultipleAppHostProjectsFoundBehavior.Prompt,
            createSettingsFile: false,
            cancellationToken);
 
        var appHostFile = searchResult.SelectedProjectFile;
        if (appHostFile is null)
        {
            return null;
        }
 
        var project = projectFactory.TryGetProject(appHostFile);
        if (project is null)
        {
            return null;
        }
 
        var userSecretsId = await project.GetUserSecretsIdAsync(appHostFile, autoInit, cancellationToken);
        if (string.IsNullOrEmpty(userSecretsId))
        {
            return null;
        }
 
        var secretsFilePath = UserSecretsPathHelper.GetSecretsPathFromSecretsId(userSecretsId);
        var store = new SecretsStore(secretsFilePath);
 
        return new SecretsStoreResult(store, userSecretsId, appHostFile);
    }
}
 
/// <summary>
/// Result of resolving a secrets store for an AppHost.
/// </summary>
internal sealed record SecretsStoreResult(
    SecretsStore Store,
    string UserSecretsId,
    FileInfo AppHostFile);