From f94d4ed246e696096acf209abbffd114659fa9eb Mon Sep 17 00:00:00 2001 From: mfnefd Date: Tue, 26 Nov 2024 22:11:17 +0400 Subject: [PATCH] =?UTF-8?q?add:=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81,=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD=D1=81?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/Contracts/DTOs/ChangeRecordDto.cs | 2 +- back/Infrastructure/DatabaseContext.cs | 1 + back/Infrastructure/Models/Changerecord.cs | 24 +++++ .../Repositories/ChangeRecordRepo.cs | 94 +++++++++++++++++++ .../Support/Mappers/ChangeRecordMapper.cs | 27 ++++++ back/Services/Domain/ChangeRecordService.cs | 52 ++++++++++ 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 back/Infrastructure/Models/Changerecord.cs create mode 100644 back/Infrastructure/Repositories/ChangeRecordRepo.cs create mode 100644 back/Infrastructure/Support/Mappers/ChangeRecordMapper.cs create mode 100644 back/Services/Domain/ChangeRecordService.cs diff --git a/back/Contracts/DTOs/ChangeRecordDto.cs b/back/Contracts/DTOs/ChangeRecordDto.cs index 9950fb9..f95da9c 100644 --- a/back/Contracts/DTOs/ChangeRecordDto.cs +++ b/back/Contracts/DTOs/ChangeRecordDto.cs @@ -1,6 +1,6 @@ namespace Contracts.DTO; -public interface ChangeRecordDto +public class ChangeRecordDto { public Guid Id { get; set; } public Guid UserId { get; set; } diff --git a/back/Infrastructure/DatabaseContext.cs b/back/Infrastructure/DatabaseContext.cs index 6901ea8..02afad7 100644 --- a/back/Infrastructure/DatabaseContext.cs +++ b/back/Infrastructure/DatabaseContext.cs @@ -13,4 +13,5 @@ public class DatabaseContext : DbContext public DbSet Users { get; set; } = null!; public DbSet SpendingGroups { get; set; } = null!; + public DbSet ChangeRecords { get; set; } = null!; } \ No newline at end of file diff --git a/back/Infrastructure/Models/Changerecord.cs b/back/Infrastructure/Models/Changerecord.cs new file mode 100644 index 0000000..4f9a5e9 --- /dev/null +++ b/back/Infrastructure/Models/Changerecord.cs @@ -0,0 +1,24 @@ +using Contracts.DTO; + +namespace Infrastructure.Models; + +public class ChangeRecord +{ + public Guid Id { get; set; } + public decimal Sum { get; set; } + public DateTime ChangedAt { get; set; } + + public Guid UserId { get; set; } + public User User { get; set; } = null!; + + public Guid SpendingGroupId { get; set; } + public SpendingGroup SpendingGroup { get; set; } = null!; + + public void Update(ChangeRecordDto changeRecordDto) + { + Id = changeRecordDto.Id; + Sum = changeRecordDto.Sum; + ChangedAt = changeRecordDto.ChangedAt; + SpendingGroupId = changeRecordDto.SpendingGroupId; + } +} \ No newline at end of file diff --git a/back/Infrastructure/Repositories/ChangeRecordRepo.cs b/back/Infrastructure/Repositories/ChangeRecordRepo.cs new file mode 100644 index 0000000..cafeb2d --- /dev/null +++ b/back/Infrastructure/Repositories/ChangeRecordRepo.cs @@ -0,0 +1,94 @@ +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 query.Select(x => x.ToDto()); + } + + 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(); + } +} diff --git a/back/Infrastructure/Support/Mappers/ChangeRecordMapper.cs b/back/Infrastructure/Support/Mappers/ChangeRecordMapper.cs new file mode 100644 index 0000000..cd5d76e --- /dev/null +++ b/back/Infrastructure/Support/Mappers/ChangeRecordMapper.cs @@ -0,0 +1,27 @@ +using Contracts.DTO; +using Infrastructure.Models; + +namespace Infrastructure.Support.Mappers; + +public static class ChangeRecordMapper +{ + public static ChangeRecordDto ToDto(this ChangeRecord changeRecord) + => new() + { + Id = changeRecord.Id, + Sum = changeRecord.Sum, + ChangedAt = changeRecord.ChangedAt, + SpendingGroupId = changeRecord.SpendingGroupId, + UserId = changeRecord.UserId + }; + + public static ChangeRecord ToModel(this ChangeRecordDto changeRecord) + => new() + { + Id = changeRecord.Id, + Sum = changeRecord.Sum, + ChangedAt = changeRecord.ChangedAt, + SpendingGroupId = changeRecord.SpendingGroupId, + UserId = changeRecord.UserId + }; +} \ No newline at end of file diff --git a/back/Services/Domain/ChangeRecordService.cs b/back/Services/Domain/ChangeRecordService.cs new file mode 100644 index 0000000..b90bafa --- /dev/null +++ b/back/Services/Domain/ChangeRecordService.cs @@ -0,0 +1,52 @@ +using Contracts.DTO; +using Contracts.Mappers; +using Contracts.Repositories; +using Contracts.SearchModels; +using Contracts.Services; +using Contracts.ViewModels; + +namespace Services.Domain; + +public class ChangeRecordService : IChangeRecordService +{ + private readonly IChangeRecordRepo _changeRecordRepo; + + public ChangeRecordService(IChangeRecordRepo changeRecordRepo) + { + _changeRecordRepo = changeRecordRepo; + } + + public async Task Create(ChangeRecordDto model) + { + var record = await _changeRecordRepo.Create(model); + + return record.ToView(); + } + + public async Task Delete(ChangeRecordSearch search) + { + var record = await _changeRecordRepo.Delete(search); + if (record == null) + { + throw new EntryPointNotFoundException("При удалении не получилось найти запись измнения баланса"); + } + return record.ToView(); + } + + public async Task> GetList(ChangeRecordSearch search) + { + var records = await _changeRecordRepo.GetList(search); + + return records.Select(x => x.ToView()).ToList(); + } + + public async Task Update(ChangeRecordDto model) + { + var record = await _changeRecordRepo.Update(model); + if (record == null) + { + throw new EntryPointNotFoundException("При изменении не получилось найти запись измнения баланса"); + } + return record.ToView(); + } +}