using System.Reflection; using System.Security.Cryptography; using System.Text; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.Configuration; using SimpleToolkit.Extensions; using WatchIt.Database.Model.Account; using WatchIt.Database.Model.Common; using WatchIt.Database.Model.Configuration.Account; using WatchIt.Database.Model.Media; using WatchIt.Database.Model.Person; using WatchIt.Database.Model.Rating; using WatchIt.Database.Model.ViewCount; namespace WatchIt.Database; public class DatabaseContext : DbContext { #region CONSTRUCTORS public DatabaseContext() { } public DatabaseContext(DbContextOptions options) : base(options) { } #endregion #region PROPERTIES // Common public virtual DbSet Countries { get; set; } public virtual DbSet Genres { get; set; } public virtual DbSet Genders { get; set; } // Account public virtual DbSet Accounts { get; set; } public virtual DbSet AccountProfilePictures { get; set; } public virtual DbSet AccountRefreshTokens { get; set; } // Media public virtual DbSet Media { get; set; } public virtual DbSet MediaMovies { get; set; } public virtual DbSet MediaSeries { get; set; } public virtual DbSet MediaSeriesSeasons { get; set; } public virtual DbSet MediaSeriesEpisodes { get; set; } public virtual DbSet MediaPosterImages { get; set; } public virtual DbSet MediaPhotoImages { get; set; } public virtual DbSet MediaPhotoImageBackgrounds { get; set; } public virtual DbSet MediaGenres { get; set; } public virtual DbSet MediaProductionCountries { get; set; } // Person public virtual DbSet Persons { get; set; } public virtual DbSet PersonPhotoImages { get; set; } public virtual DbSet PersonActorRoles { get; set; } public virtual DbSet PersonActorRoleTypes { get; set; } public virtual DbSet PersonCreatorRoles { get; set; } public virtual DbSet PersonCreatorRoleTypes { get; set; } // Rating public virtual DbSet RatingsMedia { get; set; } public virtual DbSet RatingsPersonActorRole { get; set; } public virtual DbSet RatingsPersonCreatorRole { get; set; } public virtual DbSet RatingsMediaSeriesSeason { get; set; } public virtual DbSet RatingsMediaSeriesEpisode { get; set; } // ViewCount public virtual DbSet ViewCountsPerson { get; set; } public virtual DbSet ViewCountsMedia { get; set; } #endregion #region PROTECTED METHODS protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql("name=Default"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetAssembly(typeof(AccountConfiguration))); CreateRootUser(modelBuilder); } protected void CreateRootUser(ModelBuilder modelBuilder) { IConfigurationSection configuration = this.GetService().GetSection("RootUser"); string leftSalt = StringExtensions.CreateRandom(20); string rightSalt = StringExtensions.CreateRandom(20); byte[] hash = SHA512.HashData(Encoding.UTF8.GetBytes($"{leftSalt}{configuration["Password"]}{rightSalt}")); modelBuilder.Entity().HasData(new Account { Id = 1, Username = configuration["Username"]!, Email = configuration["Email"]!, Password = hash, LeftSalt = leftSalt, RightSalt = rightSalt, IsAdmin = true, }); } #endregion }