using AutoMapper; using DigitalData.Core.Application; using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using static EnvelopeGenerator.Common.Constants; using EnvelopeGenerator.Application.Resources; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; namespace EnvelopeGenerator.Application.Services { public class EnvelopeHistoryService : CRUDService, IEnvelopeHistoryService { public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IStringLocalizer localizer, IMapper mapper) : base(repository, localizer, mapper) { } public async Task CountAsync(int? envelopeId = null, string? userReference = null, int? status = null) => await _repository.CountAsync(envelopeId: envelopeId, userReference: userReference, status: status); public async Task HasStatus(EnvelopeStatus status, int envelopeId, string userReference) => await _repository.CountAsync( envelopeId: envelopeId, userReference: userReference, status: (int) status) > 0; public async Task AccessCodeAlreadyRequested(int envelopeId, string userReference) => await _repository.CountAsync( envelopeId: envelopeId, userReference:userReference, status: (int) EnvelopeStatus.AccessCodeRequested) > 0; public async Task IsSigned(int envelopeId, string userReference) => await _repository.CountAsync( envelopeId: envelopeId, userReference: userReference, status: (int) EnvelopeStatus.DocumentSigned) > 0; /// /// Checks if the specified envelope has been rejected. /// Note: If any document within the envelope is rejected, the entire envelope will be considered rejected. /// /// The ID of the envelope to check. /// Optional user reference associated with the envelope. /// A task that represents the asynchronous operation. The task result contains a boolean value indicating whether the envelope is rejected. public async Task IsRejected(int envelopeId, string? userReference = null) { return await _repository.CountAsync( envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected) > 0; } public async Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null) { var histDTOs = _mapper.MapOrThrow>( await _repository.ReadAsync( envelopeId: envelopeId, userReference: userReference, status: status)); return referenceType is null ? histDTOs : histDTOs.Where(h => h.ReferenceType == referenceType); } public async Task> ReadRejectedAsync(int envelopeId, string? userReference = null) => await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected); public async Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status) => await CreateAsync(new (EnvelopeId: envelopeId, UserReference: userReference, Status: (int)status, ActionDate: DateTime.Now)) .ThenAsync( Success: id => Result.Success(id), Fail: (mssg, ntc) => Result.Fail().Message(mssg).Notice(ntc) ); } }