From 2944e3b648b03002e98c9cad39dd8643380f678a Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Fri, 14 Nov 2025 04:37:35 +0330 Subject: [PATCH] Refactor user command handlers and update JWT token logic --- .../SetPasswordForUserCommandHandler.cs | 12 ++++- .../UpdateUser/UpdateUserCommandHandler.cs | 54 ++++++++++++++++++- .../AdminGetJwtTokenQueryHandler.cs | 7 ++- .../FrontOffice.BFF.Domain.csproj | 2 +- .../ConfigureServices.cs | 4 +- .../Services/UserService.cs | 4 +- .../AdminGetJwtTokenRequestValidator.cs | 2 +- .../SetPasswordForUserRequestValidator.cs | 2 +- 8 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/SetPasswordForUser/SetPasswordForUserCommandHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/SetPasswordForUser/SetPasswordForUserCommandHandler.cs index 8e9e30c..2ce2e78 100644 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/SetPasswordForUser/SetPasswordForUserCommandHandler.cs +++ b/src/FrontOffice.BFF.Application/UserCQ/Commands/SetPasswordForUser/SetPasswordForUserCommandHandler.cs @@ -1,16 +1,24 @@ +using CMSMicroservice.Protobuf.Protos.User; + namespace FrontOffice.BFF.Application.UserCQ.Commands.SetPasswordForUser; public class SetPasswordForUserCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; + private readonly ICurrentUserService _currentUserService; - public SetPasswordForUserCommandHandler(IApplicationContractContext context) + public SetPasswordForUserCommandHandler(IApplicationContractContext context, ICurrentUserService currentUserService) { _context = context; + _currentUserService = currentUserService; } public async Task Handle(SetPasswordForUserCommand request, CancellationToken cancellationToken) { - //TODO: Implement your business logic + var setPasswordRequest = request.Adapt(); + setPasswordRequest.UserId = long.Parse(_currentUserService.UserId ?? throw new InvalidOperationException()); + await _context.User.SetPasswordForUserAsync(setPasswordRequest, cancellationToken: cancellationToken); return new Unit(); + + } } diff --git a/src/FrontOffice.BFF.Application/UserCQ/Commands/UpdateUser/UpdateUserCommandHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Commands/UpdateUser/UpdateUserCommandHandler.cs index eec6fa3..7704731 100644 --- a/src/FrontOffice.BFF.Application/UserCQ/Commands/UpdateUser/UpdateUserCommandHandler.cs +++ b/src/FrontOffice.BFF.Application/UserCQ/Commands/UpdateUser/UpdateUserCommandHandler.cs @@ -1,6 +1,7 @@ using CMSMicroservice.Protobuf.Protos.User; namespace FrontOffice.BFF.Application.UserCQ.Commands.UpdateUser; + public class UpdateUserCommandHandler : IRequestHandler { private readonly IApplicationContractContext _context; @@ -12,7 +13,56 @@ public class UpdateUserCommandHandler : IRequestHandler public async Task Handle(UpdateUserCommand request, CancellationToken cancellationToken) { - await _context.User.UpdateUserAsync(request: request.Adapt(), cancellationToken: cancellationToken); + var updatingUserRequest = new UpdateUserRequest(); + var existUser = await _context.User.GetUserAsync(new GetUserRequest() + { + Id = request.Id + }, cancellationToken: cancellationToken); + if (existUser == null) + throw new NotFoundException("User not found"); + + if (!string.IsNullOrEmpty(request.FirstName)) + { + updatingUserRequest.FirstName = request.FirstName; + } + + if (!string.IsNullOrEmpty(request.LastName)) + { + updatingUserRequest.LastName = request.LastName; + } + + if (!string.IsNullOrEmpty(request.NationalCode)) + { + updatingUserRequest.NationalCode = request.NationalCode; + } + if (request.BirthDate.HasValue) + { + updatingUserRequest.BirthDate = Timestamp.FromDateTime(DateTime.SpecifyKind(request.BirthDate.Value, DateTimeKind.Utc));; + } + if (!string.IsNullOrEmpty(request.AvatarPath)) + { + updatingUserRequest.AvatarPath = request.AvatarPath; + } + // if (request.AvatarFile!= null) + // { + // } + if (request.PushNotifications!=existUser.PushNotifications) + { + updatingUserRequest.PushNotifications = request.PushNotifications; + } + + if (request.EmailNotifications!=existUser.EmailNotifications) + { + updatingUserRequest.EmailNotifications = request.EmailNotifications; + } + + if (request.SmsNotifications!=existUser.SmsNotifications) + { + updatingUserRequest.SmsNotifications = request.SmsNotifications; + } + + await _context.User.UpdateUserAsync(request: request.Adapt(), + cancellationToken: cancellationToken); return Unit.Value; } -} +} \ No newline at end of file diff --git a/src/FrontOffice.BFF.Application/UserCQ/Queries/AdminGetJwtToken/AdminGetJwtTokenQueryHandler.cs b/src/FrontOffice.BFF.Application/UserCQ/Queries/AdminGetJwtToken/AdminGetJwtTokenQueryHandler.cs index c62ca02..dd0c329 100644 --- a/src/FrontOffice.BFF.Application/UserCQ/Queries/AdminGetJwtToken/AdminGetJwtTokenQueryHandler.cs +++ b/src/FrontOffice.BFF.Application/UserCQ/Queries/AdminGetJwtToken/AdminGetJwtTokenQueryHandler.cs @@ -1,3 +1,5 @@ +using CMSMicroservice.Protobuf.Protos.User; + namespace FrontOffice.BFF.Application.UserCQ.Queries.AdminGetJwtToken; public class AdminGetJwtTokenQueryHandler : IRequestHandler { @@ -10,7 +12,8 @@ public class AdminGetJwtTokenQueryHandler : IRequestHandler Handle(AdminGetJwtTokenQuery request, CancellationToken cancellationToken) { - //TODO: Implement your business logic - return new AdminGetJwtTokenResponseDto(); + var response = await _context.User.AdminGetJwtTokenAsync(request.Adapt(), + cancellationToken: cancellationToken); + return response.Adapt(); } } diff --git a/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj b/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj index b1b99bc..e230e35 100644 --- a/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj +++ b/src/FrontOffice.BFF.Domain/FrontOffice.BFF.Domain.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/FrontOffice.BFF.Infrastructure/ConfigureServices.cs b/src/FrontOffice.BFF.Infrastructure/ConfigureServices.cs index 02a49f5..53fae38 100644 --- a/src/FrontOffice.BFF.Infrastructure/ConfigureServices.cs +++ b/src/FrontOffice.BFF.Infrastructure/ConfigureServices.cs @@ -31,8 +31,8 @@ public static class ConfigureServices jwtBearerOptions.RequireHttpsMetadata = false; jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters { - ValidateIssuer = true, - ValidateAudience = true, + ValidateIssuer = false,//todo change to true in production + ValidateAudience = false,//todo change to true in production ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = configuration["JwtIssuer"], diff --git a/src/FrontOffice.BFF.WebApi/Services/UserService.cs b/src/FrontOffice.BFF.WebApi/Services/UserService.cs index 741e0a1..f3e64af 100644 --- a/src/FrontOffice.BFF.WebApi/Services/UserService.cs +++ b/src/FrontOffice.BFF.WebApi/Services/UserService.cs @@ -1,4 +1,3 @@ -using FrontOffice.BFF.Protobuf.Protos.User; using FrontOffice.BFF.WebApi.Common.Services; using FrontOffice.BFF.Application.UserCQ.Commands.UpdateUser; using FrontOffice.BFF.Application.UserCQ.Commands.DeleteUser; @@ -8,6 +7,8 @@ using FrontOffice.BFF.Application.UserCQ.Commands.CreateNewOtpToken; using FrontOffice.BFF.Application.UserCQ.Commands.VerifyOtpToken; using FrontOffice.BFF.Application.UserCQ.Queries.AdminGetJwtToken; using FrontOffice.BFF.Application.UserCQ.Commands.SetPasswordForUser; +using FrontOffice.BFF.User.Protobuf.Protos.User; + namespace FrontOffice.BFF.WebApi.Services; public class UserService : UserContract.UserContractBase { @@ -17,6 +18,7 @@ public class UserService : UserContract.UserContractBase { _dispatchRequestToCQRS = dispatchRequestToCQRS; } + [Authorize(Roles = "user")] public override async Task UpdateUser(UpdateUserRequest request, ServerCallContext context) { return await _dispatchRequestToCQRS.Handle(request, context); diff --git a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/AdminGetJwtTokenRequestValidator.cs b/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/AdminGetJwtTokenRequestValidator.cs index 2ea9a05..554c345 100644 --- a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/AdminGetJwtTokenRequestValidator.cs +++ b/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/AdminGetJwtTokenRequestValidator.cs @@ -1,5 +1,5 @@ using FluentValidation; -using FrontOfficeMicroservice.Protobuf.Protos.User; +using FrontOffice.BFF.User.Protobuf.Protos.User; namespace FrontOfficeMicroservice.Protobuf.Validator.User; public class AdminGetJwtTokenRequestValidator : AbstractValidator diff --git a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/SetPasswordForUserRequestValidator.cs b/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/SetPasswordForUserRequestValidator.cs index 5c86518..d497c7b 100644 --- a/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/SetPasswordForUserRequestValidator.cs +++ b/src/Protobufs/FrontOffice.BFF.User.Protobuf/Validator/SetPasswordForUserRequestValidator.cs @@ -1,5 +1,5 @@ using FluentValidation; -using FrontOfficeMicroservice.Protobuf.Protos.User; +using FrontOffice.BFF.User.Protobuf.Protos.User; namespace FrontOfficeMicroservice.Protobuf.Validator.User; public class SetPasswordForUserRequestValidator : AbstractValidator