Merge pull request #10 from prtsie/9-refactor

9 refactor
This commit is contained in:
prtsie
2024-08-26 11:53:06 +03:00
committed by GitHub
59 changed files with 667 additions and 722 deletions

View File

@@ -1,4 +1,3 @@
namespace ApplicationLayer.GeneralExceptions namespace ApplicationLayer.GeneralExceptions;
{
public class AlreadyExistsException(string message) : ApiException(message); public class AlreadyExistsException(string message) : ApiException(message);
}

View File

@@ -1,4 +1,3 @@
namespace ApplicationLayer.GeneralExceptions namespace ApplicationLayer.GeneralExceptions;
{
public class ApiException(string message) : Exception(message); public class ApiException(string message) : Exception(message);
}

View File

@@ -1,8 +1,7 @@
namespace ApplicationLayer.InfrastructureServicesInterfaces namespace ApplicationLayer.InfrastructureServicesInterfaces;
{
public interface IDateTimeProvider public interface IDateTimeProvider
{ {
/// Returns current date and time /// Returns current date and time
DateTime Now(); DateTime Now();
} }
}

View File

@@ -1,8 +1,7 @@
namespace ApplicationLayer.InfrastructureServicesInterfaces namespace ApplicationLayer.InfrastructureServicesInterfaces;
{
public interface IUserIdProvider public interface IUserIdProvider
{ {
/// Returns identifier of authenticated user who sent the request /// Returns identifier of authenticated user who sent the request
Guid GetUserId(); Guid GetUserId();
} }
}

View File

@@ -1,7 +1,7 @@
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
namespace ApplicationLayer.Services.Applicants.Models namespace ApplicationLayer.Services.Applicants.Models;
{
/// Model of <see cref="Applicant"/> /// Model of <see cref="Applicant"/>
public class ApplicantModel public class ApplicantModel
{ {
@@ -47,4 +47,3 @@ namespace ApplicationLayer.Services.Applicants.Models
/// <inheritdoc cref="Applicant.IsNonResident"/> /// <inheritdoc cref="Applicant.IsNonResident"/>
public bool IsNonResident { get; set; } public bool IsNonResident { get; set; }
} }
}

View File

@@ -1,7 +1,7 @@
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
namespace ApplicationLayer.Services.Applicants.Models namespace ApplicationLayer.Services.Applicants.Models;
{
public class PlaceOfWorkModel public class PlaceOfWorkModel
{ {
/// Name of hirer /// Name of hirer
@@ -13,4 +13,3 @@ namespace ApplicationLayer.Services.Applicants.Models
/// Phone number of hirer /// Phone number of hirer
public string PhoneNum { get; set; } = null!; public string PhoneNum { get; set; } = null!;
} }
}

View File

@@ -1,4 +1,3 @@
namespace ApplicationLayer.Services.AuthServices.Common namespace ApplicationLayer.Services.AuthServices.Common;
{
public record AuthData(string Email, string Password); public record AuthData(string Email, string Password);
}

View File

@@ -2,8 +2,8 @@
using ApplicationLayer.Services.AuthServices.NeededServices; using ApplicationLayer.Services.AuthServices.NeededServices;
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.AuthServices.LoginService namespace ApplicationLayer.Services.AuthServices.LoginService;
{
public class DevelopmentLoginService(IUsersRepository users, ITokenGenerator tokenGenerator) : ILoginService public class DevelopmentLoginService(IUsersRepository users, ITokenGenerator tokenGenerator) : ILoginService
{ {
async Task<string> ILoginService.LoginAsync(string email, string password, CancellationToken cancellationToken) async Task<string> ILoginService.LoginAsync(string email, string password, CancellationToken cancellationToken)
@@ -24,4 +24,3 @@ namespace ApplicationLayer.Services.AuthServices.LoginService
return tokenGenerator.CreateToken(user); return tokenGenerator.CreateToken(user);
} }
} }
}

View File

@@ -1,6 +1,5 @@
using ApplicationLayer.GeneralExceptions; using ApplicationLayer.GeneralExceptions;
namespace ApplicationLayer.Services.AuthServices.LoginService.Exceptions namespace ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
{
public class IncorrectLoginDataException() : ApiException("Incorrect email or password"); public class IncorrectLoginDataException() : ApiException("Incorrect email or password");
}

View File

@@ -1,5 +1,5 @@
namespace ApplicationLayer.Services.AuthServices.LoginService namespace ApplicationLayer.Services.AuthServices.LoginService;
{
/// Handles login requests /// Handles login requests
public interface ILoginService public interface ILoginService
{ {
@@ -7,4 +7,3 @@
/// <returns>JWT-token</returns> /// <returns>JWT-token</returns>
Task<string> LoginAsync(string email, string password, CancellationToken cancellationToken); Task<string> LoginAsync(string email, string password, CancellationToken cancellationToken);
} }
}

View File

@@ -1,8 +1,8 @@
using ApplicationLayer.Services.AuthServices.LoginService.Exceptions; using ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
using ApplicationLayer.Services.AuthServices.NeededServices; using ApplicationLayer.Services.AuthServices.NeededServices;
namespace ApplicationLayer.Services.AuthServices.LoginService namespace ApplicationLayer.Services.AuthServices.LoginService;
{
/// <inheritdoc cref="ILoginService"/> /// <inheritdoc cref="ILoginService"/>
public class LoginService(IUsersRepository users, ITokenGenerator tokenGenerator) : ILoginService public class LoginService(IUsersRepository users, ITokenGenerator tokenGenerator) : ILoginService
{ {
@@ -17,4 +17,3 @@ namespace ApplicationLayer.Services.AuthServices.LoginService
return tokenGenerator.CreateToken(user); return tokenGenerator.CreateToken(user);
} }
} }
}

View File

@@ -1,9 +1,10 @@
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.AuthServices.NeededServices namespace ApplicationLayer.Services.AuthServices.NeededServices;
{
/// Generates jwt-tokens
public interface ITokenGenerator public interface ITokenGenerator
{ {
/// returns jwt-token for specific user
string CreateToken(User user); string CreateToken(User user);
} }
}

View File

@@ -1,8 +1,8 @@
using ApplicationLayer.InfrastructureServicesInterfaces; using ApplicationLayer.InfrastructureServicesInterfaces;
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.AuthServices.NeededServices namespace ApplicationLayer.Services.AuthServices.NeededServices;
{
/// Repository pattern for <see cref="User"/> /// Repository pattern for <see cref="User"/>
public interface IUsersRepository : IGenericRepository<User> public interface IUsersRepository : IGenericRepository<User>
{ {
@@ -18,4 +18,3 @@ namespace ApplicationLayer.Services.AuthServices.NeededServices
/// <returns>list of accounts</returns> /// <returns>list of accounts</returns>
Task<List<User>> GetAllOfRoleAsync(Role role, CancellationToken cancellationToken); Task<List<User>> GetAllOfRoleAsync(Role role, CancellationToken cancellationToken);
} }
}

View File

@@ -1,7 +1,7 @@
using ApplicationLayer.Services.AuthServices.Requests; using ApplicationLayer.Services.AuthServices.Requests;
namespace ApplicationLayer.Services.AuthServices.RegisterService namespace ApplicationLayer.Services.AuthServices.RegisterService;
{
/// Handles register request /// Handles register request
public interface IRegisterService public interface IRegisterService
{ {
@@ -11,4 +11,3 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService
/// Handles <see cref="RegisterRequest"/> and adds approving authority account /// Handles <see cref="RegisterRequest"/> and adds approving authority account
Task RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken); Task RegisterAuthority(RegisterRequest request, CancellationToken cancellationToken);
} }
}

View File

@@ -6,8 +6,8 @@ using AutoMapper;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.AuthServices.RegisterService namespace ApplicationLayer.Services.AuthServices.RegisterService;
{
/// <inheritdoc cref="IRegisterService"/> /// <inheritdoc cref="IRegisterService"/>
public class RegisterService( public class RegisterService(
IUsersRepository users, IUsersRepository users,
@@ -39,4 +39,3 @@ namespace ApplicationLayer.Services.AuthServices.RegisterService
await unitOfWork.SaveAsync(cancellationToken); await unitOfWork.SaveAsync(cancellationToken);
} }
} }
}

View File

@@ -2,8 +2,8 @@
using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.Common;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
namespace ApplicationLayer.Services.AuthServices.Requests namespace ApplicationLayer.Services.AuthServices.Requests;
{
public record RegisterApplicantRequest( public record RegisterApplicantRequest(
AuthData AuthData, AuthData AuthData,
Name ApplicantName, Name ApplicantName,
@@ -20,4 +20,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests
string JobTitle, string JobTitle,
PlaceOfWorkModel PlaceOfWork, PlaceOfWorkModel PlaceOfWork,
bool IsNonResident) : RegisterRequest(AuthData); bool IsNonResident) : RegisterRequest(AuthData);
}

View File

@@ -1,6 +1,5 @@
using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.Common;
namespace ApplicationLayer.Services.AuthServices.Requests namespace ApplicationLayer.Services.AuthServices.Requests;
{
public record RegisterRequest(AuthData AuthData); public record RegisterRequest(AuthData AuthData);
}

View File

@@ -3,8 +3,8 @@ using ApplicationLayer.Services.AuthServices.NeededServices;
using Domains; using Domains;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.AuthServices.Requests.Validation namespace ApplicationLayer.Services.AuthServices.Requests.Validation;
{
public class AuthDataValidator : AbstractValidator<AuthData> public class AuthDataValidator : AbstractValidator<AuthData>
{ {
public AuthDataValidator(IUsersRepository users) public AuthDataValidator(IUsersRepository users)
@@ -29,4 +29,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests.Validation
.WithMessage($"Password length must be less than {ConfigurationConstraints.PasswordLength}"); .WithMessage($"Password length must be less than {ConfigurationConstraints.PasswordLength}");
} }
} }
}

View File

@@ -2,8 +2,8 @@
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.AuthServices.Requests.Validation namespace ApplicationLayer.Services.AuthServices.Requests.Validation;
{
public class NameValidator : AbstractValidator<Name> public class NameValidator : AbstractValidator<Name>
{ {
public NameValidator() public NameValidator()
@@ -25,4 +25,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests.Validation
.WithMessage($"Patronymic length must be less than {ConfigurationConstraints.NameLength}"); .WithMessage($"Patronymic length must be less than {ConfigurationConstraints.NameLength}");
} }
} }
}

View File

@@ -3,8 +3,8 @@ using Domains;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.AuthServices.Requests.Validation namespace ApplicationLayer.Services.AuthServices.Requests.Validation;
{
public class PassportValidator : AbstractValidator<Passport> public class PassportValidator : AbstractValidator<Passport>
{ {
public PassportValidator(IDateTimeProvider dateTimeProvider) public PassportValidator(IDateTimeProvider dateTimeProvider)
@@ -34,4 +34,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests.Validation
.WithMessage("Passport issue date must be in past"); .WithMessage("Passport issue date must be in past");
} }
} }
}

View File

@@ -2,8 +2,8 @@
using Domains; using Domains;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.AuthServices.Requests.Validation namespace ApplicationLayer.Services.AuthServices.Requests.Validation;
{
public class PlaceOfWorkModelValidator : AbstractValidator<PlaceOfWorkModel> public class PlaceOfWorkModelValidator : AbstractValidator<PlaceOfWorkModel>
{ {
public PlaceOfWorkModelValidator() public PlaceOfWorkModelValidator()
@@ -47,4 +47,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests.Validation
.WithMessage($"Building of place of work length must be less than {ConfigurationConstraints.BuildingNumberLength}"); .WithMessage($"Building of place of work length must be less than {ConfigurationConstraints.BuildingNumberLength}");
} }
} }
}

View File

@@ -5,8 +5,8 @@ using Domains;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.AuthServices.Requests.Validation namespace ApplicationLayer.Services.AuthServices.Requests.Validation;
{
public class RegisterApplicantRequestValidator : AbstractValidator<RegisterApplicantRequest> public class RegisterApplicantRequestValidator : AbstractValidator<RegisterApplicantRequest>
{ {
public RegisterApplicantRequestValidator( public RegisterApplicantRequestValidator(
@@ -75,4 +75,3 @@ namespace ApplicationLayer.Services.AuthServices.Requests.Validation
.SetValidator(placeOfWorkModelValidator); .SetValidator(placeOfWorkModelValidator);
} }
} }
}

View File

@@ -1,8 +1,8 @@
using ApplicationLayer.Services.Users.Requests; using ApplicationLayer.Services.Users.Requests;
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.Users namespace ApplicationLayer.Services.Users;
{
/// user accounts service /// user accounts service
public interface IUsersService public interface IUsersService
{ {
@@ -20,4 +20,3 @@ namespace ApplicationLayer.Services.Users
/// <param name="cancellationToken">Cancellation token</param> /// <param name="cancellationToken">Cancellation token</param>
Task RemoveUserAccount(Guid userId, CancellationToken cancellationToken); Task RemoveUserAccount(Guid userId, CancellationToken cancellationToken);
} }
}

View File

@@ -1,6 +1,5 @@
using ApplicationLayer.Services.AuthServices.Common; using ApplicationLayer.Services.AuthServices.Common;
namespace ApplicationLayer.Services.Users.Requests namespace ApplicationLayer.Services.Users.Requests;
{
public record ChangeUserAuthDataRequest(Guid UserId, AuthData NewAuthData); public record ChangeUserAuthDataRequest(Guid UserId, AuthData NewAuthData);
}

View File

@@ -3,8 +3,8 @@ using ApplicationLayer.Services.AuthServices.NeededServices;
using ApplicationLayer.Services.Users.Requests; using ApplicationLayer.Services.Users.Requests;
using Domains.Users; using Domains.Users;
namespace ApplicationLayer.Services.Users namespace ApplicationLayer.Services.Users;
{
public class UsersService(IUsersRepository users, IUnitOfWork unitOfWork) : IUsersService public class UsersService(IUsersRepository users, IUnitOfWork unitOfWork) : IUsersService
{ {
async Task<List<User>> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken) async Task<List<User>> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken)
@@ -31,4 +31,3 @@ namespace ApplicationLayer.Services.Users
await unitOfWork.SaveAsync(cancellationToken); await unitOfWork.SaveAsync(cancellationToken);
} }
} }
}

View File

@@ -1,6 +1,5 @@
using ApplicationLayer.GeneralExceptions; using ApplicationLayer.GeneralExceptions;
namespace ApplicationLayer.Services.VisaApplications.Exceptions namespace ApplicationLayer.Services.VisaApplications.Exceptions;
{
public class ApplicationAlreadyProcessedException() : ApiException("This application already processed or closed by applicant."); public class ApplicationAlreadyProcessedException() : ApiException("This application already processed or closed by applicant.");
}

View File

@@ -9,13 +9,13 @@ public interface IVisaApplicationRequestsHandler
Task<List<VisaApplicationModelForAuthority>> GetAllAsync(CancellationToken cancellationToken); Task<List<VisaApplicationModelForAuthority>> GetAllAsync(CancellationToken cancellationToken);
/// Returns all applications of one applicant /// Returns all applications of one applicant
Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken); Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(CancellationToken cancellationToken);
/// Creates application for applicant with specific user identifier /// Creates application for applicant with specific user identifier
Task HandleCreateRequestAsync(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken); Task HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken);
/// Sets application status to closed /// Sets application status to closed
Task HandleCloseRequestAsync(Guid userId, Guid applicationId, CancellationToken cancellationToken); Task HandleCloseRequestAsync(Guid applicationId, CancellationToken cancellationToken);
Task SetApplicationStatusFromAuthorityAsync(Guid applicationId, AuthorityRequestStatuses status, CancellationToken cancellationToken); Task SetApplicationStatusFromAuthorityAsync(Guid applicationId, AuthorityRequestStatuses status, CancellationToken cancellationToken);
} }

View File

@@ -16,7 +16,8 @@ public class VisaApplicationRequestsHandler(
IApplicantsRepository applicants, IApplicantsRepository applicants,
IUnitOfWork unitOfWork, IUnitOfWork unitOfWork,
IMapper mapper, IMapper mapper,
IDateTimeProvider dateTimeProvider) : IVisaApplicationRequestsHandler IDateTimeProvider dateTimeProvider,
IUserIdProvider userIdProvider) : IVisaApplicationRequestsHandler
{ {
async Task<List<VisaApplicationModelForAuthority>> IVisaApplicationRequestsHandler.GetAllAsync(CancellationToken cancellationToken) async Task<List<VisaApplicationModelForAuthority>> IVisaApplicationRequestsHandler.GetAllAsync(CancellationToken cancellationToken)
{ {
@@ -40,16 +41,16 @@ public class VisaApplicationRequestsHandler(
return model; return model;
} }
public async Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken) public async Task<List<VisaApplicationModelForApplicant>> GetForApplicantAsync(CancellationToken cancellationToken)
{ {
var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken); var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken);
var visaApplications = await applications.GetOfApplicantAsync(applicantId, cancellationToken); var visaApplications = await applications.GetOfApplicantAsync(applicantId, cancellationToken);
return mapper.Map<List<VisaApplicationModelForApplicant>>(visaApplications); return mapper.Map<List<VisaApplicationModelForApplicant>>(visaApplications);
} }
public async Task HandleCreateRequestAsync(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken) public async Task HandleCreateRequestAsync(VisaApplicationCreateRequest request, CancellationToken cancellationToken)
{ {
var applicant = await applicants.FindByUserIdAsync(userId, cancellationToken); var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken);
var visaApplication = mapper.Map<VisaApplication>(request); var visaApplication = mapper.Map<VisaApplication>(request);
visaApplication.RequestDate = dateTimeProvider.Now(); visaApplication.RequestDate = dateTimeProvider.Now();
@@ -60,9 +61,9 @@ public class VisaApplicationRequestsHandler(
await unitOfWork.SaveAsync(cancellationToken); await unitOfWork.SaveAsync(cancellationToken);
} }
async Task IVisaApplicationRequestsHandler.HandleCloseRequestAsync(Guid userId, Guid applicationId, CancellationToken cancellationToken) async Task IVisaApplicationRequestsHandler.HandleCloseRequestAsync(Guid applicationId, CancellationToken cancellationToken)
{ {
var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken); var applicantId = await applicants.GetApplicantIdByUserId(userIdProvider.GetUserId(), cancellationToken);
var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken); var application = await applications.GetByApplicantAndApplicationIdAsync(applicantId, applicationId, cancellationToken);
application.Status = ApplicationStatus.Closed; application.Status = ApplicationStatus.Closed;

View File

@@ -1,8 +1,7 @@
namespace ApplicationLayer.Services.VisaApplications.Models namespace ApplicationLayer.Services.VisaApplications.Models;
{
public enum AuthorityRequestStatuses public enum AuthorityRequestStatuses
{ {
Approved, Approved,
Rejected Rejected
} }
}

View File

@@ -1,7 +1,7 @@
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
namespace ApplicationLayer.Services.VisaApplications.Models namespace ApplicationLayer.Services.VisaApplications.Models;
{
/// Model of <see cref="VisaApplication"/> /// Model of <see cref="VisaApplication"/>
public class VisaApplicationModelForApplicant public class VisaApplicationModelForApplicant
{ {
@@ -41,4 +41,3 @@ namespace ApplicationLayer.Services.VisaApplications.Models
/// <inheritdoc cref="VisaApplication.ValidDaysRequested"/> /// <inheritdoc cref="VisaApplication.ValidDaysRequested"/>
public int ValidDaysRequested { get; set; } public int ValidDaysRequested { get; set; }
} }
}

View File

@@ -1,8 +1,8 @@
using ApplicationLayer.Services.Applicants.Models; using ApplicationLayer.Services.Applicants.Models;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
namespace ApplicationLayer.Services.VisaApplications.Models namespace ApplicationLayer.Services.VisaApplications.Models;
{
/// Model of <see cref="VisaApplication"/> with applicant property /// Model of <see cref="VisaApplication"/> with applicant property
public class VisaApplicationModelForAuthority public class VisaApplicationModelForAuthority
{ {
@@ -44,4 +44,3 @@ namespace ApplicationLayer.Services.VisaApplications.Models
/// <inheritdoc cref="VisaApplication.ValidDaysRequested"/> /// <inheritdoc cref="VisaApplication.ValidDaysRequested"/>
public int ValidDaysRequested { get; set; } public int ValidDaysRequested { get; set; }
} }
}

View File

@@ -2,8 +2,8 @@
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.VisaApplications.Requests.Validation namespace ApplicationLayer.Services.VisaApplications.Requests.Validation;
{
public class PastVisaValidator : AbstractValidator<PastVisa> public class PastVisaValidator : AbstractValidator<PastVisa>
{ {
public PastVisaValidator(IDateTimeProvider dateTimeProvider) public PastVisaValidator(IDateTimeProvider dateTimeProvider)
@@ -25,4 +25,3 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.WithMessage("Name of past visa can not be empty"); .WithMessage("Name of past visa can not be empty");
} }
} }
}

View File

@@ -3,8 +3,8 @@ using Domains;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.VisaApplications.Requests.Validation namespace ApplicationLayer.Services.VisaApplications.Requests.Validation;
{
public class PastVisitValidator : AbstractValidator<PastVisit> public class PastVisitValidator : AbstractValidator<PastVisit>
{ {
public PastVisitValidator(IDateTimeProvider dateTimeProvider) public PastVisitValidator(IDateTimeProvider dateTimeProvider)
@@ -28,4 +28,3 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}"); .WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}");
} }
} }
}

View File

@@ -3,8 +3,8 @@ using Domains;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.VisaApplications.Requests.Validation namespace ApplicationLayer.Services.VisaApplications.Requests.Validation;
{
public class PermissionToDestCountryValidator : AbstractValidator<PermissionToDestCountry?> public class PermissionToDestCountryValidator : AbstractValidator<PermissionToDestCountry?>
{ {
public PermissionToDestCountryValidator(IDateTimeProvider dateTimeProvider) public PermissionToDestCountryValidator(IDateTimeProvider dateTimeProvider)
@@ -22,4 +22,3 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}"); .WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}");
} }
} }
}

View File

@@ -3,8 +3,8 @@ using Domains;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.VisaApplications.Requests.Validation namespace ApplicationLayer.Services.VisaApplications.Requests.Validation;
{
public class ReentryPermitValidator : AbstractValidator<ReentryPermit?> public class ReentryPermitValidator : AbstractValidator<ReentryPermit?>
{ {
public ReentryPermitValidator(IDateTimeProvider dateTimeProvider) public ReentryPermitValidator(IDateTimeProvider dateTimeProvider)
@@ -22,4 +22,3 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.WithMessage("Re-entry permit must not be expired"); .WithMessage("Re-entry permit must not be expired");
} }
} }
}

View File

@@ -4,8 +4,8 @@ using Domains;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using FluentValidation; using FluentValidation;
namespace ApplicationLayer.Services.VisaApplications.Requests.Validation namespace ApplicationLayer.Services.VisaApplications.Requests.Validation;
{
public class VisaApplicationCreateRequestValidator : AbstractValidator<VisaApplicationCreateRequest> public class VisaApplicationCreateRequestValidator : AbstractValidator<VisaApplicationCreateRequest>
{ {
public VisaApplicationCreateRequestValidator( public VisaApplicationCreateRequestValidator(
@@ -20,7 +20,7 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.NotEmpty() .NotEmpty()
.WithMessage("Non-residents must provide re-entry permission") .WithMessage("Non-residents must provide re-entry permission")
.SetValidator(reentryPermitValidator) .SetValidator(reentryPermitValidator)
.WhenAsync(async (r, ct) => .WhenAsync(async (_, ct) =>
await applicants.IsApplicantNonResidentByUserId(userIdProvider.GetUserId(), ct)); await applicants.IsApplicantNonResidentByUserId(userIdProvider.GetUserId(), ct));
RuleFor(r => r.DestinationCountry) RuleFor(r => r.DestinationCountry)
@@ -51,4 +51,3 @@ namespace ApplicationLayer.Services.VisaApplications.Requests.Validation
.SetValidator(pastVisitValidator); .SetValidator(pastVisitValidator);
} }
} }
}

View File

@@ -1,5 +1,5 @@
namespace Domains namespace Domains;
{
public static class ConfigurationConstraints public static class ConfigurationConstraints
{ {
public const int CityNameLength = 70; public const int CityNameLength = 70;
@@ -21,4 +21,3 @@
public const int JobTitleLength = 50; public const int JobTitleLength = 50;
public const int MaxValidDays = 90; public const int MaxValidDays = 90;
} }
}

View File

@@ -1,5 +1,5 @@
namespace Domains.Users namespace Domains.Users;
{
/// Role of <see cref="User"/> /// Role of <see cref="User"/>
public enum Role public enum Role
{ {
@@ -10,4 +10,3 @@
/// Manages approving authorities /// Manages approving authorities
Admin Admin
} }
}

View File

@@ -1,5 +1,5 @@
namespace Domains.Users namespace Domains.Users;
{
public class User : IEntity public class User : IEntity
{ {
/// Unique Identifier of <see cref="User"/> /// Unique Identifier of <see cref="User"/>
@@ -11,4 +11,3 @@
public string Password { get; set; } = null!; public string Password { get; set; } = null!;
} }
}

View File

@@ -1,5 +1,5 @@
namespace Domains.VisaApplicationDomain namespace Domains.VisaApplicationDomain;
{
public enum ApplicationStatus public enum ApplicationStatus
{ {
/// Waits for approve /// Waits for approve
@@ -9,4 +9,3 @@
/// Closed by applicant /// Closed by applicant
Closed Closed
} }
}

View File

@@ -3,9 +3,9 @@ using ApplicationLayer.InfrastructureServicesInterfaces;
using ApplicationLayer.Services.AuthServices.NeededServices; using ApplicationLayer.Services.AuthServices.NeededServices;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Infrastructure.Auth namespace Infrastructure.Auth;
{
public static class ServiceCollectionsExtensions public static class ServiceCollectionExtensions
{ {
public static IServiceCollection AddTokenGenerator(this IServiceCollection services, TokenGeneratorOptions options) public static IServiceCollection AddTokenGenerator(this IServiceCollection services, TokenGeneratorOptions options)
{ {
@@ -21,4 +21,3 @@ namespace Infrastructure.Auth
return services; return services;
} }
} }
}

View File

@@ -4,11 +4,16 @@ using ApplicationLayer.InfrastructureServicesInterfaces;
using ApplicationLayer.Services.AuthServices.NeededServices; using ApplicationLayer.Services.AuthServices.NeededServices;
using Domains.Users; using Domains.Users;
namespace Infrastructure.Auth namespace Infrastructure.Auth;
{
/// <inheritdoc cref="ITokenGenerator"/>
/// <param name="options">options kind of one in authorization registration in DI methods</param>
/// <param name="tokenHandler">token handler</param>
/// <param name="dateTimeProvider">date time provider</param>
public class TokenGenerator(TokenGeneratorOptions options, JwtSecurityTokenHandler tokenHandler, IDateTimeProvider dateTimeProvider) public class TokenGenerator(TokenGeneratorOptions options, JwtSecurityTokenHandler tokenHandler, IDateTimeProvider dateTimeProvider)
: ITokenGenerator : ITokenGenerator
{ {
/// <inheritdoc cref="ITokenGenerator.CreateToken"/>
public string CreateToken(User user) public string CreateToken(User user)
{ {
var claims = new List<Claim> var claims = new List<Claim>
@@ -27,4 +32,3 @@ namespace Infrastructure.Auth
return tokenHandler.WriteToken(token); return tokenHandler.WriteToken(token);
} }
} }
}

View File

@@ -1,6 +1,5 @@
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
namespace Infrastructure.Auth namespace Infrastructure.Auth;
{
public record TokenGeneratorOptions(string Issuer, string Audience, TimeSpan ValidTime, SigningCredentials Credentials); public record TokenGeneratorOptions(string Issuer, string Audience, TimeSpan ValidTime, SigningCredentials Credentials);
}

View File

@@ -3,8 +3,8 @@ using ApplicationLayer.Services.AuthServices.Requests;
using AutoMapper; using AutoMapper;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
namespace Infrastructure.Automapper.Profiles namespace Infrastructure.Automapper.Profiles;
{
public class ApplicantProfile : Profile public class ApplicantProfile : Profile
{ {
public ApplicantProfile() public ApplicantProfile()
@@ -17,4 +17,3 @@ namespace Infrastructure.Automapper.Profiles
opts => opts.MapFrom(r => r.ApplicantName)); opts => opts.MapFrom(r => r.ApplicantName));
} }
} }
}

View File

@@ -2,8 +2,8 @@
using AutoMapper; using AutoMapper;
using Domains.ApplicantDomain; using Domains.ApplicantDomain;
namespace Infrastructure.Automapper.Profiles namespace Infrastructure.Automapper.Profiles;
{
public class PlaceOfWorkProfile : Profile public class PlaceOfWorkProfile : Profile
{ {
public PlaceOfWorkProfile() public PlaceOfWorkProfile()
@@ -13,4 +13,3 @@ namespace Infrastructure.Automapper.Profiles
opts => opts.UseDestinationValue()); opts => opts.UseDestinationValue());
} }
} }
}

View File

@@ -2,8 +2,8 @@
using AutoMapper; using AutoMapper;
using Domains.Users; using Domains.Users;
namespace Infrastructure.Automapper.Profiles namespace Infrastructure.Automapper.Profiles;
{
public class UserProfile : Profile public class UserProfile : Profile
{ {
public UserProfile() public UserProfile()
@@ -13,4 +13,3 @@ namespace Infrastructure.Automapper.Profiles
opts => opts.Ignore()); opts => opts.Ignore());
} }
} }
}

View File

@@ -3,8 +3,8 @@ using ApplicationLayer.Services.VisaApplications.Requests;
using AutoMapper; using AutoMapper;
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
namespace Infrastructure.Automapper.Profiles namespace Infrastructure.Automapper.Profiles;
{
public class VisaApplicationProfile : Profile public class VisaApplicationProfile : Profile
{ {
public VisaApplicationProfile() public VisaApplicationProfile()
@@ -22,4 +22,3 @@ namespace Infrastructure.Automapper.Profiles
opts => opts.Ignore()); opts => opts.Ignore());
} }
} }
}

View File

@@ -1,10 +1,9 @@
using ApplicationLayer.InfrastructureServicesInterfaces; using ApplicationLayer.InfrastructureServicesInterfaces;
namespace Infrastructure.Common namespace Infrastructure.Common;
{
/// Implements <see cref="IDateTimeProvider"/> /// Implements <see cref="IDateTimeProvider"/>
public class DateTimeProvider : IDateTimeProvider public class DateTimeProvider : IDateTimeProvider
{ {
DateTime IDateTimeProvider.Now() => DateTime.Now; DateTime IDateTimeProvider.Now() => DateTime.Now;
} }
}

View File

@@ -2,8 +2,8 @@
using ApplicationLayer.InfrastructureServicesInterfaces; using ApplicationLayer.InfrastructureServicesInterfaces;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
namespace Infrastructure.Common namespace Infrastructure.Common;
{
public class UserIdProvider(IHttpContextAccessor contextAccessor) : IUserIdProvider public class UserIdProvider(IHttpContextAccessor contextAccessor) : IUserIdProvider
{ {
Guid IUserIdProvider.GetUserId() Guid IUserIdProvider.GetUserId()
@@ -16,4 +16,3 @@ namespace Infrastructure.Common
return Guid.Parse(claim.Value); return Guid.Parse(claim.Value);
} }
} }
}

View File

@@ -1,6 +1,5 @@
using ApplicationLayer.Services.GeneralExceptions; using ApplicationLayer.Services.GeneralExceptions;
namespace Infrastructure.Database.Applicants.Repositories.Exceptions namespace Infrastructure.Database.Applicants.Repositories.Exceptions;
{
public class ApplicantNotFoundByUserIdException() : EntityNotFoundException("Applicant not found."); public class ApplicantNotFoundByUserIdException() : EntityNotFoundException("Applicant not found.");
}

View File

@@ -3,8 +3,8 @@ using Domains.Users;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.Users.Configuration namespace Infrastructure.Database.Users.Configuration;
{
public class UserConfiguration : IEntityTypeConfiguration<User> public class UserConfiguration : IEntityTypeConfiguration<User>
{ {
public void Configure(EntityTypeBuilder<User> entity) public void Configure(EntityTypeBuilder<User> entity)
@@ -20,4 +20,3 @@ namespace Infrastructure.Database.Users.Configuration
.HasMaxLength(ConfigurationConstraints.PasswordLength); .HasMaxLength(ConfigurationConstraints.PasswordLength);
} }
} }
}

View File

@@ -3,8 +3,8 @@ using Domains.Users;
using Infrastructure.Database.Generic; using Infrastructure.Database.Generic;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace Infrastructure.Database.Users.Repositories namespace Infrastructure.Database.Users.Repositories;
{
/// <inheritdoc cref="IUsersRepository"/> /// <inheritdoc cref="IUsersRepository"/>
public class UsersRepository(IGenericReader reader, IGenericWriter writer) public class UsersRepository(IGenericReader reader, IGenericWriter writer)
: GenericRepository<User>(reader, writer), IUsersRepository : GenericRepository<User>(reader, writer), IUsersRepository
@@ -19,4 +19,3 @@ namespace Infrastructure.Database.Users.Repositories
return await LoadDomain().Where(u => u.Role == role).ToListAsync(cancellationToken); return await LoadDomain().Where(u => u.Role == role).ToListAsync(cancellationToken);
} }
} }
}

View File

@@ -2,8 +2,8 @@
using Domains.VisaApplicationDomain; using Domains.VisaApplicationDomain;
using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Infrastructure.Database.VisaApplications.Configuration namespace Infrastructure.Database.VisaApplications.Configuration;
{
public static class PastVisitConfiguration<T> where T : class, IEntity public static class PastVisitConfiguration<T> where T : class, IEntity
{ {
public static void Configure(OwnedNavigationBuilder<T, PastVisit> entity) public static void Configure(OwnedNavigationBuilder<T, PastVisit> entity)
@@ -13,4 +13,3 @@ namespace Infrastructure.Database.VisaApplications.Configuration
.HasMaxLength(ConfigurationConstraints.CountryNameLength); .HasMaxLength(ConfigurationConstraints.CountryNameLength);
} }
} }
}

View File

@@ -1,7 +1,6 @@
using ApplicationLayer.Services.GeneralExceptions; using ApplicationLayer.Services.GeneralExceptions;
namespace Infrastructure.Database.VisaApplications.Repositories.Exceptions namespace Infrastructure.Database.VisaApplications.Repositories.Exceptions;
{
public class ApplicationNotFoundByApplicantAndApplicationIdException(Guid applicationId) public class ApplicationNotFoundByApplicantAndApplicationIdException(Guid applicationId)
: EntityNotFoundException($"Application with id {applicationId} not found for authenticated user"); : EntityNotFoundException($"Application with id {applicationId} not found for authenticated user");
}

View File

@@ -2,8 +2,8 @@
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerGen;
namespace SchengenVisaApi.Common namespace SchengenVisaApi.Common;
{
/// Adds auth for swagger /// Adds auth for swagger
public class ConfigureSwaggerOptions : IConfigureOptions<SwaggerGenOptions> public class ConfigureSwaggerOptions : IConfigureOptions<SwaggerGenOptions>
{ {
@@ -35,4 +35,3 @@ namespace SchengenVisaApi.Common
}); });
} }
} }
}

View File

@@ -1,5 +1,4 @@
namespace SchengenVisaApi.Common namespace SchengenVisaApi.Common;
{
#pragma warning disable CS1591 #pragma warning disable CS1591
public static class PolicyConstants public static class PolicyConstants
{ {
@@ -8,5 +7,3 @@
public const string ApprovingAuthorityPolicy = "ApprovingAuthorityPolicy"; public const string ApprovingAuthorityPolicy = "ApprovingAuthorityPolicy";
} }
#pragma warning enable CS1591 #pragma warning enable CS1591
}

View File

@@ -10,8 +10,8 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SchengenVisaApi.Common; using SchengenVisaApi.Common;
namespace SchengenVisaApi.Controllers namespace SchengenVisaApi.Controllers;
{
///<summary> Controller for user-auth and registration </summary> ///<summary> Controller for user-auth and registration </summary>
[ApiController] [ApiController]
[Route("users")] [Route("users")]
@@ -112,4 +112,3 @@ namespace SchengenVisaApi.Controllers
return Ok(); return Ok();
} }
} }
}

View File

@@ -1,4 +1,3 @@
using ApplicationLayer.InfrastructureServicesInterfaces;
using ApplicationLayer.Services.VisaApplications.Handlers; using ApplicationLayer.Services.VisaApplications.Handlers;
using ApplicationLayer.Services.VisaApplications.Models; using ApplicationLayer.Services.VisaApplications.Models;
using ApplicationLayer.Services.VisaApplications.Requests; using ApplicationLayer.Services.VisaApplications.Requests;
@@ -14,7 +13,6 @@ namespace SchengenVisaApi.Controllers;
[Route("visaApplications")] [Route("visaApplications")]
public class VisaApplicationController( public class VisaApplicationController(
IVisaApplicationRequestsHandler visaApplicationRequestsHandler, IVisaApplicationRequestsHandler visaApplicationRequestsHandler,
IUserIdProvider userIdProvider,
IValidator<VisaApplicationCreateRequest> visaApplicationCreateRequestValidator) : ControllerBase IValidator<VisaApplicationCreateRequest> visaApplicationCreateRequestValidator) : ControllerBase
{ {
/// <summary> Returns all applications from DB </summary> /// <summary> Returns all applications from DB </summary>
@@ -41,8 +39,7 @@ public class VisaApplicationController(
[Route("OfApplicant")] [Route("OfApplicant")]
public async Task<IActionResult> GetForApplicant(CancellationToken cancellationToken) public async Task<IActionResult> GetForApplicant(CancellationToken cancellationToken)
{ {
var userId = userIdProvider.GetUserId(); var result = await visaApplicationRequestsHandler.GetForApplicantAsync(cancellationToken);
var result = await visaApplicationRequestsHandler.GetForApplicantAsync(userId, cancellationToken);
return Ok(result); return Ok(result);
} }
@@ -59,8 +56,7 @@ public class VisaApplicationController(
{ {
await visaApplicationCreateRequestValidator.ValidateAndThrowAsync(request, cancellationToken); await visaApplicationCreateRequestValidator.ValidateAndThrowAsync(request, cancellationToken);
var userId = userIdProvider.GetUserId(); await visaApplicationRequestsHandler.HandleCreateRequestAsync(request, cancellationToken);
await visaApplicationRequestsHandler.HandleCreateRequestAsync(userId, request, cancellationToken);
return Ok(); return Ok();
} }
@@ -75,8 +71,7 @@ public class VisaApplicationController(
[Route("{applicationId:guid}")] [Route("{applicationId:guid}")]
public async Task<IActionResult> CloseApplication(Guid applicationId, CancellationToken cancellationToken) public async Task<IActionResult> CloseApplication(Guid applicationId, CancellationToken cancellationToken)
{ {
var userId = userIdProvider.GetUserId(); await visaApplicationRequestsHandler.HandleCloseRequestAsync(applicationId, cancellationToken);
await visaApplicationRequestsHandler.HandleCloseRequestAsync(userId, applicationId, cancellationToken);
return Ok(); return Ok();
} }

View File

@@ -6,8 +6,8 @@ using FluentValidation;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
namespace SchengenVisaApi.ExceptionFilters namespace SchengenVisaApi.ExceptionFilters;
{
/// Handles <see cref="ApiException"/> /// Handles <see cref="ApiException"/>
public class GlobalExceptionsFilter : IAsyncExceptionFilter public class GlobalExceptionsFilter : IAsyncExceptionFilter
{ {
@@ -69,4 +69,3 @@ namespace SchengenVisaApi.ExceptionFilters
context.ExceptionHandled = true; context.ExceptionHandled = true;
} }
} }
}