btcpayserver/BTCPayServer/Services/SettingsRepository.cs

84 lines
2.7 KiB
C#
Raw Normal View History

2021-03-06 13:36:36 +09:00
#nullable enable
using System.Threading;
2017-09-27 14:18:09 +09:00
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Contracts;
2020-06-28 17:55:27 +09:00
using BTCPayServer.Data;
using BTCPayServer.Events;
2017-09-27 14:18:09 +09:00
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
namespace BTCPayServer.Services
{
public class SettingsRepository : ISettingsRepository
{
private readonly ApplicationDbContextFactory _ContextFactory;
private readonly EventAggregator _EventAggregator;
public SettingsRepository(ApplicationDbContextFactory contextFactory, EventAggregator eventAggregator)
{
_ContextFactory = contextFactory;
_EventAggregator = eventAggregator;
}
2017-09-27 14:18:09 +09:00
2021-03-06 13:36:36 +09:00
public async Task<T?> GetSettingAsync<T>(string? name = null) where T : class
{
2021-03-06 13:36:36 +09:00
name ??= typeof(T).FullName ?? string.Empty;
using (var ctx = _ContextFactory.CreateContext())
{
var data = await ctx.Settings.Where(s => s.Id == name).FirstOrDefaultAsync();
if (data == null)
return default(T);
return Deserialize<T>(data.Value);
}
}
2021-03-06 13:36:36 +09:00
public async Task UpdateSetting<T>(T obj, string? name = null) where T : class
{
using (var ctx = _ContextFactory.CreateContext())
{
var settings = UpdateSettingInContext<T>(ctx, obj, name);
try
{
await ctx.SaveChangesAsync();
}
catch (DbUpdateException)
{
ctx.Entry(settings).State = EntityState.Added;
await ctx.SaveChangesAsync();
}
}
_EventAggregator.Publish(new SettingsChanged<T>()
{
Settings = obj
});
}
2021-03-06 13:36:36 +09:00
public SettingData UpdateSettingInContext<T>(ApplicationDbContext ctx, T obj, string? name = null) where T : class
{
2021-03-06 13:36:36 +09:00
name ??= obj.GetType().FullName ?? string.Empty;
var settings = new SettingData();
settings.Id = name;
settings.Value = Serialize(obj);
ctx.Attach(settings);
ctx.Entry(settings).State = EntityState.Modified;
return settings;
}
2017-09-27 14:18:09 +09:00
private T Deserialize<T>(string value)
{
return JsonConvert.DeserializeObject<T>(value);
}
2017-09-27 14:18:09 +09:00
private string Serialize<T>(T obj)
{
return JsonConvert.SerializeObject(obj);
}
2020-06-28 17:55:27 +09:00
2021-03-06 13:36:36 +09:00
public async Task<T> WaitSettingsChanged<T>(CancellationToken cancellationToken = default) where T : class
{
return (await _EventAggregator.WaitNext<SettingsChanged<T>>(cancellationToken)).Settings;
}
}
2017-09-27 14:18:09 +09:00
}