Merge pull request #4 from prtsie/users-controller
completed users controller
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using ApplicationLayer.Services.AuthServices.LoginService;
|
using ApplicationLayer.Services.ApprovingAuthorities;
|
||||||
|
using ApplicationLayer.Services.AuthServices.LoginService;
|
||||||
using ApplicationLayer.Services.AuthServices.RegisterService;
|
using ApplicationLayer.Services.AuthServices.RegisterService;
|
||||||
using ApplicationLayer.Services.VisaApplications.Handlers;
|
using ApplicationLayer.Services.VisaApplications.Handlers;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@@ -14,6 +15,7 @@ public static class DependencyInjection
|
|||||||
services.AddScoped<IVisaApplicationRequestsHandler, VisaApplicationRequestsHandler>();
|
services.AddScoped<IVisaApplicationRequestsHandler, VisaApplicationRequestsHandler>();
|
||||||
|
|
||||||
services.AddScoped<IRegisterService, RegisterService>();
|
services.AddScoped<IRegisterService, RegisterService>();
|
||||||
|
services.AddScoped<IUsersService, UsersService>();
|
||||||
|
|
||||||
if (isDevelopment)
|
if (isDevelopment)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using ApplicationLayer.Services.AuthServices.Requests;
|
||||||
|
using Domains.Users;
|
||||||
|
|
||||||
|
namespace ApplicationLayer.Services.ApprovingAuthorities
|
||||||
|
{
|
||||||
|
/// user accounts service
|
||||||
|
public interface IUsersService
|
||||||
|
{
|
||||||
|
/// Returns all user accounts with role of approving authority
|
||||||
|
/// <param name="cancellationToken">Cancellation token</param>
|
||||||
|
Task<List<User>> GetAuthoritiesAccountsAsync(CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// Changes authentication data for an account
|
||||||
|
/// <param name="userId">identifier of account</param>
|
||||||
|
/// <param name="data">request data with new email and password</param>
|
||||||
|
/// <param name="cancellationToken">Cancellation token</param>
|
||||||
|
Task ChangeAccountAuthDataAsync(Guid userId, RegisterRequest data, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// Removes user account
|
||||||
|
/// <param name="userId">Identifier of account</param>
|
||||||
|
/// <param name="cancellationToken">Cancellation token</param>
|
||||||
|
Task RemoveUserAccount(Guid userId, CancellationToken cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using ApplicationLayer.InfrastructureServicesInterfaces;
|
||||||
|
using ApplicationLayer.Services.AuthServices.NeededServices;
|
||||||
|
using ApplicationLayer.Services.AuthServices.Requests;
|
||||||
|
using Domains.Users;
|
||||||
|
|
||||||
|
namespace ApplicationLayer.Services.ApprovingAuthorities
|
||||||
|
{
|
||||||
|
public class UsersService(IUsersRepository users, IUnitOfWork unitOfWork) : IUsersService
|
||||||
|
{
|
||||||
|
async Task<List<User>> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return await users.GetAllOfRoleAsync(Role.ApprovingAuthority, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task IUsersService.ChangeAccountAuthDataAsync(Guid userId, RegisterRequest data, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var user = await users.GetByIdAsync(userId, cancellationToken);
|
||||||
|
|
||||||
|
user.Email = data.Email;
|
||||||
|
user.Password = data.Password;
|
||||||
|
await users.UpdateAsync(user, cancellationToken);
|
||||||
|
|
||||||
|
await unitOfWork.SaveAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task IUsersService.RemoveUserAccount(Guid userId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var user = await users.GetByIdAsync(userId, cancellationToken);
|
||||||
|
users.Remove(user);
|
||||||
|
|
||||||
|
await unitOfWork.SaveAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,5 +11,11 @@ namespace ApplicationLayer.Services.AuthServices.NeededServices
|
|||||||
/// <param name="cancellationToken">Cancellation token</param>
|
/// <param name="cancellationToken">Cancellation token</param>
|
||||||
/// <returns>User or null if not found</returns>
|
/// <returns>User or null if not found</returns>
|
||||||
Task<User?> FindByEmailAsync(string email, CancellationToken cancellationToken);
|
Task<User?> FindByEmailAsync(string email, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// Returns all accounts with specific role
|
||||||
|
/// <param name="role">role</param>
|
||||||
|
/// <param name="cancellationToken">cancellation token</param>
|
||||||
|
/// <returns>list of accounts</returns>
|
||||||
|
Task<List<User>> GetAllOfRoleAsync(Role role, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,10 @@ namespace Infrastructure.Database.Users.Repositories
|
|||||||
{
|
{
|
||||||
return await LoadDomain().SingleOrDefaultAsync(u => u.Email == email, cancellationToken);
|
return await LoadDomain().SingleOrDefaultAsync(u => u.Email == email, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async Task<List<User>> IUsersRepository.GetAllOfRoleAsync(Role role, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return await LoadDomain().Where(u => u.Role == role).ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using ApplicationLayer.Services.AuthServices.LoginService;
|
using ApplicationLayer.Services.ApprovingAuthorities;
|
||||||
|
using ApplicationLayer.Services.AuthServices.LoginService;
|
||||||
using ApplicationLayer.Services.AuthServices.RegisterService;
|
using ApplicationLayer.Services.AuthServices.RegisterService;
|
||||||
using ApplicationLayer.Services.AuthServices.Requests;
|
using ApplicationLayer.Services.AuthServices.Requests;
|
||||||
|
using Domains.Users;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using SchengenVisaApi.Common;
|
using SchengenVisaApi.Common;
|
||||||
@@ -9,14 +11,17 @@ namespace SchengenVisaApi.Controllers
|
|||||||
{
|
{
|
||||||
///<summary> Controller for user-auth and registration </summary>
|
///<summary> Controller for user-auth and registration </summary>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("auth")]
|
[Route("users")]
|
||||||
public class UsersController(IRegisterService registerService, ILoginService loginService) : ControllerBase
|
public class UsersController(
|
||||||
|
IRegisterService registerService,
|
||||||
|
ILoginService loginService,
|
||||||
|
IUsersService authorityService) : VisaApiControllerBase
|
||||||
{
|
{
|
||||||
/// <summary> Adds applicant with user account to DB </summary>
|
/// <summary> Adds applicant with user account to DB </summary>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||||
[Route("applicant")]
|
[Route("register")]
|
||||||
public async Task<IActionResult> Register(RegisterApplicantRequest request, CancellationToken cancellationToken)
|
public async Task<IActionResult> Register(RegisterApplicantRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await registerService.Register(request, cancellationToken);
|
await registerService.Register(request, cancellationToken);
|
||||||
@@ -42,10 +47,55 @@ namespace SchengenVisaApi.Controllers
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
[ProducesResponseType<string>(StatusCodes.Status200OK)]
|
[ProducesResponseType<string>(StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
|
[Route("login")]
|
||||||
public async Task<IActionResult> Login(string email, string password, CancellationToken cancellationToken)
|
public async Task<IActionResult> Login(string email, string password, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var result = await loginService.LoginAsync(new UserLoginRequest(email, password), cancellationToken);
|
var result = await loginService.LoginAsync(new UserLoginRequest(email, password), cancellationToken);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Returns list of authority accounts </summary>
|
||||||
|
/// <remarks> Accessible only for admins </remarks>
|
||||||
|
[HttpGet]
|
||||||
|
[ProducesResponseType<List<User>>(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
|
[Route("authority")]
|
||||||
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
|
public async Task<IActionResult> GetAuthorityAccounts(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var result = await authorityService.GetAuthoritiesAccountsAsync(cancellationToken);
|
||||||
|
return Ok(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Changes authority's account authentication data </summary>
|
||||||
|
/// <remarks> Accessible only for admins </remarks>
|
||||||
|
[HttpPut]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
|
[Route("authority/{authorityAccountId:guid}")]
|
||||||
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
|
public async Task<IActionResult> ChangeAuthorityAuthData(Guid authorityAccountId, RegisterRequest authData, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await authorityService.ChangeAccountAuthDataAsync(authorityAccountId, authData, cancellationToken);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Removes authority's account authentication data </summary>
|
||||||
|
/// <remarks> Accessible only for admins </remarks>
|
||||||
|
[HttpDelete]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
|
[Route("authority/{authorityAccountId:guid}")]
|
||||||
|
[Authorize(policy: PolicyConstants.AdminPolicy)]
|
||||||
|
public async Task<IActionResult> RemoveAuthorityAccount(Guid authorityAccountId, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await authorityService.RemoveUserAccount(authorityAccountId, cancellationToken);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using System.Security.Claims;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace SchengenVisaApi.Controllers
|
||||||
|
{
|
||||||
|
/// Base controller class for api controllers in project
|
||||||
|
public abstract class VisaApiControllerBase : ControllerBase
|
||||||
|
{
|
||||||
|
/// Returns identifier of authenticated user
|
||||||
|
protected Guid GetUserId() => Guid.Parse(HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,8 +11,8 @@ namespace SchengenVisaApi.Controllers;
|
|||||||
|
|
||||||
/// <summary> Controller for <see cref="Domains.VisaApplicationDomain"/> </summary>
|
/// <summary> Controller for <see cref="Domains.VisaApplicationDomain"/> </summary>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("[controller]")]
|
[Route("visaApplication")]
|
||||||
public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : ControllerBase
|
public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : VisaApiControllerBase
|
||||||
{
|
{
|
||||||
//todo should return only pending applications
|
//todo should return only pending applications
|
||||||
//todo should return model
|
//todo should return model
|
||||||
@@ -59,6 +59,4 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli
|
|||||||
await visaApplicationRequestsHandler.HandleCreateRequest(userId, request, cancellationToken);
|
await visaApplicationRequestsHandler.HandleCreateRequest(userId, request, cancellationToken);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Guid GetUserId() => Guid.Parse(HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user