DD.WellWorkover.Cloud/AsbCloudApp/Services/ChangeLogServiceAbstract.cs
2024-01-26 17:23:21 +05:00

70 lines
2.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AsbCloudApp.Data;
using AsbCloudApp.Repositories;
using AsbCloudApp.Requests;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using AsbCloudApp.Exceptions;
namespace AsbCloudApp.Services
{
/// <summary>
///
/// </summary>
/// <typeparam name="TDto"></typeparam>
/// <typeparam name="TRequest"></typeparam>
public abstract class ChangeLogServiceAbstract<TDto, TRequest>
where TDto : ChangeLogAbstract
where TRequest : ChangeLogBaseRequest
{
/// <summary>
/// Репозиторий
/// </summary>
public IChangeLogRepository<TDto, TRequest> repository { get; }
/// <summary>
/// ctor
/// </summary>
/// <param name="repository"></param>
public ChangeLogServiceAbstract(IChangeLogRepository<TDto, TRequest> repository)
{
this.repository = repository;
}
/// <summary>
/// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0
/// </summary>
/// <param name="idUser"></param>
/// <param name="dtos"></param>
/// <param name="token"></param>
/// <returns></returns>
public virtual async Task<int> UpdateOrInsertRange(int idUser, IEnumerable<TDto> dtos, CancellationToken token)
{
var validationResults = Validate(dtos);
if (validationResults.Any())
{
var errors = validationResults.SelectMany(r => r.MemberNames.Select(member => $"{member}: {r.ErrorMessage}"));
throw new ArgumentInvalidException(nameof(dtos), $"not valid: {string.Join("\n", errors)}");
}
var itemsToInsert = dtos.Where(e => e.Id == 0);
var itemsToUpdate = dtos.Where(e => e.Id != 0);
var result = await repository.InsertRange(idUser, itemsToInsert, token);
result += await repository.UpdateRange(idUser, itemsToInsert, token);
return result;
}
/// <summary>
/// Валидация входных данных
/// </summary>
/// <param name="dtos"></param>
/// <returns></returns>
protected virtual IEnumerable<ValidationResult> Validate(IEnumerable<TDto> dtos)
=> Enumerable.Empty<ValidationResult>();
}
}