using System.Threading.Tasks; using Kruzya.TelegramBot.Core.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Logging; namespace Kruzya.TelegramBot.Core.Extensions { public static partial class RepositoryExtension { #region BotUser public static async Task FindOrCreate(this DbSet repository, long chatId, long 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, long 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, long userId, string option) { repository.GetService>().LogCritical("FindOrCreateOption() is deprecated. " + "Please, use the new API OptionManagerService."); var opt = await repository.FindOption(chatId, userId, option); if (opt == null) { opt = repository.Create(); opt.Name = option; 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, long userId, string option, T val) { var opt = await repository.FindOrCreateOption(chatId, userId, option); opt.SetValue(val); repository.Update(opt); } #endregion #endregion } }