using Contracts.DTO; using Contracts.Repositories; using Contracts.SearchModels; using Infrastructure.Support.Mappers; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Repositories; public class SpendingGroupRepo : ISpendingGroupRepo { public readonly IDbContextFactory _factory; public SpendingGroupRepo(IDbContextFactory factory) { _factory = factory; } public async Task Create(SpendingGroupDto spendingGroup) { using var context = _factory.CreateDbContext(); var createdGroup = await context.SpendingGroups.AddAsync(spendingGroup.ToModel()); await context.SaveChangesAsync(); return createdGroup.Entity.ToDto(); } public async Task Delete(SpendingGroupSearch search) { using var context = _factory.CreateDbContext(); var group = await context.SpendingGroups .FirstOrDefaultAsync(x => x.Id == search.Id || x.Name == search.Name); if (group == null) { return null; } context.SpendingGroups.Remove(group); await context.SaveChangesAsync(); return group.ToDto(); } public async Task Get(SpendingGroupSearch search) { using var context = _factory.CreateDbContext(); var group = await context.SpendingGroups .FirstOrDefaultAsync(x => x.Id == search.Id || x.Name == search.Name); return group?.ToDto(); } public async Task> GetList(SpendingGroupSearch? search = null) { using var context = _factory.CreateDbContext(); var query = context.SpendingGroups.AsQueryable(); if (search != null) { if (search.Id != null) { query = query.Where(x => x.Id == search.Id); } if (!string.IsNullOrWhiteSpace(search.Name)) { query = query.Where(x => x.Name.Contains(search.Name, StringComparison.OrdinalIgnoreCase)); } } return await query.Select(x => x.ToDto()).ToListAsync(); } public async Task Update(SpendingGroupDto spendingGroup) { using var context = _factory.CreateDbContext(); var existingGroup = await context.SpendingGroups .FirstOrDefaultAsync(x => x.Id == spendingGroup.Id); if (existingGroup == null) { return null; } existingGroup.Name = spendingGroup.Name; context.SpendingGroups.Update(existingGroup); await context.SaveChangesAsync(); return existingGroup.ToDto(); } }