using AudibleApi.Authorization;
namespace AudibleUtilities;
///
/// Alignment and conversion helpers for identity tokens in AccountsSettings.json.
/// Preference changes alone do not convert; conversion is explicit via .
///
public static class AccountTokenStorage
{
///
/// Compare persisted encryption metadata for all account identities to .
///
public static TokenStorageAlignment GetAccountsAlignment(TokenStorageMethod method, string? accountsSettingsFile = null)
{
var path = accountsSettingsFile ?? AudibleApiStorage.AccountsSettingsFile;
if (!File.Exists(path))
return TokenStorageAlignment.NoApplicableTokens;
using var persister = new AccountsSettingsPersister(path);
var alignments = new List();
foreach (var account in persister.AccountsSettings.Accounts)
{
if (account.IdentityTokens is null)
continue;
alignments.Add(IdentityTokenConversion.GetAlignment(account.IdentityTokens, method));
}
return CombineAlignments(alignments);
}
///
/// Convert every identity in the accounts settings file to .
/// All-or-nothing: failure leaves the original file unchanged.
///
public static IdentityTokenConversionResult ConvertAllAccounts(TokenStorageMethod method, string? accountsSettingsFile = null)
{
var path = accountsSettingsFile ?? AudibleApiStorage.AccountsSettingsFile;
return IdentityTokenConversion.ConvertAllIdentitiesInFile(path, method);
}
private static TokenStorageAlignment CombineAlignments(IReadOnlyList alignments)
{
if (alignments.Count == 0)
return TokenStorageAlignment.NoApplicableTokens;
if (alignments.Any(a => a == TokenStorageAlignment.Indeterminate))
return TokenStorageAlignment.Indeterminate;
if (alignments.All(a => a is TokenStorageAlignment.AllMatch or TokenStorageAlignment.NoApplicableTokens))
{
return alignments.Any(a => a == TokenStorageAlignment.AllMatch)
? TokenStorageAlignment.AllMatch
: TokenStorageAlignment.NoApplicableTokens;
}
return TokenStorageAlignment.SomeMismatch;
}
}