163 lines
4.1 KiB
C#
163 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using AudibleApi;
|
|
using AudibleApi.Authorization;
|
|
using Dinah.Core;
|
|
using Dinah.Core.IO;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace InternalUtilities
|
|
{
|
|
public class AccountsPersister : JsonFilePersister<Accounts>
|
|
{
|
|
/// <summary>Alias for Target </summary>
|
|
public Accounts Accounts => Target;
|
|
|
|
/// <summary>uses path. create file if doesn't yet exist</summary>
|
|
public AccountsPersister(Accounts target, string path, string jsonPath = null)
|
|
: base(target, path, jsonPath) { }
|
|
|
|
/// <summary>load from existing file</summary>
|
|
public AccountsPersister(string path, string jsonPath = null)
|
|
: base(path, jsonPath) { }
|
|
|
|
protected override JsonSerializerSettings GetSerializerSettings()
|
|
=> Identity.GetJsonSerializerSettings();
|
|
}
|
|
public class Accounts : Updatable
|
|
{
|
|
public event EventHandler Updated;
|
|
private void update(object sender = null, EventArgs e = null)
|
|
=> Updated?.Invoke(this, new EventArgs());
|
|
|
|
public Accounts() { }
|
|
|
|
// for some reason this will make the json instantiator use _accountsSettings_json.set()
|
|
[JsonConstructor]
|
|
protected Accounts(List<Account> accounts) { }
|
|
|
|
#region AccountsSettings
|
|
private List<Account> _accountsSettings_backing = new List<Account>();
|
|
[JsonProperty(PropertyName = "AccountsSettings")]
|
|
private List<Account> _accountsSettings_json
|
|
{
|
|
get => _accountsSettings_backing;
|
|
// 'set' is only used by json deser
|
|
set
|
|
{
|
|
_accountsSettings_backing = value;
|
|
|
|
if (_accountsSettings_backing is null)
|
|
return;
|
|
|
|
foreach (var acct in _accountsSettings_backing)
|
|
acct.Updated += update;
|
|
|
|
update();
|
|
}
|
|
}
|
|
[JsonIgnore]
|
|
public IReadOnlyList<Account> AccountsSettings => _accountsSettings_json.AsReadOnly();
|
|
#endregion
|
|
|
|
public static Accounts FromJson(string json)
|
|
=> JsonConvert.DeserializeObject<Accounts>(json, Identity.GetJsonSerializerSettings());
|
|
|
|
public string ToJson(Formatting formatting = Formatting.Indented)
|
|
=> JsonConvert.SerializeObject(this, formatting, Identity.GetJsonSerializerSettings());
|
|
|
|
public void UNITTEST_Seed(Account account)
|
|
{
|
|
_accountsSettings_backing.Add(account);
|
|
update();
|
|
}
|
|
|
|
// replace UNITTEST_Seed
|
|
|
|
// when creating Account object (get, update, insert), subscribe to it's update. including all new ones on initial load
|
|
// removing: unsubscribe
|
|
|
|
// IEnumerable<Account> GetAllAccounts
|
|
|
|
// void UpsertAccount (id, locale)
|
|
// if not exists
|
|
// create account w/null identity
|
|
// save in file
|
|
// return Account?
|
|
// return bool/enum of whether is newly created?
|
|
|
|
// how to persist edits to [Account] obj?
|
|
// account name, decryptkey, id tokens, ...
|
|
// persistence happens in [Accounts], not [Account]. an [Account] accidentally created directly shouldn't mess up expected workflow ???
|
|
}
|
|
public class Account : Updatable
|
|
{
|
|
public event EventHandler Updated;
|
|
private void update(object sender = null, EventArgs e = null)
|
|
=> Updated?.Invoke(this, new EventArgs());
|
|
|
|
// canonical. immutable. email or phone number
|
|
public string AccountId { get; }
|
|
|
|
// user-friendly, non-canonical name. mutable
|
|
private string _accountName;
|
|
public string AccountName
|
|
{
|
|
get => _accountName;
|
|
set
|
|
{
|
|
if (string.IsNullOrWhiteSpace(value))
|
|
return;
|
|
var v = value.Trim();
|
|
if (v == _accountName)
|
|
return;
|
|
_accountName = v;
|
|
update();
|
|
}
|
|
}
|
|
|
|
private string _decryptKey = "";
|
|
public string DecryptKey
|
|
{
|
|
get => _decryptKey;
|
|
set
|
|
{
|
|
var v = (value ?? "").Trim();
|
|
if (v == _decryptKey)
|
|
return;
|
|
_decryptKey = v;
|
|
update();
|
|
}
|
|
}
|
|
|
|
private Identity _identity;
|
|
public Identity IdentityTokens
|
|
{
|
|
get => _identity;
|
|
set
|
|
{
|
|
if (_identity is null && value is null)
|
|
return;
|
|
|
|
if (_identity != null)
|
|
_identity.Updated -= update;
|
|
|
|
if (value != null)
|
|
value.Updated += update;
|
|
|
|
_identity = value;
|
|
update();
|
|
}
|
|
}
|
|
|
|
[JsonIgnore]
|
|
public Locale Locale => IdentityTokens?.Locale;
|
|
|
|
public Account(string accountId)
|
|
{
|
|
ArgumentValidator.EnsureNotNullOrWhiteSpace(accountId, nameof(accountId));
|
|
AccountId = accountId.Trim();
|
|
}
|
|
}
|
|
}
|