Registration and actions for approving authorities
This commit is contained in:
@@ -14,8 +14,4 @@
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0-preview.7.24405.7" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using ApplicationLayer.Services.AuthServices.LoginService;
|
||||
using ApplicationLayer.Services.AuthServices.RegisterService;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers;
|
||||
using ApplicationLayer.Services.VisaApplications.Handlers;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
@@ -15,7 +14,6 @@ public static class DependencyInjection
|
||||
{
|
||||
services.AddScoped<IVisaApplicationRequestsHandler, VisaApplicationRequestsHandler>();
|
||||
services.AddScoped<ILocationRequestsHandler, LocationRequestsHandler>();
|
||||
services.AddScoped<IEditLocationsRequestsHandler, EditLocationsRequestsHandler>();
|
||||
|
||||
services.AddScoped<IRegisterService, RegisterService>();
|
||||
|
||||
|
||||
@@ -3,5 +3,5 @@ using ApplicationLayer.Services.AuthServices.Requests;
|
||||
|
||||
namespace ApplicationLayer.Services.AuthServices.RegisterService.Exceptions
|
||||
{
|
||||
public class UserAlreadyExistsException(RegisterApplicantRequest request) : AlreadyExistsException($"User with email '{request.Email}' already exists");
|
||||
public class UserAlreadyExistsException(RegisterRequest request) : AlreadyExistsException($"User with email '{request.Email}' already exists");
|
||||
}
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
|
||||
namespace ApplicationLayer.Services.AuthServices.RegisterService
|
||||
{
|
||||
/// Handles <see cref="RegisterApplicantRequest"/>
|
||||
/// Handles register request
|
||||
public interface IRegisterService
|
||||
{
|
||||
/// Handle <see cref="RegisterApplicantRequest"/>
|
||||
Task Register(RegisterApplicantRequest request, CancellationToken cancellationToken);
|
||||
|
||||
/// Handles <see cref="RegisterRequest"/> and adds approving authority account
|
||||
Task RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService
|
||||
{
|
||||
async Task IRegisterService.Register(RegisterApplicantRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
//todo move to validation layer
|
||||
if (await users.FindByEmailAsync(request.Email, cancellationToken) is not null)
|
||||
{
|
||||
throw new UserAlreadyExistsException(request);
|
||||
@@ -38,9 +39,7 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService
|
||||
|
||||
var placeOfWork = new PlaceOfWork
|
||||
{
|
||||
Name = request.PlaceOfWork.Name,
|
||||
Address = placeOfWorkAddress,
|
||||
PhoneNum = request.PlaceOfWork.PhoneNum
|
||||
Name = request.PlaceOfWork.Name, Address = placeOfWorkAddress, PhoneNum = request.PlaceOfWork.PhoneNum
|
||||
};
|
||||
|
||||
var applicant = new Applicant
|
||||
@@ -67,5 +66,21 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService
|
||||
|
||||
await unitOfWork.SaveAsync(cancellationToken);
|
||||
}
|
||||
|
||||
async Task IRegisterService.RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
//todo move to validation layer
|
||||
if (await users.FindByEmailAsync(request.Email, cancellationToken) is not null)
|
||||
{
|
||||
throw new UserAlreadyExistsException(request);
|
||||
}
|
||||
|
||||
//TODO mapper
|
||||
var user = new User { Email = request.Email, Password = request.Password, Role = Role.ApprovingAuthority };
|
||||
|
||||
await users.AddAsync(user, cancellationToken);
|
||||
|
||||
await unitOfWork.SaveAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,5 +18,5 @@ namespace ApplicationLayer.Services.AuthServices.Requests
|
||||
Name MotherName,
|
||||
string JobTitle,
|
||||
PlaceOfWorkModel PlaceOfWork,
|
||||
bool IsNonResident);
|
||||
bool IsNonResident) : RegisterRequest(Email, Password);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
namespace ApplicationLayer.Services.AuthServices.Requests
|
||||
{
|
||||
public record RegisterRequest(string Email, string Password);
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using ApplicationLayer.Services.Locations.Requests;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests
|
||||
{
|
||||
/// Handles edit requests of locations from admins
|
||||
public interface IEditLocationsRequestsHandler
|
||||
{
|
||||
/// Handles add country requests
|
||||
Task AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using Domains.LocationDomain;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests
|
||||
{
|
||||
/// Handles location requests
|
||||
public interface ILocationRequestsHandler
|
||||
{
|
||||
/// Handle get request
|
||||
/// <returns>List of available countries</returns>
|
||||
Task<List<Country>> HandleGetRequestAsync(CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using ApplicationLayer.Services.Locations.NeededServices;
|
||||
using Domains.LocationDomain;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests
|
||||
{
|
||||
/// <inheritdoc cref="ILocationRequestsHandler"/>
|
||||
public class LocationRequestsHandler(ICountriesRepository countries) : ILocationRequestsHandler
|
||||
{
|
||||
async Task<List<Country>> ILocationRequestsHandler.HandleGetRequestAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return await countries.GetAllAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using ApplicationLayer.GeneralExceptions;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests.Exceptions
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.Exceptions
|
||||
{
|
||||
public class CountryAlreadyExists(string countryName) : AlreadyExistsException($"{countryName} already exists.");
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using ApplicationLayer.GeneralExceptions;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests.Exceptions
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.Exceptions
|
||||
{
|
||||
public class MultipleIdenticalCitiesInCountryException() : ApiException("There are multiple cities with one name in the country.");
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using ApplicationLayer.Services.Locations.Requests;
|
||||
using Domains.LocationDomain;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers
|
||||
{
|
||||
/// Handles location requests
|
||||
public interface ILocationRequestsHandler
|
||||
{
|
||||
/// Handle get request
|
||||
/// <returns>List of available countries</returns>
|
||||
Task<List<Country>> HandleGetRequestAsync(CancellationToken cancellationToken);
|
||||
|
||||
/// Handles add country requests
|
||||
Task AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,20 @@
|
||||
using ApplicationLayer.GeneralNeededServices;
|
||||
using ApplicationLayer.Services.Locations.NeededServices;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests.Exceptions;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.Exceptions;
|
||||
using ApplicationLayer.Services.Locations.Requests;
|
||||
using Domains.LocationDomain;
|
||||
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests
|
||||
namespace ApplicationLayer.Services.Locations.RequestHandlers
|
||||
{
|
||||
/// <inheritdoc cref="IEditLocationsRequestsHandler"/>
|
||||
public class EditLocationsRequestsHandler(ICountriesRepository countries, IUnitOfWork unitOfWork) : IEditLocationsRequestsHandler
|
||||
/// <inheritdoc cref="ILocationRequestsHandler"/>
|
||||
public class LocationRequestsHandler(ICountriesRepository countries, IUnitOfWork unitOfWork) : ILocationRequestsHandler
|
||||
{
|
||||
async Task IEditLocationsRequestsHandler.AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken)
|
||||
async Task<List<Country>> ILocationRequestsHandler.HandleGetRequestAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return await countries.GetAllAsync(cancellationToken);
|
||||
}
|
||||
|
||||
async Task ILocationRequestsHandler.AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
if (await countries.FindByName(request.CountryName, cancellationToken) is not null)
|
||||
{
|
||||
@@ -21,6 +26,7 @@ namespace ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests
|
||||
throw new MultipleIdenticalCitiesInCountryException();
|
||||
}
|
||||
|
||||
//todo mapper
|
||||
var country = new Country
|
||||
{
|
||||
Name = request.CountryName,
|
||||
@@ -1,30 +0,0 @@
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests;
|
||||
using ApplicationLayer.Services.Locations.Requests;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SchengenVisaApi.Common;
|
||||
|
||||
namespace SchengenVisaApi.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("admin")]
|
||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||
public class AdminController(IEditLocationsRequestsHandler requestsHandler) : ControllerBase
|
||||
{
|
||||
[HttpPost]
|
||||
[Route("country")]
|
||||
public async Task<IActionResult> AddCountry(AddCountryRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
await requestsHandler.AddCountryAsync(request, cancellationToken);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("authorities")]
|
||||
public async Task<IActionResult> AddAuthority(AddCountryRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
await requestsHandler.AddCountryAsync(request, cancellationToken);
|
||||
return Ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers;
|
||||
using ApplicationLayer.Services.Locations.Requests;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SchengenVisaApi.Common;
|
||||
|
||||
namespace SchengenVisaApi.Controllers
|
||||
{
|
||||
@@ -12,5 +15,14 @@ namespace SchengenVisaApi.Controllers
|
||||
{
|
||||
return Ok(await requestsHandler.HandleGetRequestAsync(cancellationToken));
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("country")]
|
||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||
public async Task<IActionResult> AddCountry(AddCountryRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
await requestsHandler.AddCountryAsync(request, cancellationToken);
|
||||
return Ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using ApplicationLayer.Services.AuthServices.LoginService;
|
||||
using ApplicationLayer.Services.AuthServices.RegisterService;
|
||||
using ApplicationLayer.Services.AuthServices.Requests;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SchengenVisaApi.Common;
|
||||
|
||||
namespace SchengenVisaApi.Controllers
|
||||
{
|
||||
@@ -10,12 +12,22 @@ namespace SchengenVisaApi.Controllers
|
||||
public class UsersController(IRegisterService registerService, ILoginService loginService) : ControllerBase
|
||||
{
|
||||
[HttpPost]
|
||||
[Route("applicant")]
|
||||
public async Task<IActionResult> Register(RegisterApplicantRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
await registerService.Register(request, cancellationToken);
|
||||
return Created();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||
[Route("authority")]
|
||||
public async Task<IActionResult> RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
await registerService.RegisterAuthority(request, cancellationToken);
|
||||
return Created();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public async Task<IActionResult> Login(string email, string password, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
@@ -9,11 +9,10 @@ namespace SchengenVisaApi.Controllers;
|
||||
|
||||
[ApiController]
|
||||
[Route("[controller]")]
|
||||
[Authorize(policy: PolicyConstants.ApplicantPolicy)]
|
||||
public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : ControllerBase
|
||||
{
|
||||
//TODO remove
|
||||
[HttpGet]
|
||||
[Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)]
|
||||
public async Task<IActionResult> Get(CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await visaApplicationRequestsHandler.Get(cancellationToken);
|
||||
@@ -21,6 +20,7 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Authorize(policy: PolicyConstants.ApplicantPolicy)]
|
||||
public void Create(VisaApplicationCreateRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var userId = Guid.Parse(HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using ApplicationLayer.GeneralExceptions;
|
||||
using ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.AdminRequests.Exceptions;
|
||||
using ApplicationLayer.Services.Locations.RequestHandlers.Exceptions;
|
||||
using Domains;
|
||||
using Infrastructure.Database.GeneralExceptions;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
Reference in New Issue
Block a user