using Microsoft.EntityFrameworkCore; using System.Linq; using System.Collections.Generic; using Oqtane.Modules; namespace SZUAbsolventenverein.Module.HallOfFame.Repository { public interface IHallOfFameRepository { IEnumerable GetHallOfFames(int ModuleId); Models.HallOfFame GetHallOfFame(int HallOfFameId); Models.HallOfFame GetHallOfFame(int HallOfFameId, bool tracking); Models.HallOfFame AddHallOfFame(Models.HallOfFame HallOfFame); Models.HallOfFame UpdateHallOfFame(Models.HallOfFame HallOfFame); void DeleteHallOfFame(int HallOfFameId); IEnumerable GetHallOfFameReports(int HallOfFameId); Models.HallOfFameReport GetHallOfFameReport(int HallOfFameReportId); Models.HallOfFameReport AddHallOfFameReport(Models.HallOfFameReport HallOfFameReport); void DeleteHallOfFameReport(int HallOfFameReportId); } public class HallOfFameRepository : IHallOfFameRepository, ITransientService { private readonly IDbContextFactory _factory; public HallOfFameRepository(IDbContextFactory factory) { _factory = factory; } public IEnumerable GetHallOfFames(int ModuleId) { using var db = _factory.CreateDbContext(); var items = db.HallOfFame.Where(item => item.ModuleId == ModuleId) .OrderByDescending(item => item.CreatedOn) .ToList(); foreach (var item in items) { item.Description = item.Description?.Replace("\t", " "); } return items; } public Models.HallOfFame GetHallOfFame(int HallOfFameId) { return GetHallOfFame(HallOfFameId, true); } public Models.HallOfFame GetHallOfFame(int HallOfFameId, bool tracking) { using var db = _factory.CreateDbContext(); Models.HallOfFame item; if (tracking) { item = db.HallOfFame.Find(HallOfFameId); } else { item = db.HallOfFame.AsNoTracking().FirstOrDefault(i => i.HallOfFameId == HallOfFameId); } if (item != null) { item.Description = item.Description?.Replace("\t", " "); } return item; } public Models.HallOfFame AddHallOfFame(Models.HallOfFame HallOfFame) { using var db = _factory.CreateDbContext(); HallOfFame.Description = HallOfFame.Description?.Replace("\t", " "); db.HallOfFame.Add(HallOfFame); db.SaveChanges(); return HallOfFame; } public Models.HallOfFame UpdateHallOfFame(Models.HallOfFame HallOfFame) { using var db = _factory.CreateDbContext(); HallOfFame.Description = HallOfFame.Description?.Replace("\t", " "); db.Entry(HallOfFame).State = EntityState.Modified; db.SaveChanges(); return HallOfFame; } public void DeleteHallOfFame(int HallOfFameId) { // First transaction: Delete all associated reports using (var db = _factory.CreateDbContext()) { var reports = db.HallOfFameReport.Where(item => item.HallOfFameId == HallOfFameId).ToList(); if (reports.Any()) { db.HallOfFameReport.RemoveRange(reports); db.SaveChanges(); } } // Second transaction: Delete the HallOfFame entry itself using (var db = _factory.CreateDbContext()) { var hallOfFame = db.HallOfFame.Find(HallOfFameId); if (hallOfFame != null) { db.HallOfFame.Remove(hallOfFame); db.SaveChanges(); } } } public IEnumerable GetHallOfFameReports(int HallOfFameId) { using var db = _factory.CreateDbContext(); return db.HallOfFameReport.Where(item => item.HallOfFameId == HallOfFameId) .OrderByDescending(item => item.CreatedOn) .ToList(); } public Models.HallOfFameReport GetHallOfFameReport(int HallOfFameReportId) { using var db = _factory.CreateDbContext(); return db.HallOfFameReport.Find(HallOfFameReportId); } public Models.HallOfFameReport AddHallOfFameReport(Models.HallOfFameReport HallOfFameReport) { using var db = _factory.CreateDbContext(); db.HallOfFameReport.Add(HallOfFameReport); db.SaveChanges(); return HallOfFameReport; } public void DeleteHallOfFameReport(int HallOfFameReportId) { using var db = _factory.CreateDbContext(); // Clear any tracked entities to avoid conflicts db.ChangeTracker.Clear(); Models.HallOfFameReport HallOfFameReport = db.HallOfFameReport.Find(HallOfFameReportId); if (HallOfFameReport != null) { db.HallOfFameReport.Remove(HallOfFameReport); db.SaveChanges(); } } } }