profileShare

rasmusjy / splitapp-backend-modular-monolith

Read-only snapshot

No repository description.

main default branch 418 files Expires Sep 13, 2026, 9:06 AM
UsersController.cs 6,091 bytes
1 using SplitApp.Modules.Users.Domain.Entities;
2 using Microsoft.AspNetCore.Authorization;
3 using Microsoft.AspNetCore.Identity;
4 using Microsoft.AspNetCore.Mvc;
5 using Microsoft.EntityFrameworkCore;
6 using Microsoft.Extensions.Localization;
7 using SplitApp.WebApp.Areas.Admin.Models;
8
9 namespace SplitApp.WebApp.Areas.Admin.Controllers;
10
11 [Area("Admin")]
12 [Authorize(Roles = "admin")]
13 public class UsersController : Controller
14 {
15 private readonly UserManager<AppUser> _userManager;
16 private readonly RoleManager<AppRole> _roleManager;
17 private readonly IStringLocalizer<App.Resources.Views.Shared> _l;
18
19 public UsersController(
20 UserManager<AppUser> userManager,
21 RoleManager<AppRole> roleManager,
22 IStringLocalizer<App.Resources.Views.Shared> l)
23 {
24 _userManager = userManager;
25 _roleManager = roleManager;
26 _l = l;
27 }
28
29 public async Task<IActionResult> Index()
30 {
31 var users = await _userManager.Users.OrderBy(u => u.Email).ToListAsync();
32 var userList = new List<AdminUserViewModel>();
33
34 foreach (var user in users)
35 {
36 var roles = await _userManager.GetRolesAsync(user);
37 userList.Add(new AdminUserViewModel
38 {
39 Id = user.Id,
40 Email = user.Email!,
41 FirstName = user.FirstName,
42 LastName = user.LastName,
43 Roles = roles.ToList()
44 });
45 }
46
47 var vm = new AdminUserIndexViewModel
48 {
49 Title = _l["Users"].Value,
50 Users = userList
51 };
52 return View(vm);
53 }
54
55 public async Task<IActionResult> EditRoles(Guid id)
56 {
57 var user = await _userManager.FindByIdAsync(id.ToString());
58 if (user == null) return NotFound();
59
60 var userRoles = await _userManager.GetRolesAsync(user);
61 var allRoles = await _roleManager.Roles.OrderBy(r => r.Name).ToListAsync();
62
63 var vm = new AdminEditRolesViewModel
64 {
65 Title = _l["Edit user roles"].Value,
66 UserEmail = user.Email!,
67 UserName = $"{user.FirstName} {user.LastName}",
68 Roles = allRoles.Select(r => new RoleAssignmentViewModel
69 {
70 RoleName = r.Name!,
71 IsAssigned = userRoles.Contains(r.Name!)
72 }).ToList()
73 };
74 return View(vm);
75 }
76
77 [HttpPost]
78 [ValidateAntiForgeryToken]
79 public async Task<IActionResult> EditRoles(Guid id, AdminEditRolesViewModel vm)
80 {
81 var user = await _userManager.FindByIdAsync(id.ToString());
82 if (user == null) return NotFound();
83
84 var currentRoles = await _userManager.GetRolesAsync(user);
85
86 foreach (var role in vm.Roles)
87 {
88 if (role.IsAssigned && !currentRoles.Contains(role.RoleName))
89 {
90 await _userManager.AddToRoleAsync(user, role.RoleName);
91 }
92 else if (!role.IsAssigned && currentRoles.Contains(role.RoleName))
93 {
94 await _userManager.RemoveFromRoleAsync(user, role.RoleName);
95 }
96 }
97
98 return RedirectToAction(nameof(Index));
99 }
100
101 public async Task<IActionResult> Details(Guid id)
102 {
103 var user = await _userManager.FindByIdAsync(id.ToString());
104 if (user == null) return NotFound();
105
106 var roles = await _userManager.GetRolesAsync(user);
107 var vm = new AdminUserDetailsViewModel
108 {
109 Title = _l["User details"].Value,
110 Id = user.Id,
111 Email = user.Email!,
112 FirstName = user.FirstName,
113 LastName = user.LastName,
114 Roles = roles.ToList()
115 };
116 return View(vm);
117 }
118
119 public async Task<IActionResult> Edit(Guid id)
120 {
121 var user = await _userManager.FindByIdAsync(id.ToString());
122 if (user == null) return NotFound();
123
124 var vm = new AdminUserEditViewModel
125 {
126 Title = _l["Edit user"].Value,
127 Id = user.Id,
128 Email = user.Email!,
129 FirstName = user.FirstName,
130 LastName = user.LastName
131 };
132 return View(vm);
133 }
134
135 [HttpPost]
136 [ValidateAntiForgeryToken]
137 public async Task<IActionResult> Edit(Guid id, AdminUserEditViewModel vm)
138 {
139 if (id != vm.Id) return NotFound();
140
141 if (!ModelState.IsValid)
142 {
143 vm.Title = _l["Edit user"].Value;
144 return View(vm);
145 }
146
147 var user = await _userManager.FindByIdAsync(id.ToString());
148 if (user == null) return NotFound();
149
150 user.FirstName = vm.FirstName;
151 user.LastName = vm.LastName;
152
153 var result = await _userManager.UpdateAsync(user);
154 if (!result.Succeeded)
155 {
156 foreach (var err in result.Errors)
157 ModelState.AddModelError(string.Empty, err.Description);
158 vm.Title = _l["Edit user"].Value;
159 return View(vm);
160 }
161
162 return RedirectToAction(nameof(Index));
163 }
164
165 public async Task<IActionResult> Delete(Guid id)
166 {
167 var user = await _userManager.FindByIdAsync(id.ToString());
168 if (user == null) return NotFound();
169
170 var roles = await _userManager.GetRolesAsync(user);
171 var vm = new AdminUserDetailsViewModel
172 {
173 Title = _l["Delete user"].Value,
174 Id = user.Id,
175 Email = user.Email!,
176 FirstName = user.FirstName,
177 LastName = user.LastName,
178 Roles = roles.ToList()
179 };
180 return View(vm);
181 }
182
183 [HttpPost, ActionName("Delete")]
184 [ValidateAntiForgeryToken]
185 public async Task<IActionResult> DeleteConfirmed(Guid id)
186 {
187 var user = await _userManager.FindByIdAsync(id.ToString());
188 if (user == null) return NotFound();
189
190 var result = await _userManager.DeleteAsync(user);
191 if (!result.Succeeded)
192 {
193 TempData["Error"] = string.Join("; ", result.Errors.Select(e => e.Description));
194 }
195 return RedirectToAction(nameof(Index));
196 }
197 }
198