using HopFrame.Core.Repositories; using Microsoft.EntityFrameworkCore; using SpotiParty.Web.Models; namespace SpotiParty.Web.Services; public class EventsDashboardRepo(DatabaseContext context, DashboardAuthHandler handler, IDbContextFactory factory) : IHopFrameRepository { public bool ShowAllEvents { get; set; } = false; public async Task> LoadPage(int page, int perPage) { var user = await handler.GetCurrentUser(); if (user is null) return []; IQueryable baseQuery = context.Events .Include(e => e.Host) .OrderBy(e => e.Id); if (!ShowAllEvents) { baseQuery = baseQuery.Where(e => e.Host.UserId == user.UserId); } return await baseQuery .Skip(page * perPage) .Take(perPage) .ToListAsync(); } public async Task> Search(string searchTerm, int page, int perPage) { var user = await handler.GetCurrentUser(); if (user is null) return new(Enumerable.Empty(), 0); IQueryable baseQuery = context.Events .Include(e => e.Host) .OrderBy(e => e.Id); if (!ShowAllEvents) { baseQuery = baseQuery.Where(e => e.Host.UserId == user.UserId); } baseQuery = baseQuery .Where(e => e.Name.ToLower().Contains(searchTerm.ToLower())); var totalEntries = await baseQuery.CountAsync(); var entries = await baseQuery .Skip(page * perPage) .Take(perPage) .ToListAsync(); return new(entries, (int)Math.Ceiling(totalEntries / (double)perPage)); } public async Task GetTotalPageCount(int perPage) { double count = await context.Events.CountAsync(); return Convert.ToInt32(Math.Ceiling(count / perPage)); } public async Task CreateItem(Event item) { await using var tempContext = await factory.CreateDbContextAsync(); var creator = await handler.GetCurrentUser(); tempContext.Attach(creator!); item.Host = creator!; await tempContext.Events.AddAsync(item); await tempContext.SaveChangesAsync(); } public async Task EditItem(Event item) { context.Events.Update(item); await context.SaveChangesAsync(); } public async Task DeleteItem(Event item) { context.Events.Remove(item); await context.SaveChangesAsync(); } public async Task GetOne(Guid key) { return await context.Events.FindAsync(key); } }