From 2fd188ad5734ef8399de19a170e869b8fb5ad78c Mon Sep 17 00:00:00 2001 From: lumijiez <59575049+lumijiez@users.noreply.github.com> Date: Tue, 10 Jun 2025 20:17:31 +0300 Subject: [PATCH] Add UserRole controller + bits and pieces --- src/Imprink.Application/IUnitOfWork.cs | 3 +++ .../Users/GetUserRolesHandler.cs | 15 ++++++++++++ .../Products/ICategoryRepository.cs | 2 +- .../Products/IProductRepository.cs | 2 +- .../Products/IProductVariantRepository.cs | 2 +- .../Products/CategoryRepository.cs | 4 ++-- .../Products/ProductRepository.cs | 3 ++- .../Products/ProductVariantRepository.cs | 4 ++-- .../Repositories/Users/RoleRepository.cs | 2 +- .../Repositories/Users/UserRepository.cs | 2 +- .../Repositories/Users/UserRoleRepository.cs | 2 +- src/Imprink.Infrastructure/UnitOfWork.cs | 8 +++++-- .../Controllers/Users/UserRoleController.cs | 23 +++++++++++++++++++ src/Imprink.WebApi/Startup.cs | 3 +++ 14 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 src/Imprink.Application/Users/GetUserRolesHandler.cs create mode 100644 src/Imprink.WebApi/Controllers/Users/UserRoleController.cs diff --git a/src/Imprink.Application/IUnitOfWork.cs b/src/Imprink.Application/IUnitOfWork.cs index f76067f..0d602ab 100644 --- a/src/Imprink.Application/IUnitOfWork.cs +++ b/src/Imprink.Application/IUnitOfWork.cs @@ -1,4 +1,5 @@ using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; namespace Imprink.Application; @@ -8,6 +9,8 @@ public interface IUnitOfWork public ICategoryRepository CategoryRepository { get; } public IProductVariantRepository ProductVariantRepository { get; } public IUserRepository UserRepository { get; } + public IUserRoleRepository UserRoleRepository { get; } + public IRoleRepository RoleRepository { get; } Task SaveAsync(CancellationToken cancellationToken = default); Task BeginTransactionAsync(CancellationToken cancellationToken = default); diff --git a/src/Imprink.Application/Users/GetUserRolesHandler.cs b/src/Imprink.Application/Users/GetUserRolesHandler.cs new file mode 100644 index 0000000..3d9845f --- /dev/null +++ b/src/Imprink.Application/Users/GetUserRolesHandler.cs @@ -0,0 +1,15 @@ +using Imprink.Domain.Entities.Users; +using MediatR; + +namespace Imprink.Application.Users; + +public record GetUserRolesCommand(string Sub) : IRequest>; + +public class GetUserRolesHandler(IUnitOfWork uw): IRequestHandler> +{ + public async Task> Handle(GetUserRolesCommand request, CancellationToken cancellationToken) + { + if (await uw.UserRepository.UserExistsAsync(request.Sub, cancellationToken)) return []; + return await uw.UserRoleRepository.GetUserRolesAsync(request.Sub, cancellationToken);; + } +} \ No newline at end of file diff --git a/src/Imprink.Domain/Repositories/Products/ICategoryRepository.cs b/src/Imprink.Domain/Repositories/Products/ICategoryRepository.cs index ef79aad..3308a6e 100644 --- a/src/Imprink.Domain/Repositories/Products/ICategoryRepository.cs +++ b/src/Imprink.Domain/Repositories/Products/ICategoryRepository.cs @@ -1,6 +1,6 @@ using Imprink.Domain.Entities.Product; -namespace Imprink.Domain.Repositories; +namespace Imprink.Domain.Repositories.Products; public interface ICategoryRepository { diff --git a/src/Imprink.Domain/Repositories/Products/IProductRepository.cs b/src/Imprink.Domain/Repositories/Products/IProductRepository.cs index f77d96d..9fd577e 100644 --- a/src/Imprink.Domain/Repositories/Products/IProductRepository.cs +++ b/src/Imprink.Domain/Repositories/Products/IProductRepository.cs @@ -1,7 +1,7 @@ using Imprink.Domain.Entities.Product; using Imprink.Domain.Models; -namespace Imprink.Domain.Repositories; +namespace Imprink.Domain.Repositories.Products; public interface IProductRepository { diff --git a/src/Imprink.Domain/Repositories/Products/IProductVariantRepository.cs b/src/Imprink.Domain/Repositories/Products/IProductVariantRepository.cs index 8b98c45..ae8af5e 100644 --- a/src/Imprink.Domain/Repositories/Products/IProductVariantRepository.cs +++ b/src/Imprink.Domain/Repositories/Products/IProductVariantRepository.cs @@ -1,6 +1,6 @@ using Imprink.Domain.Entities.Product; -namespace Imprink.Domain.Repositories; +namespace Imprink.Domain.Repositories.Products; public interface IProductVariantRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Products/CategoryRepository.cs b/src/Imprink.Infrastructure/Repositories/Products/CategoryRepository.cs index c71678f..ac1f0c9 100644 --- a/src/Imprink.Infrastructure/Repositories/Products/CategoryRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Products/CategoryRepository.cs @@ -1,9 +1,9 @@ using Imprink.Domain.Entities.Product; -using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Products; public class CategoryRepository(ApplicationDbContext context) : ICategoryRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Products/ProductRepository.cs b/src/Imprink.Infrastructure/Repositories/Products/ProductRepository.cs index 72fbc4a..4b0427e 100644 --- a/src/Imprink.Infrastructure/Repositories/Products/ProductRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Products/ProductRepository.cs @@ -1,10 +1,11 @@ using Imprink.Domain.Entities.Product; using Imprink.Domain.Models; using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Products; public class ProductRepository(ApplicationDbContext context) : IProductRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Products/ProductVariantRepository.cs b/src/Imprink.Infrastructure/Repositories/Products/ProductVariantRepository.cs index a7255cc..4b23bb5 100644 --- a/src/Imprink.Infrastructure/Repositories/Products/ProductVariantRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Products/ProductVariantRepository.cs @@ -1,9 +1,9 @@ using Imprink.Domain.Entities.Product; -using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Products; public class ProductVariantRepository(ApplicationDbContext context) : IProductVariantRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Users/RoleRepository.cs b/src/Imprink.Infrastructure/Repositories/Users/RoleRepository.cs index e6c979c..bf64712 100644 --- a/src/Imprink.Infrastructure/Repositories/Users/RoleRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Users/RoleRepository.cs @@ -3,7 +3,7 @@ using Imprink.Domain.Repositories; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Users; public class RoleRepository(ApplicationDbContext context) : IRoleRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Users/UserRepository.cs b/src/Imprink.Infrastructure/Repositories/Users/UserRepository.cs index 5ba761b..93b4d9b 100644 --- a/src/Imprink.Infrastructure/Repositories/Users/UserRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Users/UserRepository.cs @@ -4,7 +4,7 @@ using Imprink.Domain.Repositories; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Users; public class UserRepository(ApplicationDbContext context) : IUserRepository { diff --git a/src/Imprink.Infrastructure/Repositories/Users/UserRoleRepository.cs b/src/Imprink.Infrastructure/Repositories/Users/UserRoleRepository.cs index c253a16..bb57623 100644 --- a/src/Imprink.Infrastructure/Repositories/Users/UserRoleRepository.cs +++ b/src/Imprink.Infrastructure/Repositories/Users/UserRoleRepository.cs @@ -3,7 +3,7 @@ using Imprink.Domain.Repositories; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; -namespace Imprink.Infrastructure.Repositories; +namespace Imprink.Infrastructure.Repositories.Users; public class UserRoleRepository(ApplicationDbContext context) : IUserRoleRepository { diff --git a/src/Imprink.Infrastructure/UnitOfWork.cs b/src/Imprink.Infrastructure/UnitOfWork.cs index 317cdd8..161c867 100644 --- a/src/Imprink.Infrastructure/UnitOfWork.cs +++ b/src/Imprink.Infrastructure/UnitOfWork.cs @@ -1,7 +1,7 @@ using Imprink.Application; using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; using Imprink.Infrastructure.Database; -using Microsoft.Identity.Client; namespace Imprink.Infrastructure; @@ -10,12 +10,16 @@ public class UnitOfWork( IProductRepository productRepository, IProductVariantRepository productVariantRepository, ICategoryRepository categoryRepository, - IUserRepository userRepository) : IUnitOfWork + IUserRepository userRepository, + IUserRoleRepository userRoleRepository, + IRoleRepository roleRepository) : IUnitOfWork { public IProductRepository ProductRepository => productRepository; public IProductVariantRepository ProductVariantRepository => productVariantRepository; public ICategoryRepository CategoryRepository => categoryRepository; public IUserRepository UserRepository => userRepository; + public IUserRoleRepository UserRoleRepository => userRoleRepository; + public IRoleRepository RoleRepository => roleRepository; public async Task SaveAsync(CancellationToken cancellationToken = default) { diff --git a/src/Imprink.WebApi/Controllers/Users/UserRoleController.cs b/src/Imprink.WebApi/Controllers/Users/UserRoleController.cs new file mode 100644 index 0000000..0b68dd2 --- /dev/null +++ b/src/Imprink.WebApi/Controllers/Users/UserRoleController.cs @@ -0,0 +1,23 @@ +using System.Security.Claims; +using Imprink.Application.Users; +using MediatR; +using Microsoft.AspNetCore.Mvc; + +namespace Imprink.WebApi.Controllers.Users; + +[ApiController] +[Route("/api/users/roles")] +public class UserRoleController(IMediator mediator) : ControllerBase +{ + //[Authorize] + [HttpGet("me")] + public async Task GetMyRoles() + { + var claims = User.Claims as Claim[] ?? User.Claims.ToArray(); + var sub = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value ?? string.Empty; + + var myRoles = await mediator.Send(new GetUserRolesCommand(sub)); + + return Ok(myRoles); + } +} \ No newline at end of file diff --git a/src/Imprink.WebApi/Startup.cs b/src/Imprink.WebApi/Startup.cs index 8e6e29d..dc74704 100644 --- a/src/Imprink.WebApi/Startup.cs +++ b/src/Imprink.WebApi/Startup.cs @@ -4,9 +4,12 @@ using Imprink.Application; using Imprink.Application.Products.Create; using Imprink.Application.Validation.Models; using Imprink.Domain.Repositories; +using Imprink.Domain.Repositories.Products; using Imprink.Infrastructure; using Imprink.Infrastructure.Database; using Imprink.Infrastructure.Repositories; +using Imprink.Infrastructure.Repositories.Products; +using Imprink.Infrastructure.Repositories.Users; using Imprink.WebApi.Filters; using Imprink.WebApi.Middleware; using Microsoft.AspNetCore.Authentication.JwtBearer;