From 9798d18a7a356a5fcd94cdc8e2ff31ad8ee9989b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Duy?= <78247825+duykasama@users.noreply.github.com> Date: Fri, 16 Feb 2024 21:27:14 +0700 Subject: [PATCH] [Users management][Duy] Update users' self profile (#50) --- Domus.Api/Controllers/UsersController.cs | 9 +++++++ Domus.Service/Implementations/UserService.cs | 25 +++++++++++++++++++ Domus.Service/Interfaces/IUserService.cs | 1 + .../Users/UpdateSelfProfileRequest.cs | 12 +++++++++ 4 files changed, 47 insertions(+) create mode 100644 Domus.Service/Models/Requests/Users/UpdateSelfProfileRequest.cs diff --git a/Domus.Api/Controllers/UsersController.cs b/Domus.Api/Controllers/UsersController.cs index 2256af5..449ea6c 100644 --- a/Domus.Api/Controllers/UsersController.cs +++ b/Domus.Api/Controllers/UsersController.cs @@ -75,4 +75,13 @@ public async Task GetUserSelfProfile(string token) async () => await _userService.GetSelfProfile(token).ConfigureAwait(false) ).ConfigureAwait(false); } + + [AllowAnonymous] + [HttpPut("self-profile/{token}")] + public async Task UpdateSelfProfile(UpdateSelfProfileRequest request, string token) + { + return await ExecuteServiceLogic( + async () => await _userService.UpdateSelfProfile(request, token).ConfigureAwait(false) + ).ConfigureAwait(false); + } } diff --git a/Domus.Service/Implementations/UserService.cs b/Domus.Service/Implementations/UserService.cs index 9da663c..24a71ba 100644 --- a/Domus.Service/Implementations/UserService.cs +++ b/Domus.Service/Implementations/UserService.cs @@ -140,4 +140,29 @@ private async Task EnsureRoleExistsAsync(string role) await _roleManager.CreateAsync(new IdentityRole(role)); } } + + public async Task UpdateSelfProfile(UpdateSelfProfileRequest request, string token) + { + if (!_jwtService.IsValidToken(token)) + throw new InvalidTokenException(); + + var userId = _jwtService.GetTokenClaim(token, TokenClaimConstants.SUBJECT)?.ToString() ?? throw new UserNotFoundException(); + var user = await _userManager.Users.Where(u => u.Id == userId) + .FirstOrDefaultAsync() ?? throw new UserNotFoundException(); + + if (!string.IsNullOrEmpty(request.Email) && await _userRepository.ExistsAsync(u => u.Email == request.Email && u.Id != userId)) + throw new UserAlreadyExistsException("The email is already in use"); + if (!string.IsNullOrEmpty(request.UserName) && await _userRepository.ExistsAsync(u => u.UserName == request.UserName && u.Id != userId)) + throw new UserAlreadyExistsException("The username is already in use"); + + user.Email = string.IsNullOrEmpty(request.Email) ? user.Email : request.Email; + user.UserName = string.IsNullOrEmpty(request.UserName) ? user.UserName : request.UserName; + user.PhoneNumber = string.IsNullOrEmpty(request.PhoneNumber) ? user.PhoneNumber : request.PhoneNumber; + user.ProfileImage = string.IsNullOrEmpty(request.ProfileImage) ? user.ProfileImage : request.ProfileImage; + + await _userManager.UpdateAsync(user); + await _unitOfWork.CommitAsync(); + + return new ServiceActionResult(true) { Detail = "User profile updated successfully" }; + } } diff --git a/Domus.Service/Interfaces/IUserService.cs b/Domus.Service/Interfaces/IUserService.cs index 2dce76d..fd4151e 100644 --- a/Domus.Service/Interfaces/IUserService.cs +++ b/Domus.Service/Interfaces/IUserService.cs @@ -14,4 +14,5 @@ public interface IUserService : IAutoRegisterable Task GetAllUsers(); Task DeleteUser(string userId); Task GetSelfProfile(string token); + Task UpdateSelfProfile(UpdateSelfProfileRequest request, string token); } diff --git a/Domus.Service/Models/Requests/Users/UpdateSelfProfileRequest.cs b/Domus.Service/Models/Requests/Users/UpdateSelfProfileRequest.cs new file mode 100644 index 0000000..e7b81c6 --- /dev/null +++ b/Domus.Service/Models/Requests/Users/UpdateSelfProfileRequest.cs @@ -0,0 +1,12 @@ +namespace Domus.Service.Models.Requests.Users; + +public class UpdateSelfProfileRequest +{ + public string? Email { get; set; } + + public string? UserName { get; set; } + + public string? PhoneNumber { get; set; } + + public string? ProfileImage { get; set; } +}