action for process applications for authorities
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
using ApplicationLayer.GeneralExceptions;
|
||||||
|
|
||||||
|
namespace ApplicationLayer.Services.VisaApplications.Exceptions
|
||||||
|
{
|
||||||
|
public class ApplicationAlreadyProcessedException() : ApiException("This application already processed or closed by applicant.");
|
||||||
|
}
|
||||||
@@ -12,8 +12,10 @@ public interface IVisaApplicationRequestsHandler
|
|||||||
Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken);
|
Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// Creates application for applicant with specific user identifier
|
/// Creates application for applicant with specific user identifier
|
||||||
Task HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken);
|
Task HandleCreateRequestAsync(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// Sets application status to closed
|
/// Sets application status to closed
|
||||||
Task HandleCloseRequest(Guid userId, Guid applicationId, CancellationToken cancellationToken);
|
Task HandleCloseRequestAsync(Guid userId, Guid applicationId, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
Task SetApplicationStatusFromAuthorityAsync(Guid applicationId, AuthorityRequestStatuses status, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using ApplicationLayer.InfrastructureServicesInterfaces;
|
using ApplicationLayer.InfrastructureServicesInterfaces;
|
||||||
using ApplicationLayer.Services.Applicants.Models;
|
using ApplicationLayer.Services.Applicants.Models;
|
||||||
using ApplicationLayer.Services.Applicants.NeededServices;
|
using ApplicationLayer.Services.Applicants.NeededServices;
|
||||||
|
using ApplicationLayer.Services.VisaApplications.Exceptions;
|
||||||
using ApplicationLayer.Services.VisaApplications.Models;
|
using ApplicationLayer.Services.VisaApplications.Models;
|
||||||
using ApplicationLayer.Services.VisaApplications.NeededServices;
|
using ApplicationLayer.Services.VisaApplications.NeededServices;
|
||||||
using ApplicationLayer.Services.VisaApplications.Requests;
|
using ApplicationLayer.Services.VisaApplications.Requests;
|
||||||
@@ -87,7 +88,7 @@ public class VisaApplicationRequestsHandler(
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
public async Task HandleCreateRequestAsync(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
//TODO mapper
|
//TODO mapper
|
||||||
|
|
||||||
@@ -114,7 +115,7 @@ public class VisaApplicationRequestsHandler(
|
|||||||
await unitOfWork.SaveAsync(cancellationToken);
|
await unitOfWork.SaveAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task IVisaApplicationRequestsHandler.HandleCloseRequest(Guid userId, Guid applicationId, CancellationToken cancellationToken)
|
async Task IVisaApplicationRequestsHandler.HandleCloseRequestAsync(Guid userId, Guid applicationId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken);
|
var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken);
|
||||||
var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken);
|
var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken);
|
||||||
@@ -124,4 +125,30 @@ public class VisaApplicationRequestsHandler(
|
|||||||
|
|
||||||
await unitOfWork.SaveAsync(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)
|
||||||
|
{
|
||||||
|
//todo refactor exceptions
|
||||||
|
throw new ApplicationAlreadyProcessedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
//todo mapper
|
||||||
|
ApplicationStatus 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace ApplicationLayer.Services.VisaApplications.Models
|
||||||
|
{
|
||||||
|
public enum AuthorityRequestStatuses
|
||||||
|
{
|
||||||
|
Approved,
|
||||||
|
Rejected
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,7 +35,7 @@ namespace SchengenVisaApi.Controllers
|
|||||||
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
[Route("authority")]
|
[Route("authorities")]
|
||||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
public async Task<IActionResult> RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken)
|
public async Task<IActionResult> RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@@ -60,7 +60,7 @@ namespace SchengenVisaApi.Controllers
|
|||||||
[ProducesResponseType<List<User>>(StatusCodes.Status200OK)]
|
[ProducesResponseType<List<User>>(StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
[Route("authority")]
|
[Route("authorities")]
|
||||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
public async Task<IActionResult> GetAuthorityAccounts(CancellationToken cancellationToken)
|
public async Task<IActionResult> GetAuthorityAccounts(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@@ -75,7 +75,7 @@ namespace SchengenVisaApi.Controllers
|
|||||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
[Route("authority/{authorityAccountId:guid}")]
|
[Route("authorities/{authorityAccountId:guid}")]
|
||||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
//todo replace args with ChangeAuthorityAuthDataRequest or something
|
//todo replace args with ChangeAuthorityAuthDataRequest or something
|
||||||
public async Task<IActionResult> ChangeAuthorityAuthData(Guid authorityAccountId, RegisterRequest authData, CancellationToken cancellationToken)
|
public async Task<IActionResult> ChangeAuthorityAuthData(Guid authorityAccountId, RegisterRequest authData, CancellationToken cancellationToken)
|
||||||
@@ -91,7 +91,7 @@ namespace SchengenVisaApi.Controllers
|
|||||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
[Route("authority/{authorityAccountId:guid}")]
|
[Route("authorities/{authorityAccountId:guid}")]
|
||||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
public async Task<IActionResult> RemoveAuthorityAccount(Guid authorityAccountId, CancellationToken cancellationToken)
|
public async Task<IActionResult> RemoveAuthorityAccount(Guid authorityAccountId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace SchengenVisaApi.Controllers;
|
|||||||
|
|
||||||
/// <summary> Controller for <see cref="Domains.VisaApplicationDomain"/> </summary>
|
/// <summary> Controller for <see cref="Domains.VisaApplicationDomain"/> </summary>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("visaApplication")]
|
[Route("visaApplications")]
|
||||||
public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : VisaApiControllerBase
|
public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : VisaApiControllerBase
|
||||||
{
|
{
|
||||||
//todo should return model
|
//todo should return model
|
||||||
@@ -53,7 +53,7 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli
|
|||||||
public async Task<IActionResult> Create(VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
public async Task<IActionResult> Create(VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var userId = GetUserId();
|
var userId = GetUserId();
|
||||||
await visaApplicationRequestsHandler.HandleCreateRequest(userId, request, cancellationToken);
|
await visaApplicationRequestsHandler.HandleCreateRequestAsync(userId, request, cancellationToken);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,22 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli
|
|||||||
public async Task<IActionResult> CloseApplication(Guid applicationId, CancellationToken cancellationToken)
|
public async Task<IActionResult> CloseApplication(Guid applicationId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var userId = GetUserId();
|
var userId = GetUserId();
|
||||||
await visaApplicationRequestsHandler.HandleCloseRequest(userId, applicationId, cancellationToken);
|
await visaApplicationRequestsHandler.HandleCloseRequestAsync(userId, applicationId, cancellationToken);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Allows approving authorities approve or reject applications</summary>
|
||||||
|
/// <remarks> Accessible only for authorities</remarks>
|
||||||
|
[HttpPatch]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
|
[Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)]
|
||||||
|
[Route("approving/{applicationId:guid}")]
|
||||||
|
public async Task<IActionResult> SetStatusFromAuthority(Guid applicationId, AuthorityRequestStatuses status, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await visaApplicationRequestsHandler.SetApplicationStatusFromAuthorityAsync(applicationId, status, cancellationToken);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using ApplicationLayer.GeneralExceptions;
|
using ApplicationLayer.GeneralExceptions;
|
||||||
using ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
|
using ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
|
||||||
using ApplicationLayer.Services.GeneralExceptions;
|
using ApplicationLayer.Services.GeneralExceptions;
|
||||||
|
using ApplicationLayer.Services.VisaApplications.Exceptions;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
|
||||||
@@ -35,6 +36,11 @@ namespace SchengenVisaApi.ExceptionFilters
|
|||||||
problemDetails.Title = "Already exists";
|
problemDetails.Title = "Already exists";
|
||||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
|
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
|
||||||
break;
|
break;
|
||||||
|
case ApplicationAlreadyProcessedException:
|
||||||
|
problemDetails.Status = StatusCodes.Status409Conflict;
|
||||||
|
problemDetails.Title = "Already processed";
|
||||||
|
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
problemDetails.Status = StatusCodes.Status400BadRequest;
|
problemDetails.Status = StatusCodes.Status400BadRequest;
|
||||||
problemDetails.Title = "Bad request";
|
problemDetails.Title = "Bad request";
|
||||||
|
|||||||
Reference in New Issue
Block a user