116 lines
5.4 KiB
C#
116 lines
5.4 KiB
C#
using ApplicationLayer.InfrastructureServicesInterfaces;
|
|
using ApplicationLayer.Services.Applicants.Models;
|
|
using ApplicationLayer.Services.Applicants.NeededServices;
|
|
using ApplicationLayer.Services.VisaApplications.Exceptions;
|
|
using ApplicationLayer.Services.VisaApplications.Models;
|
|
using ApplicationLayer.Services.VisaApplications.NeededServices;
|
|
using ApplicationLayer.Services.VisaApplications.Requests;
|
|
using AutoMapper;
|
|
using Domains.VisaApplicationDomain;
|
|
|
|
namespace ApplicationLayer.Services.VisaApplications.Handlers;
|
|
|
|
/// Handles visa requests
|
|
public class VisaApplicationRequestsHandler(
|
|
IVisaApplicationsRepository applications,
|
|
IApplicantsRepository applicants,
|
|
IUnitOfWork unitOfWork,
|
|
IMapper mapper,
|
|
IDateTimeProvider dateTimeProvider,
|
|
IUserIdProvider userIdProvider,
|
|
IEntityWriter entityWriter) : IVisaApplicationRequestsHandler
|
|
{
|
|
async Task<List<VisaApplicationPreview>> IVisaApplicationRequestsHandler.GetPendingAsync(CancellationToken cancellationToken)
|
|
{
|
|
var applicationsList = await applications.GetPendingApplicationsAsync(cancellationToken);
|
|
|
|
var applicationModels = mapper.Map<List<VisaApplicationPreview>>(applicationsList);
|
|
return applicationModels;
|
|
}
|
|
|
|
async Task<List<VisaApplicationPreview>> IVisaApplicationRequestsHandler.GetForApplicantAsync(CancellationToken cancellationToken)
|
|
{
|
|
var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken);
|
|
var visaApplications = await applications.GetOfApplicantAsync(applicantId, cancellationToken);
|
|
return mapper.Map<List<VisaApplicationPreview>>(visaApplications);
|
|
}
|
|
|
|
/// <inheritdoc cref="IVisaApplicationRequestsHandler.GetApplicationForApplicantAsync"/>
|
|
public async Task<VisaApplicationModel> GetApplicationForApplicantAsync(Guid id, CancellationToken cancellationToken)
|
|
{
|
|
var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken);
|
|
var application = await applications.GetByApplicantAndApplicationIdAsync(applicant.Id, id, cancellationToken);
|
|
var mapped = mapper.Map<VisaApplicationModel>(application);
|
|
mapped.Applicant = mapper.Map<ApplicantModel>(applicant);
|
|
return mapped;
|
|
}
|
|
|
|
async Task<VisaApplicationModel> IVisaApplicationRequestsHandler.GetApplicationForAuthorityAsync(Guid id, CancellationToken cancellationToken)
|
|
{
|
|
var pending = await applications.GetPendingApplicationsAsync(cancellationToken);
|
|
var application = pending.SingleOrDefault(a => a.Id == id) ?? throw new ApplicationAlreadyProcessedException();
|
|
var mapped = mapper.Map<VisaApplicationModel>(application);
|
|
var applicant = await applicants.GetByIdAsync(application.ApplicantId, cancellationToken);
|
|
mapped.Applicant = mapper.Map<ApplicantModel>(applicant);
|
|
return mapped;
|
|
}
|
|
|
|
async Task IVisaApplicationRequestsHandler.HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
|
{
|
|
var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken);
|
|
|
|
var visaApplication = mapper.Map<VisaApplication>(request);
|
|
visaApplication.RequestDate = dateTimeProvider.Now();
|
|
visaApplication.ApplicantId = applicant.Id;
|
|
|
|
await applications.AddAsync(visaApplication, cancellationToken);
|
|
|
|
await unitOfWork.SaveAsync(cancellationToken);
|
|
}
|
|
|
|
async Task IVisaApplicationRequestsHandler.HandleCloseRequestAsync(Guid applicationId, CancellationToken cancellationToken)
|
|
{
|
|
var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken);
|
|
var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken);
|
|
if (application.Status is ApplicationStatus.Approved or ApplicationStatus.Rejected)
|
|
{
|
|
throw new ApplicationAlreadyProcessedException();
|
|
}
|
|
|
|
application.Status = ApplicationStatus.Closed;
|
|
await applications.UpdateAsync(application, cancellationToken);
|
|
|
|
await unitOfWork.SaveAsync(cancellationToken);
|
|
}
|
|
|
|
async Task IVisaApplicationRequestsHandler.SetApplicationStatusFromAuthorityAsync(
|
|
Guid applicationId,
|
|
AuthorityRequestStatuses status,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var application = await applications.GetByIdAsync(applicationId, cancellationToken);
|
|
if (application.Status != ApplicationStatus.Pending)
|
|
{
|
|
throw new ApplicationAlreadyProcessedException();
|
|
}
|
|
|
|
var statusToSet = status switch
|
|
{
|
|
AuthorityRequestStatuses.Approved => ApplicationStatus.Approved,
|
|
AuthorityRequestStatuses.Rejected => ApplicationStatus.Rejected,
|
|
_ => throw new ArgumentOutOfRangeException(nameof(status), status, null)
|
|
};
|
|
|
|
application.Status = statusToSet;
|
|
await applications.UpdateAsync(application, cancellationToken);
|
|
|
|
await unitOfWork.SaveAsync(cancellationToken);
|
|
}
|
|
|
|
async Task<Stream> IVisaApplicationRequestsHandler.ApplicationToStreamAsync(Guid applicationId, CancellationToken cancellationToken)
|
|
{
|
|
var application = await GetApplicationForApplicantAsync(applicationId, cancellationToken);
|
|
return await entityWriter.WriteEntityToStream(application, cancellationToken);
|
|
}
|
|
}
|