profileShare

rasmusjy / splitapp-backend-microservices

Read-only snapshot

No repository description.

main default branch 501 files Expires Sep 13, 2026, 9:06 AM
UsersController.cs 4,361 bytes
1 using Microsoft.AspNetCore.Authorization;
2 using Microsoft.AspNetCore.Mvc;
3 using Microsoft.Extensions.Localization;
4 using SplitApp.WebApp.Application.UsersService;
5 using SplitApp.WebApp.Areas.Admin.Models;
6
7 namespace SplitApp.WebApp.Areas.Admin.Controllers;
8
9 [Area("Admin")]
10 [Authorize(Roles = "admin")]
11 public class UsersController : Controller
12 {
13 private readonly IUsersServiceClient _users;
14 private readonly IStringLocalizer<App.Resources.Views.Shared> _l;
15
16 public UsersController(IUsersServiceClient users, IStringLocalizer<App.Resources.Views.Shared> l)
17 {
18 _users = users;
19 _l = l;
20 }
21
22 public async Task<IActionResult> Index()
23 {
24 var users = await _users.ListUsersAsync();
25 var vm = new AdminUserIndexViewModel
26 {
27 Title = _l["Users"].Value,
28 Users = users.Select(u => new AdminUserViewModel
29 {
30 Id = u.Id,
31 Email = u.Email,
32 FirstName = u.FirstName,
33 LastName = u.LastName,
34 Roles = u.Roles.ToList(),
35 }).ToList(),
36 };
37 return View(vm);
38 }
39
40 public async Task<IActionResult> EditRoles(Guid id)
41 {
42 var user = await _users.GetUserAsync(id);
43 if (user is null) return NotFound();
44 var assigned = await _users.GetUserRolesAsync(id);
45 var allRoles = await _users.ListRolesAsync();
46 var vm = new AdminEditRolesViewModel
47 {
48 Title = _l["Edit user roles"].Value,
49 UserEmail = user.Email,
50 UserName = $"{user.FirstName} {user.LastName}",
51 Roles = allRoles.Select(r => new RoleAssignmentViewModel
52 {
53 RoleName = r.Name,
54 IsAssigned = assigned.Contains(r.Name),
55 }).ToList(),
56 };
57 return View(vm);
58 }
59
60 [HttpPost]
61 [ValidateAntiForgeryToken]
62 public async Task<IActionResult> EditRoles(Guid id, AdminEditRolesViewModel vm)
63 {
64 var selected = vm.Roles.Where(r => r.IsAssigned).Select(r => r.RoleName).ToArray();
65 await _users.SetUserRolesAsync(id, selected);
66 return RedirectToAction(nameof(Index));
67 }
68
69 public async Task<IActionResult> Details(Guid id)
70 {
71 var user = await _users.GetUserAsync(id);
72 if (user is null) return NotFound();
73 var vm = new AdminUserDetailsViewModel
74 {
75 Title = _l["User details"].Value,
76 Id = user.Id,
77 Email = user.Email,
78 FirstName = user.FirstName,
79 LastName = user.LastName,
80 Roles = user.Roles.ToList(),
81 };
82 return View(vm);
83 }
84
85 public async Task<IActionResult> Edit(Guid id)
86 {
87 var user = await _users.GetUserAsync(id);
88 if (user is null) return NotFound();
89 var vm = new AdminUserEditViewModel
90 {
91 Title = _l["Edit user"].Value,
92 Id = user.Id,
93 Email = user.Email,
94 FirstName = user.FirstName,
95 LastName = user.LastName,
96 };
97 return View(vm);
98 }
99
100 [HttpPost]
101 [ValidateAntiForgeryToken]
102 public async Task<IActionResult> Edit(Guid id, AdminUserEditViewModel vm)
103 {
104 if (id != vm.Id) return NotFound();
105 if (!ModelState.IsValid)
106 {
107 vm.Title = _l["Edit user"].Value;
108 return View(vm);
109 }
110 var updated = await _users.UpdateUserAsync(id, vm.FirstName, vm.LastName);
111 if (updated is null) return NotFound();
112 return RedirectToAction(nameof(Index));
113 }
114
115 public async Task<IActionResult> Delete(Guid id)
116 {
117 var user = await _users.GetUserAsync(id);
118 if (user is null) return NotFound();
119 var vm = new AdminUserDetailsViewModel
120 {
121 Title = _l["Delete user"].Value,
122 Id = user.Id,
123 Email = user.Email,
124 FirstName = user.FirstName,
125 LastName = user.LastName,
126 Roles = user.Roles.ToList(),
127 };
128 return View(vm);
129 }
130
131 [HttpPost, ActionName("Delete")]
132 [ValidateAntiForgeryToken]
133 public async Task<IActionResult> DeleteConfirmed(Guid id)
134 {
135 var ok = await _users.DeleteUserAsync(id);
136 if (!ok) TempData["Error"] = "User not found.";
137 return RedirectToAction(nameof(Index));
138 }
139 }
140