using Liber_Incantamentum.Domain.Entities; using Liber_Incantamentum.Domain.Filter; using Liber_Incantamentum.Domain.Repositories; using Liber_Incantamentum.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Liber_Incantamentum.Application.Exceptions; namespace Liber_Incantamentum.Infrastructure.Repositories { public class SpellRepository : ISpellRepository { private readonly AppDbContext _context; public SpellRepository(AppDbContext context) { _context = context; } public async Task AddSpellAsync(Spell entity) { await _context.Spells.AddAsync(entity); return await _context.SaveChangesAsync() > 0; } public async Task DeleteSpellAsync(Guid id) { var spell = await GetSpellByIdAsync(id); _context.Spells.Remove(spell); return await _context.SaveChangesAsync() > 0; } public async Task> GetAllSpellsAsync(SpellFilter filterEntity) { var query = _context.Spells.AsQueryable(); if (filterEntity.Id != Guid.Empty) query = query.Where(m => m.Id == filterEntity.Id); if (!string.IsNullOrEmpty(filterEntity.Name)) query = query.Where(m => EF.Functions.ILike(m.Name, filterEntity.Name)); if (!string.IsNullOrEmpty(filterEntity.Description)) query = query.Where(m => EF.Functions.ILike(m.Description, filterEntity.Description)); if (!string.IsNullOrEmpty(filterEntity.Type)) query = query.Where(m => EF.Functions.ILike(m.Type, filterEntity.Type)); if (filterEntity.CreationDate != default) query = query.Where(m => m.CreationDate == filterEntity.CreationDate); if (filterEntity.MageId != Guid.Empty) query = query.Where(m => m.MageId == filterEntity.MageId); var mages = await query.ToListAsync(); return mages; } public async Task GetSpellByIdAsync(Guid id) { var spell = await _context.Spells.FindAsync(id); if (spell == null) throw new NotFoundException($"No spell has been found with the id : {id}"); return spell; } public async Task UpdateSpellAsync(Spell entity) { var spell = await GetSpellByIdAsync(entity.Id); _context.Entry(spell).CurrentValues.SetValues(entity); if (!_context.ChangeTracker.HasChanges()) return false; return await _context.SaveChangesAsync() > 0; } } }