using LiteDB; using LehrerApp.Core.Models; namespace LehrerApp.Data; /// /// Zentrale Datenbankverbindung. Einmalig als Singleton registrieren. /// Eine Instanz = eine .db Datei = ein Nutzer. /// public class LiteDbContext : IDisposable { private readonly LiteDatabase _db; public LiteDbContext(string databasePath) { // WAL-Modus für bessere Performance bei Concurrent Reads var connectionString = new ConnectionString(databasePath) { Connection = ConnectionType.Shared, }; _db = new LiteDatabase(connectionString); EnsureIndexes(); } // ── Collections ────────────────────────────────────────────────────────── public ILiteCollection Students => _db.GetCollection("students"); public ILiteCollection Groups => _db.GetCollection("groups"); public ILiteCollection Enrollments => _db.GetCollection("enrollments"); public ILiteCollection Exams => _db.GetCollection("exams"); public ILiteCollection ExamResults => _db.GetCollection("exam_results"); public ILiteCollection Grades => _db.GetCollection("grades"); public ILiteCollection Units => _db.GetCollection("units"); public ILiteCollection Lessons => _db.GetCollection("lessons"); public ILiteCollection Documentation => _db.GetCollection("documentation"); public ILiteCollection Tasks => _db.GetCollection("tasks"); public ILiteCollection TimeEntries => _db.GetCollection("time_entries"); // ── Transaktionen ───────────────────────────────────────────────────────── public T Transaction(Func action) => _db.BeginTrans() ? action() : action(); public void Checkpoint() => _db.Checkpoint(); // ── Backup ─────────────────────────────────────────────────────────────── public void BackupTo(string targetPath) { _db.Checkpoint(); File.Copy(_db.UserVersion.ToString(), targetPath, overwrite: true); } // ── Indizes ────────────────────────────────────────────────────────────── private void EnsureIndexes() { Students.EnsureIndex(x => x.LastName); Students.EnsureIndex(x => x.IsActive); Groups.EnsureIndex(x => x.SchoolYear); Groups.EnsureIndex(x => x.Type); Enrollments.EnsureIndex(x => x.StudentId); Enrollments.EnsureIndex(x => x.GroupId); Enrollments.EnsureIndex(x => x.SchoolYear); Exams.EnsureIndex(x => x.GroupId); Exams.EnsureIndex(x => x.Date); Exams.EnsureIndex(x => x.Status); ExamResults.EnsureIndex(x => x.ExamId); ExamResults.EnsureIndex(x => x.StudentId); Grades.EnsureIndex(x => x.StudentId); Grades.EnsureIndex(x => x.GroupId); Units.EnsureIndex(x => x.GroupId); Units.EnsureIndex(x => x.Status); Lessons.EnsureIndex(x => x.UnitId); Lessons.EnsureIndex(x => x.GroupId); Lessons.EnsureIndex(x => x.Date); Documentation.EnsureIndex(x => x.StudentId); Documentation.EnsureIndex(x => x.Type); Tasks.EnsureIndex(x => x.Status); Tasks.EnsureIndex(x => x.DueDate); TimeEntries.EnsureIndex(x => x.Date); TimeEntries.EnsureIndex(x => x.TaskId); } public void Dispose() => _db.Dispose(); }