using Contracts.DTO; using Contracts.Repositories; using Contracts.SearchModels; using Infrastructure.Support.Mappers; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Repositories; public class ChangeRecordRepo : IChangeRecordRepo { public readonly IDbContextFactory _factory; public ChangeRecordRepo(IDbContextFactory factory) { _factory = factory; } public async Task Create(ChangeRecordDto changeRecord) { using var context = _factory.CreateDbContext(); var createdRecord = await context.ChangeRecords.AddAsync(changeRecord.ToModel()); await context.SaveChangesAsync(); return createdRecord.Entity.ToDto(); } public async Task Delete(ChangeRecordSearch search) { using var context = _factory.CreateDbContext(); var record = await context.ChangeRecords .FirstOrDefaultAsync(x => x.Id == search.Id); if (record == null) { return null; } context.ChangeRecords.Remove(record); await context.SaveChangesAsync(); return record.ToDto(); } public async Task Get(ChangeRecordSearch search) { using var context = _factory.CreateDbContext(); var record = await context.ChangeRecords .FirstOrDefaultAsync(x => x.Id == search.Id); if (record == null) { return null; } return record.ToDto(); } public async Task> GetList(ChangeRecordSearch? search = null) { using var context = _factory.CreateDbContext(); var query = context.ChangeRecords.AsQueryable(); if (search != null) { if (search.SpendingGroupId.HasValue) { query = query.Where(x => x.SpendingGroupId == search.SpendingGroupId); } if (search.From.HasValue && search.To.HasValue) { query = query.Where(x => x.ChangedAt >= search.From && x.ChangedAt <= search.To); } } return await query.Select(x => x.ToDto()).ToListAsync(); } public async Task Update(ChangeRecordDto changeRecord) { using var context = _factory.CreateDbContext(); var existingRecord = await context.ChangeRecords .FirstOrDefaultAsync(x => x.Id == changeRecord.Id); if (existingRecord == null) { return null; } existingRecord.Update(changeRecord); context.ChangeRecords.Update(existingRecord); await context.SaveChangesAsync(); return existingRecord.ToDto(); } }