diff --git a/SchengenVisaApi/ApplicationLayer/ApplicationLayer.csproj b/SchengenVisaApi/ApplicationLayer/ApplicationLayer.csproj index 902fd31..bc6298d 100644 --- a/SchengenVisaApi/ApplicationLayer/ApplicationLayer.csproj +++ b/SchengenVisaApi/ApplicationLayer/ApplicationLayer.csproj @@ -14,8 +14,4 @@ - - - - diff --git a/SchengenVisaApi/ApplicationLayer/DependencyInjection.cs b/SchengenVisaApi/ApplicationLayer/DependencyInjection.cs index 448cd5d..30e32ee 100644 --- a/SchengenVisaApi/ApplicationLayer/DependencyInjection.cs +++ b/SchengenVisaApi/ApplicationLayer/DependencyInjection.cs @@ -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(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/Exceptions/UserAlreadyExistsException.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/Exceptions/UserAlreadyExistsException.cs index 2c41003..98cf71a 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/Exceptions/UserAlreadyExistsException.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/Exceptions/UserAlreadyExistsException.cs @@ -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"); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/IRegisterService.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/IRegisterService.cs index 4156394..5d1f407 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/IRegisterService.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/IRegisterService.cs @@ -2,10 +2,13 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService { - /// Handles + /// Handles register request public interface IRegisterService { /// Handle Task Register(RegisterApplicantRequest request, CancellationToken cancellationToken); + + /// Handles and adds approving authority account + Task RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken); } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/RegisterService.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/RegisterService.cs index 514959e..2b77162 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/RegisterService.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/RegisterService/RegisterService.cs @@ -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); + } } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterApplicantRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterApplicantRequest.cs index 2f74de5..22dbe4d 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterApplicantRequest.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterApplicantRequest.cs @@ -18,5 +18,5 @@ namespace ApplicationLayer.Services.AuthServices.Requests Name MotherName, string JobTitle, PlaceOfWorkModel PlaceOfWork, - bool IsNonResident); + bool IsNonResident) : RegisterRequest(Email, Password); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterRequest.cs new file mode 100644 index 0000000..990dbf6 --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/AuthServices/Requests/RegisterRequest.cs @@ -0,0 +1,4 @@ +namespace ApplicationLayer.Services.AuthServices.Requests +{ + public record RegisterRequest(string Email, string Password); +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/IEditLocationsRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/IEditLocationsRequestsHandler.cs deleted file mode 100644 index 48ba837..0000000 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/IEditLocationsRequestsHandler.cs +++ /dev/null @@ -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); - } -} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/ILocationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/ILocationRequestsHandler.cs deleted file mode 100644 index 3408230..0000000 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/ILocationRequestsHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Domains.LocationDomain; - -namespace ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests -{ - /// Handles location requests - public interface ILocationRequestsHandler - { - /// Handle get request - /// List of available countries - Task> HandleGetRequestAsync(CancellationToken cancellationToken); - } -} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/LocationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/LocationRequestsHandler.cs deleted file mode 100644 index 2a72081..0000000 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ApplicantRequests/LocationRequestsHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using ApplicationLayer.Services.Locations.NeededServices; -using Domains.LocationDomain; - -namespace ApplicationLayer.Services.Locations.RequestHandlers.ApplicantRequests -{ - /// - public class LocationRequestsHandler(ICountriesRepository countries) : ILocationRequestsHandler - { - async Task> ILocationRequestsHandler.HandleGetRequestAsync(CancellationToken cancellationToken) - { - return await countries.GetAllAsync(cancellationToken); - } - } -} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/CountryAlreadyExists.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/CountryAlreadyExists.cs similarity index 65% rename from SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/CountryAlreadyExists.cs rename to SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/CountryAlreadyExists.cs index 18a2120..68a9ad4 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/CountryAlreadyExists.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/CountryAlreadyExists.cs @@ -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."); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/MultipleIdenticalCitiesInCountryException.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/MultipleIdenticalCitiesInCountryException.cs similarity index 68% rename from SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/MultipleIdenticalCitiesInCountryException.cs rename to SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/MultipleIdenticalCitiesInCountryException.cs index 03919e9..4a901da 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/Exceptions/MultipleIdenticalCitiesInCountryException.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/Exceptions/MultipleIdenticalCitiesInCountryException.cs @@ -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."); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ILocationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ILocationRequestsHandler.cs new file mode 100644 index 0000000..710e8c7 --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/ILocationRequestsHandler.cs @@ -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 + /// List of available countries + Task> HandleGetRequestAsync(CancellationToken cancellationToken); + + /// Handles add country requests + Task AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken); + } +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/EditLocationsRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/LocationRequestsHandler.cs similarity index 59% rename from SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/EditLocationsRequestsHandler.cs rename to SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/LocationRequestsHandler.cs index 66af0bd..a4f87ca 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/AdminRequests/EditLocationsRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Locations/RequestHandlers/LocationRequestsHandler.cs @@ -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 { - /// - public class EditLocationsRequestsHandler(ICountriesRepository countries, IUnitOfWork unitOfWork) : IEditLocationsRequestsHandler + /// + public class LocationRequestsHandler(ICountriesRepository countries, IUnitOfWork unitOfWork) : ILocationRequestsHandler { - async Task IEditLocationsRequestsHandler.AddCountryAsync(AddCountryRequest request, CancellationToken cancellationToken) + async Task> 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, diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/AdminController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/AdminController.cs deleted file mode 100644 index dc7d3c6..0000000 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/AdminController.cs +++ /dev/null @@ -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 AddCountry(AddCountryRequest request, CancellationToken cancellationToken) - { - await requestsHandler.AddCountryAsync(request, cancellationToken); - return Ok(); - } - - [HttpPost] - [Route("authorities")] - public async Task AddAuthority(AddCountryRequest request, CancellationToken cancellationToken) - { - await requestsHandler.AddCountryAsync(request, cancellationToken); - return Ok(); - } - } -} diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/LocationsController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/LocationsController.cs index 02454fd..494faa4 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/LocationsController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/LocationsController.cs @@ -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 AddCountry(AddCountryRequest request, CancellationToken cancellationToken) + { + await requestsHandler.AddCountryAsync(request, cancellationToken); + return Ok(); + } } } diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs index d4d26bd..e3395e4 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/UsersController.cs @@ -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 Register(RegisterApplicantRequest request, CancellationToken cancellationToken) { await registerService.Register(request, cancellationToken); return Created(); } + [HttpPost] + [Authorize(policy: PolicyConstants.AdminPolicy)] + [Route("authority")] + public async Task RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken) + { + await registerService.RegisterAuthority(request, cancellationToken); + return Created(); + } + [HttpGet] public async Task Login(string email, string password, CancellationToken cancellationToken) { diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index e2a1dc7..44214a5 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -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 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); diff --git a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs index 8b1af03..bb8e20a 100644 --- a/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs +++ b/SchengenVisaApi/SchengenVisaApi/ExceptionFilters/GlobalExceptionsFilter.cs @@ -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;