diff options
| author | Syndamia <kamen.d.mladenov@protonmail.com> | 2021-05-07 15:27:34 +0300 |
|---|---|---|
| committer | Syndamia <kamen.d.mladenov@protonmail.com> | 2021-05-07 15:27:34 +0300 |
| commit | 5f2abdf275c3765290ee7d6728842cba6d3af184 (patch) | |
| tree | c9393ac6375db139f2d8388fc03ed1c9bfe2405b /ExamTemplate | |
| parent | 7470da2719a404b344fec4d6b2fefd92f4ce22a5 (diff) | |
| download | it-kariera-exam-template-5f2abdf275c3765290ee7d6728842cba6d3af184.tar it-kariera-exam-template-5f2abdf275c3765290ee7d6728842cba6d3af184.tar.gz it-kariera-exam-template-5f2abdf275c3765290ee7d6728842cba6d3af184.zip | |
Implemented editing user
Diffstat (limited to 'ExamTemplate')
| -rw-r--r-- | ExamTemplate/Data/Repositories/UserRepository.cs | 13 | ||||
| -rw-r--r-- | ExamTemplate/Services/Models/EditUserServiceModel.cs | 9 | ||||
| -rw-r--r-- | ExamTemplate/Services/UserService.cs | 26 | ||||
| -rw-r--r-- | ExamTemplate/Web/Configurations/UserMappings.cs | 2 | ||||
| -rw-r--r-- | ExamTemplate/Web/Controllers/UserController.cs | 38 | ||||
| -rw-r--r-- | ExamTemplate/Web/Models/User/EditUserViewModel.cs | 9 | ||||
| -rw-r--r-- | ExamTemplate/Web/Views/User/EditProfile.cshtml | 19 | ||||
| -rw-r--r-- | ExamTemplate/Web/Views/User/Profile.cshtml | 14 |
8 files changed, 127 insertions, 3 deletions
diff --git a/ExamTemplate/Data/Repositories/UserRepository.cs b/ExamTemplate/Data/Repositories/UserRepository.cs index 04e1f45..3e5ceaa 100644 --- a/ExamTemplate/Data/Repositories/UserRepository.cs +++ b/ExamTemplate/Data/Repositories/UserRepository.cs @@ -1,3 +1,4 @@ +using System.Security.Claims; using System.Threading.Tasks; using ExamTemplate.Data.Models; using Microsoft.AspNetCore.Identity; @@ -25,6 +26,11 @@ namespace ExamTemplate.Data.Repositories .FirstOrDefaultAsync(x => x.UserName == username); } + public async Task<User> GetByClaimsAsync(ClaimsPrincipal claimsPrincipal) + { + return await this._userManager.GetUserAsync(claimsPrincipal); + } + public async Task<bool> AddAsync(User user, string password) { user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, password); @@ -45,6 +51,13 @@ namespace ExamTemplate.Data.Repositories return succeeded; } + public async Task<bool> EditUserAsync(User user) + { + IdentityResult result = await this._userManager.UpdateAsync(user); + + return result.Succeeded; + } + public async Task<bool> VerifyPasswordAsync(User user, string password) { return await this._userManager.CheckPasswordAsync(user, password); diff --git a/ExamTemplate/Services/Models/EditUserServiceModel.cs b/ExamTemplate/Services/Models/EditUserServiceModel.cs new file mode 100644 index 0000000..80e5501 --- /dev/null +++ b/ExamTemplate/Services/Models/EditUserServiceModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Services.Models +{ + public class EditUserServiceModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Services/UserService.cs b/ExamTemplate/Services/UserService.cs index 6b5078b..329d21e 100644 --- a/ExamTemplate/Services/UserService.cs +++ b/ExamTemplate/Services/UserService.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks;
+using System.Security.Claims;
+using System.Threading.Tasks;
using AutoMapper;
using ExamTemplate.Data.Models;
using ExamTemplate.Data.Repositories;
@@ -50,5 +51,28 @@ namespace ExamTemplate.Services return this._autoMapper.Map<UserServiceModel>(user);
}
+
+ public async Task<UserServiceModel> GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal)
+ {
+ User user = await this._userRepository.GetByClaimsAsync(claimsPrincipal);
+
+ return this._autoMapper.Map<UserServiceModel>(user);
+ }
+
+ public async Task<bool> EditUserAsync(ClaimsPrincipal claimsPrincipal, EditUserServiceModel editUserServiceModel)
+ {
+ User user = await this._userRepository.GetByClaimsAsync(claimsPrincipal);
+
+ user.UserName = editUserServiceModel.Username;
+ user.FirstName = editUserServiceModel.FirstName;
+ user.LastName = editUserServiceModel.LastName;
+
+ return await this._userRepository.EditUserAsync(user);
+ }
+
+ public bool IsSignedIn(ClaimsPrincipal claimsPrincipal)
+ {
+ return this._signInManager.IsSignedIn(claimsPrincipal);
+ }
}
}
diff --git a/ExamTemplate/Web/Configurations/UserMappings.cs b/ExamTemplate/Web/Configurations/UserMappings.cs index 6a98477..1bba602 100644 --- a/ExamTemplate/Web/Configurations/UserMappings.cs +++ b/ExamTemplate/Web/Configurations/UserMappings.cs @@ -11,6 +11,8 @@ namespace ExamTemplate.Services.Configurations CreateMap<RegisterUserViewModel, RegisterUserServiceModel>(); CreateMap<LoginUserViewModel, LoginUserServiceModel>(); CreateMap<UserServiceModel, UserViewModel>(); + CreateMap<UserServiceModel, EditUserViewModel>(); + CreateMap<EditUserViewModel, EditUserServiceModel>(); } } } diff --git a/ExamTemplate/Web/Controllers/UserController.cs b/ExamTemplate/Web/Controllers/UserController.cs index 4a9cf31..2e5978b 100644 --- a/ExamTemplate/Web/Controllers/UserController.cs +++ b/ExamTemplate/Web/Controllers/UserController.cs @@ -81,13 +81,47 @@ namespace ExamTemplate.Web.Controllers UserServiceModel userServiceModel = await this._userService.GetUserByUsernameAsync(username); if (userServiceModel == default(UserServiceModel)) - { return RedirectToAction("Login"); - } UserViewModel userViewModel = this._autoMapper.Map<UserViewModel>(userServiceModel); return View(userViewModel); } + + [HttpGet] + [Route("/EditProfile")] + public async Task<IActionResult> EditProfile() + { + UserServiceModel userServiceModel = await this._userService.GetUserByClaimsAsync(this.HttpContext.User); + + if (userServiceModel == default(UserServiceModel)) + return RedirectToAction("Login"); + + EditUserViewModel editUserViewModel = this._autoMapper.Map<EditUserViewModel>(userServiceModel); + + return View(editUserViewModel); + } + + [HttpPost] + [Route("/EditProfile")] + public async Task<IActionResult> EditProfile(EditUserViewModel editUserViewModel) + { + if (!this._userService.IsSignedIn(HttpContext.User)) + return RedirectToAction("Login"); + + EditUserServiceModel editUserServiceModel = this._autoMapper.Map<EditUserServiceModel>(editUserViewModel); + bool result = await this._userService.EditUserAsync(HttpContext.User, editUserServiceModel); + + if (result) + { + await this._userService.LogoutAsync(); + return RedirectToAction("Profile", new { username = editUserViewModel.Username }); + } + else + { + UserServiceModel userServiceModel = await this._userService.GetUserByClaimsAsync(HttpContext.User); + return RedirectToAction("Profile", new { username = userServiceModel.Username }); + } + } } } diff --git a/ExamTemplate/Web/Models/User/EditUserViewModel.cs b/ExamTemplate/Web/Models/User/EditUserViewModel.cs new file mode 100644 index 0000000..baae751 --- /dev/null +++ b/ExamTemplate/Web/Models/User/EditUserViewModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Web.Models.User +{ + public class EditUserViewModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Web/Views/User/EditProfile.cshtml b/ExamTemplate/Web/Views/User/EditProfile.cshtml new file mode 100644 index 0000000..fef77f1 --- /dev/null +++ b/ExamTemplate/Web/Views/User/EditProfile.cshtml @@ -0,0 +1,19 @@ +@model EditUserViewModel +@{ + ViewData["Title"] = "Edit Profile"; +} + +<p> + <form asp-controller="User" asp-action="EditProfile" method="post"> + <label asp-for="Username">Username:</label> + <input type="text" asp-for="Username" placeholder="@Model.Username"> + + <label asp-for="FirstName">First Name:</label> + <input type="text" asp-for="FirstName" placeholder="@Model.FirstName"> + + <label asp-for="LastName">Last Name:</label> + <input type="text" asp-for="LastName" placeholder="@Model.LastName"> + + <input type="submit" value="Update Profile"> + </form> +</p> diff --git a/ExamTemplate/Web/Views/User/Profile.cshtml b/ExamTemplate/Web/Views/User/Profile.cshtml index 279de82..7883f2b 100644 --- a/ExamTemplate/Web/Views/User/Profile.cshtml +++ b/ExamTemplate/Web/Views/User/Profile.cshtml @@ -1,3 +1,8 @@ +@using Microsoft.AspNetCore.Identity + +@inject SignInManager<User> SignInManager +@inject UserManager<User> UserManager + @model UserViewModel @{ ViewData["Title"] = Model.Username + "'s Profile"; @@ -10,4 +15,13 @@ <div> @Model.Username </div> + @if (SignInManager.IsSignedIn(User)) + { + @if(UserManager.GetUserName(User) == Model.Username) + { + <form asp-controller="User" asp-action="EditProfile" method="get"> + <input type="submit" value="Edit Profile"> + </form> + } + } </p> |
