using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using CompatApiClient; using Microsoft.EntityFrameworkCore; namespace CompatBot.Database { internal class BotDb: DbContext { private static readonly Lazy instance = new Lazy(() => new BotDb()); public static BotDb Instance => instance.Value; public DbSet Moderator { get; set; } public DbSet Piracystring { get; set; } public DbSet Warning { get; set; } public DbSet Explanation { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=bot.db"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //configure indices modelBuilder.Entity().HasIndex(m => m.DiscordId).IsUnique().HasName("moderator_discord_id"); modelBuilder.Entity().HasIndex(ps => ps.String).IsUnique().HasName("piracystring_string"); modelBuilder.Entity().HasIndex(w => w.DiscordId).HasName("warning_discord_id"); modelBuilder.Entity().HasIndex(e => e.Keyword).IsUnique().HasName("explanation_keyword"); //configure default policy of Id being the primary key modelBuilder.ConfigureDefaultPkConvention(); //configure name conversion for all configured entities from CamelCase to snake_case modelBuilder.ConfigureMapping(NamingStyles.Underscore); } } internal class Moderator { public int Id { get; set; } public ulong DiscordId { get; set; } public bool Sudoer { get; set; } } internal class Piracystring { public int Id { get; set; } [Required, Column(TypeName = "varchar(255)")] public string String { get; set; } } internal class Warning { public int Id { get; set; } public ulong DiscordId { get; set; } public ulong IssuerId { get; set; } [Required] public string Reason { get; set; } [Required] public string FullReason { get; set; } public long? Timestamp { get; set; } } internal class Explanation { public int Id { get; set; } [Required] public string Keyword { get; set; } [Required] public string Text { get; set; } } }