diff --git a/Requests/CreateTTSVoice.cs b/Requests/CreateTTSVoice.cs index 4b49813..b5da7e5 100644 --- a/Requests/CreateTTSVoice.cs +++ b/Requests/CreateTTSVoice.cs @@ -13,7 +13,7 @@ namespace HermesSocketServer.Requests private ILogger _logger; private Random _random; - public CreateTTSVoice(VoiceStore voices, ILogger logger) + public CreateTTSVoice(IStore voices, ILogger logger) { _voices = voices; _logger = logger; diff --git a/Requests/DeleteTTSVoice.cs b/Requests/DeleteTTSVoice.cs index 0142097..c18b4a5 100644 --- a/Requests/DeleteTTSVoice.cs +++ b/Requests/DeleteTTSVoice.cs @@ -12,7 +12,7 @@ namespace HermesSocketServer.Requests private IStore _voices; private ILogger _logger; - public DeleteTTSVoice(VoiceStore voices, ILogger logger) + public DeleteTTSVoice(IStore voices, ILogger logger) { _voices = voices; _logger = logger; diff --git a/Requests/GetDefaultTTSVoice.cs b/Requests/GetDefaultTTSVoice.cs index b85de29..3d61a98 100644 --- a/Requests/GetDefaultTTSVoice.cs +++ b/Requests/GetDefaultTTSVoice.cs @@ -8,11 +8,11 @@ namespace HermesSocketServer.Requests { public string Name => "get_default_tts_voice"; public string[] RequiredKeys => []; - private readonly UserStore _users; + private readonly IStore _users; private readonly ServerConfiguration _configuration; private readonly ILogger _logger; - public GetDefaultTTSVoice(UserStore users, ServerConfiguration configuration, ILogger logger) + public GetDefaultTTSVoice(IStore users, ServerConfiguration configuration, ILogger logger) { _users = users; _configuration = configuration; diff --git a/Requests/GetTTSVoices.cs b/Requests/GetTTSVoices.cs index 9763438..c6bcd83 100644 --- a/Requests/GetTTSVoices.cs +++ b/Requests/GetTTSVoices.cs @@ -9,10 +9,10 @@ namespace HermesSocketServer.Requests { public string Name => "get_tts_voices"; public string[] RequiredKeys => []; - private VoiceStore _voices; + private IStore _voices; private ILogger _logger; - public GetTTSVoices(VoiceStore voices, ILogger logger) + public GetTTSVoices(IStore voices, ILogger logger) { _voices = voices; _logger = logger; diff --git a/Requests/UpdateDefaultTTSVoice.cs b/Requests/UpdateDefaultTTSVoice.cs index 6dfc2f3..e4d58aa 100644 --- a/Requests/UpdateDefaultTTSVoice.cs +++ b/Requests/UpdateDefaultTTSVoice.cs @@ -8,10 +8,10 @@ namespace HermesSocketServer.Requests { public string Name => "update_default_tts_voice"; public string[] RequiredKeys => ["user", "voice"]; - private UserStore _users; + private IStore _users; private ILogger _logger; - public UpdateDefaultTTSVoice(UserStore users, ILogger logger) + public UpdateDefaultTTSVoice(IStore users, ILogger logger) { _users = users; _logger = logger; diff --git a/Requests/UpdateRedeemableAction.cs b/Requests/UpdateRedeemableAction.cs index 820db3a..70b560b 100644 --- a/Requests/UpdateRedeemableAction.cs +++ b/Requests/UpdateRedeemableAction.cs @@ -41,11 +41,7 @@ namespace HermesSocketServer.Requests Type = type, }; - bool result = channel.Actions.Modify(name, action => - { - action.Type = type; - action.Data = dict; - }); + bool result = channel.Actions.Modify(name, action); if (result) { _logger.Information($"Added redeemable action to channel [name: {name}][type: {type}][channel: {channel.Id}]"); diff --git a/Requests/UpdateRedemption.cs b/Requests/UpdateRedemption.cs index 77205b1..f623dff 100644 --- a/Requests/UpdateRedemption.cs +++ b/Requests/UpdateRedemption.cs @@ -1,3 +1,4 @@ +using HermesSocketLibrary.Requests.Messages; using HermesSocketServer.Models; using ILogger = Serilog.ILogger; @@ -25,16 +26,16 @@ namespace HermesSocketServer.Requests return Task.FromResult(RequestResult.Failed("Order must be an integer.")); bool state = data["state"].ToString()?.ToLower() == "true"; - bool result = channel.Redemptions.Modify(id, r => - { - if (r.UserId != channel.Id) - return; + Redemption redemption = new Redemption() { + Id = id, + UserId = channel.Id, + RedemptionId = redemptionId, + ActionName = actionName, + Order = order, + State = state, + }; - r.RedemptionId = redemptionId; - r.ActionName = actionName; - r.Order = order; - r.State = state; - }); + bool result = channel.Redemptions.Modify(id, redemption); var r = channel.Redemptions.Get(id); if (result) diff --git a/Requests/UpdateTTSFilter.cs b/Requests/UpdateTTSFilter.cs index 93af209..d1df472 100644 --- a/Requests/UpdateTTSFilter.cs +++ b/Requests/UpdateTTSFilter.cs @@ -35,12 +35,7 @@ namespace HermesSocketServer.Requests Flag = flag, }; - bool result = channel.Filters.Modify(id, f => { - f.Search = search; - f.Replace = replace; - if (flag >= 0) - f.Flag = flag; - }); + bool result = channel.Filters.Modify(id, filter); if (result) { diff --git a/Requests/UpdateTTSVoice.cs b/Requests/UpdateTTSVoice.cs index f9bce32..ed8b13b 100644 --- a/Requests/UpdateTTSVoice.cs +++ b/Requests/UpdateTTSVoice.cs @@ -12,7 +12,7 @@ namespace HermesSocketServer.Requests private IStore _voices; private ILogger _logger; - public UpdateTTSVoice(VoiceStore voices, ILogger logger) + public UpdateTTSVoice(IStore voices, ILogger logger) { _voices = voices; _logger = logger; diff --git a/Services/ChannelManager.cs b/Services/ChannelManager.cs index df71f14..1f7f676 100644 --- a/Services/ChannelManager.cs +++ b/Services/ChannelManager.cs @@ -7,14 +7,14 @@ namespace HermesSocketServer.Services { public class ChannelManager { - private readonly UserStore _users; + private readonly IStore _users; private readonly Database _database; private readonly ServerConfiguration _configuration; private readonly Serilog.ILogger _logger; private readonly IDictionary _channels; private readonly object _lock; - public ChannelManager(UserStore users, Database database, ServerConfiguration configuration, Serilog.ILogger logger) + public ChannelManager(IStore users, Database database, ServerConfiguration configuration, Serilog.ILogger logger) { _users = users; _database = database; diff --git a/Services/DatabaseService.cs b/Services/DatabaseService.cs index 39f12ee..1b6463d 100644 --- a/Services/DatabaseService.cs +++ b/Services/DatabaseService.cs @@ -1,4 +1,6 @@ using HermesSocketLibrary.db; +using HermesSocketLibrary.Requests.Messages; +using HermesSocketServer.Models; using HermesSocketServer.Store; namespace HermesSocketServer.Services @@ -6,12 +8,12 @@ namespace HermesSocketServer.Services public class DatabaseService : BackgroundService { private readonly ChannelManager _channels; - private readonly VoiceStore _voices; - private readonly UserStore _users; + private readonly IStore _voices; + private readonly IStore _users; private readonly ServerConfiguration _configuration; private readonly Serilog.ILogger _logger; - public DatabaseService(ChannelManager channels, VoiceStore voices, UserStore users, ServerConfiguration configuration, Serilog.ILogger logger) + public DatabaseService(ChannelManager channels, IStore voices, IStore users, ServerConfiguration configuration, Serilog.ILogger logger) { _channels = channels; _voices = voices; diff --git a/Socket/Handlers/HermesLoginHandler.cs b/Socket/Handlers/HermesLoginHandler.cs index 730edef..78f05c4 100644 --- a/Socket/Handlers/HermesLoginHandler.cs +++ b/Socket/Handlers/HermesLoginHandler.cs @@ -12,14 +12,14 @@ namespace HermesSocketServer.Socket.Handlers public int OperationCode { get; } = 1; private readonly ChannelManager _manager; - private readonly VoiceStore _voices; + private readonly IStore _voices; private readonly ServerConfiguration _configuration; private readonly Database _database; private readonly HermesSocketManager _sockets; private readonly ILogger _logger; private readonly object _lock; - public HermesLoginHandler(ChannelManager manager, VoiceStore voices, ServerConfiguration configuration, Database database, HermesSocketManager sockets, ILogger logger) + public HermesLoginHandler(ChannelManager manager, IStore voices, ServerConfiguration configuration, Database database, HermesSocketManager sockets, ILogger logger) { _manager = manager; _voices = voices; diff --git a/Startup.cs b/Startup.cs index 907449a..0eb66bf 100644 --- a/Startup.cs +++ b/Startup.cs @@ -17,6 +17,8 @@ using HermesSocketServer.Store; using HermesSocketServer.Services; using HermesSocketServer.Store.Internal; using Microsoft.Extensions.DependencyInjection; +using HermesSocketLibrary.Requests.Messages; +using HermesSocketServer.Models; var yamlDeserializer = new DeserializerBuilder() @@ -88,8 +90,8 @@ if (configuration.Database.Tables != null) } // Stores -s.AddSingleton(); -s.AddSingleton(); +s.AddSingleton, VoiceStore>(); +s.AddSingleton, UserStore>(); // Request handlers s.AddSingleton(); diff --git a/Store/ActionStore.cs b/Store/ActionStore.cs index 2b12b00..27352fe 100644 --- a/Store/ActionStore.cs +++ b/Store/ActionStore.cs @@ -40,10 +40,23 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, RedeemableAction value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); + ArgumentNullException.ThrowIfNull(value, nameof(value)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.Name, nameof(value.Name)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.Type, nameof(value.Type)); + ArgumentNullException.ThrowIfNull(value.Data, nameof(value.Data)); } - protected override void OnInitialModify(string key, RedeemableAction value) + protected override void OnInitialModify(string key, RedeemableAction oldValue, RedeemableAction newValue) { + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.Name, nameof(newValue.Name)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.Type, nameof(newValue.Type)); + ArgumentNullException.ThrowIfNull(newValue.Data, nameof(newValue.Data)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(oldValue.UserId)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Name, newValue.Name, nameof(oldValue.Name)); } } } \ No newline at end of file diff --git a/Store/ChatterStore.cs b/Store/ChatterStore.cs index 8a8091b..5f62150 100644 --- a/Store/ChatterStore.cs +++ b/Store/ChatterStore.cs @@ -38,10 +38,21 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, ChatterVoice value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); + ArgumentNullException.ThrowIfNull(value, nameof(value)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(value.ChatterId, nameof(value.ChatterId)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.VoiceId, nameof(value.VoiceId)); } - protected override void OnInitialModify(string key, ChatterVoice value) + protected override void OnInitialModify(string key, ChatterVoice oldValue, ChatterVoice newValue) { + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(newValue.ChatterId, nameof(newValue.ChatterId)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.VoiceId, nameof(newValue.VoiceId)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(oldValue.UserId)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.ChatterId, newValue.ChatterId, nameof(oldValue.ChatterId)); } } } \ No newline at end of file diff --git a/Store/IStore.cs b/Store/IStore.cs index 09814c0..ac75903 100644 --- a/Store/IStore.cs +++ b/Store/IStore.cs @@ -5,9 +5,10 @@ namespace HermesSocketServer.Store V? Get(K key); IDictionary Get(); Task Load(); - bool Modify(K? key, Action action); + bool Modify(K? key, Action modify); + bool Modify(K? key, V value); bool Remove(K? key); Task Save(); - bool Set(K? key, V? value); + bool Set(K? key, V value); } } \ No newline at end of file diff --git a/Store/Internal/ComplexAutoSavedStore.cs b/Store/Internal/ComplexAutoSavedStore.cs index d648fb2..03bdfd1 100644 --- a/Store/Internal/ComplexAutoSavedStore.cs +++ b/Store/Internal/ComplexAutoSavedStore.cs @@ -48,7 +48,7 @@ namespace HermesSocketServer.Store.Internal async (query, list) => await _generator.DoPreparedStatement(_database, query, list, _table.KeyColumns)); } - private async Task GenerateQuery(IList keys, Func generate, Func, IEnumerable, Task> execute) + private async Task GenerateQuery(IList keys, Func generate, Func, IEnumerable, Task> execute) { ImmutableList? list = null; lock (_lock) diff --git a/Store/Internal/GroupedSaveStore.cs b/Store/Internal/GroupedSaveStore.cs index a891b2d..50585b7 100644 --- a/Store/Internal/GroupedSaveStore.cs +++ b/Store/Internal/GroupedSaveStore.cs @@ -24,7 +24,7 @@ namespace HermesSocketServer.Store.Internal public abstract Task Load(); protected abstract void OnInitialAdd(K key, V value); - protected abstract void OnInitialModify(K key, V value); + protected abstract void OnInitialModify(K key, V value, V newValue); protected abstract void OnPostRemove(K key, V value); public abstract Task Save(); @@ -46,7 +46,28 @@ namespace HermesSocketServer.Store.Internal } } - public bool Modify(K? key, Action action) + public bool Modify(K? key, V value) + { + if (key == null) + return false; + + lock (_lock) + { + if (_store.TryGetValue(key, out V? oldValue)) + { + OnInitialModify(key, oldValue, value); + _store[key] = value; + if (!_added.Contains(key) && !_modified.Contains(key)) + { + _modified.Add(key); + } + return true; + } + } + return false; + } + + public bool Modify(K? key, Action modify) { if (key == null) return false; @@ -55,11 +76,7 @@ namespace HermesSocketServer.Store.Internal { if (_store.TryGetValue(key, out V? value)) { - if (value == null) - return false; - - OnInitialModify(key, value); - action(value); + modify(value); if (!_added.Contains(key) && !_modified.Contains(key)) { _modified.Add(key); @@ -97,9 +114,9 @@ namespace HermesSocketServer.Store.Internal return false; } - public bool Set(K? key, V? value) + public bool Set(K? key, V value) { - if (key == null || value == null) + if (key == null) return false; lock (_lock) @@ -108,7 +125,7 @@ namespace HermesSocketServer.Store.Internal { if (fetched != value) { - OnInitialModify(key, value); + OnInitialModify(key, fetched, value); _store[key] = value; if (!_added.Contains(key) && !_modified.Contains(key)) { diff --git a/Store/PolicyStore.cs b/Store/PolicyStore.cs index 28868e7..7924e34 100644 --- a/Store/PolicyStore.cs +++ b/Store/PolicyStore.cs @@ -41,10 +41,29 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, Policy value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); + ArgumentNullException.ThrowIfNull(value, nameof(value)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); + ArgumentOutOfRangeException.ThrowIfEqual(value.GroupId, default, nameof(value.GroupId)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(value.Usage, nameof(value.Usage)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(value.Usage, 99, nameof(value.Usage)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(value.Span, nameof(value.Span)); + ArgumentOutOfRangeException.ThrowIfLessThan(value.Span, 1000, nameof(value.Span)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(value.Span, 86400, nameof(value.Span)); } - protected override void OnInitialModify(string key, Policy value) + protected override void OnInitialModify(string key, Policy oldValue, Policy newValue) { + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); + ArgumentOutOfRangeException.ThrowIfEqual(newValue.GroupId, default, nameof(newValue.GroupId)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(newValue.Usage, nameof(newValue.Usage)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(newValue.Usage, 99, nameof(newValue.Usage)); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(newValue.Span, nameof(newValue.Span)); + ArgumentOutOfRangeException.ThrowIfLessThan(newValue.Span, 1000, nameof(newValue.Span)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(newValue.Span, 86400, nameof(newValue.Span)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Id, newValue.Id, nameof(oldValue.Id)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(oldValue.UserId)); } protected override void OnPostRemove(string key, Policy value) diff --git a/Store/RedemptionStore.cs b/Store/RedemptionStore.cs index 6bb1bf7..515e7d6 100644 --- a/Store/RedemptionStore.cs +++ b/Store/RedemptionStore.cs @@ -41,13 +41,32 @@ namespace HermesSocketServer.Store 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)); } - protected override void OnInitialModify(string key, Redemption value) + 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)); } - protected override void OnPostRemove(string key, Redemption value) + protected override void OnPostRemove(string key, Redemption? value) { } } diff --git a/Store/TTSFilterStore.cs b/Store/TTSFilterStore.cs index 34b1b41..8295563 100644 --- a/Store/TTSFilterStore.cs +++ b/Store/TTSFilterStore.cs @@ -1,3 +1,4 @@ +using System.Text.RegularExpressions; using HermesSocketLibrary.db; using HermesSocketLibrary.Requests.Messages; using HermesSocketServer.Store.Internal; @@ -40,10 +41,27 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, TTSWordFilter value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); + ArgumentNullException.ThrowIfNull(value, nameof(value)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.Id, nameof(value.Id)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.Search, nameof(value.Search)); + ArgumentNullException.ThrowIfNull(value.Replace, nameof(value.Replace)); + ArgumentOutOfRangeException.ThrowIfNegative(value.Flag, nameof(value.Flag)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(value.Flag, 2047, nameof(value.Flag)); } - protected override void OnInitialModify(string key, TTSWordFilter value) + protected override void OnInitialModify(string key, TTSWordFilter oldValue, TTSWordFilter newValue) { + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.Id, nameof(newValue.Id)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.Search, nameof(newValue.Search)); + ArgumentNullException.ThrowIfNull(newValue.Replace, nameof(newValue.Replace)); + ArgumentOutOfRangeException.ThrowIfNegative(newValue.Flag, nameof(newValue.Flag)); + ArgumentOutOfRangeException.ThrowIfGreaterThan(newValue.Flag, 2047, nameof(newValue.Flag)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Id, newValue.Id, nameof(oldValue.Id)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(oldValue.UserId)); } protected override void OnPostRemove(string key, TTSWordFilter value) diff --git a/Store/UserStore.cs b/Store/UserStore.cs index 787e643..fff9284 100644 --- a/Store/UserStore.cs +++ b/Store/UserStore.cs @@ -39,7 +39,7 @@ namespace HermesSocketServer.Store { } - protected override void OnInitialModify(string key, User value) + protected override void OnInitialModify(string key, User oldValue, User newValue) { } diff --git a/Store/VoiceStateStore.cs b/Store/VoiceStateStore.cs index 60855b8..394b974 100644 --- a/Store/VoiceStateStore.cs +++ b/Store/VoiceStateStore.cs @@ -41,11 +41,23 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, TTSVoiceState value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); _idValidator.Check(value.Id); + ArgumentNullException.ThrowIfNull(value, nameof(value)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.Id, nameof(value.Id)); + ArgumentException.ThrowIfNullOrWhiteSpace(value.UserId, nameof(value.UserId)); + ArgumentNullException.ThrowIfNull(value.Enabled, nameof(value.Enabled)); } - protected override void OnInitialModify(string key, TTSVoiceState value) + protected override void OnInitialModify(string key, TTSVoiceState oldValue, TTSVoiceState newValue) { + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.Id, nameof(newValue.Id)); + ArgumentException.ThrowIfNullOrWhiteSpace(newValue.UserId, nameof(newValue.UserId)); + ArgumentNullException.ThrowIfNull(newValue.Enabled, nameof(newValue.Enabled)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Id, newValue.Id, nameof(oldValue.Id)); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.UserId, newValue.UserId, nameof(oldValue.UserId)); + ArgumentOutOfRangeException.ThrowIfEqual(oldValue.Enabled, newValue.Enabled, nameof(oldValue.Enabled)); } protected override void OnPostRemove(string key, TTSVoiceState value) diff --git a/Store/VoiceStore.cs b/Store/VoiceStore.cs index c42644f..828695b 100644 --- a/Store/VoiceStore.cs +++ b/Store/VoiceStore.cs @@ -39,13 +39,19 @@ namespace HermesSocketServer.Store protected override void OnInitialAdd(string key, TTSVoice value) { + ArgumentException.ThrowIfNullOrWhiteSpace(key, nameof(key)); + ArgumentNullException.ThrowIfNull(value, nameof(value)); _idValidator.Check(value.Id); _nameValidator.Check(value.Name); } - protected override void OnInitialModify(string key, TTSVoice value) + protected override void OnInitialModify(string key, TTSVoice oldValue, TTSVoice newValue) { - _nameValidator.Check(value.Name); + ArgumentNullException.ThrowIfNull(newValue, nameof(newValue)); + _idValidator.Check(newValue.Id); + _nameValidator.Check(newValue.Name); + ArgumentOutOfRangeException.ThrowIfNotEqual(oldValue.Id, newValue.Id, nameof(oldValue.Id)); + ArgumentOutOfRangeException.ThrowIfEqual(oldValue.Name, newValue.Name, nameof(oldValue.Name)); } protected override void OnPostRemove(string key, TTSVoice value)