Skip to content
Snippets Groups Projects
DatabaseContext.cs 2.28 KiB
using Database.Model;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;

namespace Database;

public class DatabaseContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<SourceCode> SourceCodes { get; set; }
    
    public string DbPath { get; }

    public DatabaseContext()
    {
        var folder = Environment.SpecialFolder.LocalApplicationData;
        var path = Environment.GetFolderPath(folder);
        DbPath = System.IO.Path.Join(path, "database.db");
    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder.UseSqlite($"Data Source={DbPath}");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(b => b.Name)
            .IsUnique();
    }
    
    public static void EnsureSeedData(DatabaseContext context)
    {
        context.Database.EnsureCreated(); // Ensure database is created
        if (File.Exists("default-users.json"))
        {
            var seedUsers = JsonConvert.DeserializeObject<List<SeedUser>>(File.ReadAllText("default-users.json"));

            foreach (var seedUser in seedUsers)
            {
                if (string.IsNullOrEmpty(seedUser.Password))
                    continue;

                var existingUser = context.Users.Find(seedUser.Id);

                if (existingUser != null)
                {
                    // Update existing user
                    existingUser.Name = seedUser.Name;
                    existingUser.PasswordHash = BCrypt.Net.BCrypt.HashPassword(seedUser.Password, 12);
                    // Update other properties as needed
                }
                else
                {
                    // Add new user
                    var newUser = new User
                    {
                        Id = seedUser.Id,
                        Name = seedUser.Name,
                        Token = "NOT LOGGED IN YET",
                        LastAccess = DateTime.MinValue,
                        PasswordHash = BCrypt.Net.BCrypt.HashPassword(seedUser.Password, 12)
                    };
                    context.Users.Add(newUser);
                }
            }

            context.SaveChanges(); // Save changes to the database   
        }
    }
}