using HermesSocketLibrary.db; using HermesSocketLibrary.Requests.Messages; using HermesSocketServer.Store.Internal; namespace HermesSocketServer.Store { public class RedemptionStore : AutoSavedStore { private readonly string _userId; private readonly IStore _actions; private readonly Database _database; private readonly Serilog.ILogger _logger; public RedemptionStore(string userId, DatabaseTable table, IStore actions, Database database, Serilog.ILogger logger) : base(table, database, logger) { _userId = userId; _actions = actions; _database = database; _logger = logger; } public override async Task Load() { var data = new Dictionary() { { "user", _userId } }; string sql = $"SELECT id, \"redemptionId\", \"order\", \"state\", \"actionName\" FROM \"Redemption\" WHERE \"userId\" = @user"; await _database.Execute(sql, data, (reader) => { var id = reader.GetGuid(0); _store.Add(id.ToString(), new Redemption() { Id = id.ToString(), UserId = _userId, RedemptionId = reader.GetString(1), Order = reader.GetInt32(2), State = reader.GetBoolean(3), ActionName = reader.GetString(4), }); }); _logger.Information($"Loaded {_store.Count} redemptions from database."); } protected override void OnInitialAdd(string key, Redemption value) { ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); ArgumentNullException.ThrowIfNull(value, nameof(value)); ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); ArgumentException.ThrowIfNullOrWhiteSpace(value.RedemptionId, nameof(value.RedemptionId)); ArgumentException.ThrowIfNullOrWhiteSpace(value.ActionName, nameof(value.ActionName)); ArgumentNullException.ThrowIfNull(value.State, nameof(value.State)); ArgumentNullException.ThrowIfNull(value.Order, nameof(value.Order)); ArgumentOutOfRangeException.ThrowIfNegative(value.Order, nameof(value.Order)); ArgumentOutOfRangeException.ThrowIfGreaterThan(value.Order, 99, nameof(value.Order)); if (_actions.Get(value.ActionName) == null) throw new ArgumentException("The action name does not exist."); } protected override void OnInitialModify(string key, Redemption oldValue, Redemption newValue) { ArgumentNullException.ThrowIfNull(newValue); ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); ArgumentException.ThrowIfNullOrWhiteSpace(newValue.RedemptionId, nameof(newValue.RedemptionId)); ArgumentException.ThrowIfNullOrWhiteSpace(newValue.ActionName, nameof(newValue.ActionName)); ArgumentNullException.ThrowIfNull(newValue.State, nameof(newValue.State)); ArgumentNullException.ThrowIfNull(newValue.Order, nameof(newValue.Order)); ArgumentOutOfRangeException.ThrowIfNegative(newValue.Order, nameof(newValue.Order)); ArgumentOutOfRangeException.ThrowIfGreaterThan(newValue.Order, 99, nameof(newValue.Order)); ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Id, newValue.Id, nameof(newValue.Id)); ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(newValue.UserId)); if (oldValue.ActionName != newValue.ActionName && _actions.Get(newValue.ActionName) == null) throw new ArgumentException("The action name does not exist."); } protected override void OnPostRemove(string key, Redemption? value) { } } }