using System.Threading.Tasks;
using Kruzya.TelegramBot.Core.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
namespace Kruzya.TelegramBot.Core.Extensions
{
public static class RepositoryExtension
{
#region DbContext
///
/// Marks the entity as created.
///
///
/// Entity for marking as created.
public static void MarkAsCreated(this DbContext dbContext, object entity) =>
dbContext.Entry(entity).State = EntityState.Added;
///
/// Marks the entity as deleted.
///
///
/// Entity for marking as deleted.
public static void MarkAsDeleted(this DbContext dbContext, object entity) =>
dbContext.Entry(entity).State = EntityState.Deleted;
///
/// Marks the entity as modified.
///
///
/// Entity for marking as modified.
public static void MarkAsModified(this DbContext dbContext, object entity) =>
dbContext.Entry(entity).State = EntityState.Modified;
#endregion
#region Repository
public static TEntity Create(this DbSet repository) where TEntity : class, new()
{
var entity = new TEntity();
repository.Add(entity);
return entity;
}
#endregion
#region Core-context repository extensions
#region BotUser
public static async Task FindOrCreate(this DbSet repository, long chatId, int userId)
{
var user = await repository.SingleOrDefaultAsync(e => e.ChatId == chatId && e.UserId == userId);
if (user == null)
{
user = repository.Create();
user.ChatId = chatId;
user.UserId = userId;
}
return user;
}
#endregion
#region BotUserValue
#region FindOption
public static async Task FindOption(this DbSet repository, long chatId,
string option) => await repository.FindOption(chatId, 0, option);
public static async Task FindOption(this DbSet repository, BotUser user,
string option) => await repository.FindOption(user.ChatId, user.UserId, option);
public static async Task FindOption(this DbSet repository, long chatId, int userId,
string option) => await repository.SingleOrDefaultAsync(e =>
e.BotUser.ChatId == chatId && e.BotUser.UserId == userId && e.Name == option);
#endregion
#region FindOrCreateOption
public static async Task FindOrCreateOption(this DbSet repository, long chatId,
string option) => await repository.FindOrCreateOption(chatId, 0, option);
public static async Task FindOrCreateOption(this DbSet repository, BotUser user,
string option) => await repository.FindOrCreateOption(user.ChatId, user.UserId, option);
public static async Task FindOrCreateOption(this DbSet repository, long chatId,
int userId, string option)
{
var opt = await repository.FindOption(chatId, userId, option);
if (opt == null)
{
opt = repository.Create();
opt.BotUser = await repository.GetService().Users.FindOrCreate(chatId, userId);
}
return opt;
}
#endregion
#region SetOptionValue
public static async Task SetOptionValue(this DbSet repository, long chatId, string option,
T val) => await repository.SetOptionValue(chatId, 0, option, val);
public static async Task SetOptionValue(this DbSet repository, BotUser user, string option,
T val) => await repository.SetOptionValue(user.ChatId, user.UserId, option, val);
public static async Task SetOptionValue(this DbSet repository, long chatId, int userId,
string option, T val)
{
var opt = await repository.FindOrCreateOption(chatId, userId, option);
opt.SetValue(val);
repository.Update(opt);
}
#endregion
#endregion
#endregion
}
}