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 } }