Files
telegram-bot/Core/Option/CoreContextStorageService.cs
2023-01-05 08:01:18 +03:00

52 lines
1.4 KiB
C#

#nullable enable
using System.Linq;
using System.Threading.Tasks;
using Kruzya.TelegramBot.Core.Data;
using Kruzya.TelegramBot.Core.Extensions;
using Microsoft.EntityFrameworkCore;
namespace Kruzya.TelegramBot.Core.Option;
public class CoreContextStorageService : IOptionStorageAdapter
{
private CoreContext _db;
public CoreContextStorageService(CoreContext db)
{
_db = db;
}
public async Task<byte[]?> LoadValueAsync(IOptionKey key)
{
var entity = await BuildQueryForKey(key).FirstOrDefaultAsync();
return entity?.Value;
}
public async Task SaveValueAsync(IOptionKey key, byte[] value)
{
var entity = await BuildQueryForKey(key).FirstOrDefaultAsync();
if (entity == null)
{
entity = await CreateEntity(key);
}
entity.Value = value;
_db.AddOrUpdate(entity);
}
private IQueryable<BotUserValue> BuildQueryForKey(IOptionKey key)
{
var legacyUserId = key.UserId ?? 0;
return _db.UserValues.Where(e => e.BotUser.ChatId == key.ChatId && e.BotUser.UserId == legacyUserId
&& e.Name == key.Identifier);
}
private async Task<BotUserValue> CreateEntity(IOptionKey key)
{
var entity = _db.UserValues.Create()!;
entity.BotUser = await _db.Users.FindOrCreate(key.ChatId, key.UserId ?? 0);
return entity;
}
}