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;