diff --git a/src/Controllers/HomeController.cs b/src/Controllers/HomeController.cs index 3f42871..1f2d816 100644 --- a/src/Controllers/HomeController.cs +++ b/src/Controllers/HomeController.cs @@ -60,10 +60,23 @@ public class HomeController : Controller } [HttpGet("Users")] - public ActionResult Users() + public async Task UsersAsync() { - return View(); - } + IEnumerable users = await _ldap.ListUsersAsync(); + List UserTableViewModels = []; + foreach (UserModel user in users) + { + UserTableViewModels.Add(new() + { + JpegPhoto = user.JpegPhoto ?? "", + Name = user.Cn ?? "", + Surname = user.Sn ?? "", + Title = user.Title ?? "", + Uid = user.Uid, + Workplace = user.Description?.Workplace ?? "" + }); + } + return View(new UsersIndexViewModel() { UserTableViewModels = UserTableViewModels }); } [HttpPost("Login")] public async Task Login(string username, string password) diff --git a/src/Controllers/UsersController.cs b/src/Controllers/UsersController.cs index 8630b08..6de8a0e 100644 --- a/src/Controllers/UsersController.cs +++ b/src/Controllers/UsersController.cs @@ -3,6 +3,7 @@ using Berufsschule_HAM.Services; using Microsoft.AspNetCore.Mvc; using Novell.Directory.Ldap; using Berufsschule_HAM.Models; +using Berufsschule_HAM.Helpers; using System.Security.Cryptography; using System.Text; using Microsoft.AspNetCore.Authorization; @@ -45,20 +46,17 @@ public class UsersController : Controller } [HttpGet("Delete")] - public async Task Delete(string uid) + public async Task Delete(string uid) { - return await Task.Run(async () => + try { - try - { - await _ldap.DeleteUserAsync(uid); - return true; - } - catch (Exception) - { - return false; - } - }); + await _ldap.DeleteUserAsync(uid); + return new UsersDeleteRequestModel(true); + } + catch (Exception ex) + { + return new UsersDeleteRequestModel(false, ex.Message); + } } [HttpGet("Create")] @@ -66,7 +64,7 @@ public class UsersController : Controller { try { - jpegPhoto ??= System.IO.File.ReadAllText("wwwroot/user_default.jpeg"); // TODO: cleanup - make this a config setting + jpegPhoto ??= Convert.ToBase64String(System.IO.File.ReadAllBytes("wwwroot/user_default.jpeg")); // TODO: cleanup - make this a config setting uid ??= sn.ToLower() + cn.ToLower(); title ??= ""; description ??= "{}"; diff --git a/src/Helpers/StringHelper.cs b/src/Helpers/StringHelper.cs index f65ce3b..8bd12d1 100644 --- a/src/Helpers/StringHelper.cs +++ b/src/Helpers/StringHelper.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using System.Text; namespace Berufsschule_HAM.Helpers; @@ -16,4 +17,9 @@ public static class StringHelpers input = input.Trim('-'); return input; } + + public static string ToBase64String(string input) + { + return Convert.ToBase64String(Encoding.UTF8.GetBytes(input)); + } } \ No newline at end of file diff --git a/src/Models/UserModels.cs b/src/Models/UserModels.cs index c16b520..4895d4b 100644 --- a/src/Models/UserModels.cs +++ b/src/Models/UserModels.cs @@ -1,3 +1,5 @@ +using System.Text.Json; + namespace Berufsschule_HAM.Models; public class UserModel @@ -5,7 +7,7 @@ public class UserModel public required string Uid { get; set; } public string? Cn { get; set; } public string? Sn { get; set; } - public string? Description { get; set; } + public UserDescription? Description { get; set; } public string? JpegPhoto { get; set; } public string? Title { get; set; } public string? UserPassword { get; set; } @@ -14,13 +16,28 @@ public class UserModel Uid = ldapData.GetValueOrDefault("uid") ?? throw new ArgumentException("UID is required"); Cn = ldapData.GetValueOrDefault("cn"); Sn = ldapData.GetValueOrDefault("sn"); - Description = ldapData.GetValueOrDefault("description"); + string? description = ldapData.GetValueOrDefault("description"); + Description = description != null ? JsonSerializer.Deserialize(description) : null; JpegPhoto = ldapData.GetValueOrDefault("jpegPhoto"); Title = ldapData.GetValueOrDefault("title"); UserPassword = ldapData.GetValueOrDefault("userPassword"); } } +public class UserDescription +{ + public required string BirthDate { get; set; } + public required UserAddress Address { get; set; } + public required string Workplace { get; set; } +} + +public class UserAddress +{ + public string? City { get; set; } + public string? Street { get; set; } + public string? StreetNr { get; set; } +} + public class UserAuthenticationResult { public required bool Success; @@ -33,4 +50,14 @@ public enum UserNotAuthenticatedReason InvalidCredentials, UserNotAuthorized, UserLockedOut +} + +public class UserTableViewModel +{ + public required string JpegPhoto { get; set; } + public required string Uid { get; set; } + public required string Title { get; set; } + public required string Name { get; set; } + public required string Surname { get; set; } + public required string Workplace { get; set; } } \ No newline at end of file diff --git a/src/Models/UsersRequestModels.cs b/src/Models/UsersRequestModels.cs index 22f26cc..7c2436d 100644 --- a/src/Models/UsersRequestModels.cs +++ b/src/Models/UsersRequestModels.cs @@ -21,4 +21,11 @@ public class UsersModifyRequestModel public string? Description { get; set; } = null; public string? JpegPhoto { get; set; } = null; public string? UserPassword { get; set; } = null; +} + +public class UsersDeleteRequestModel(bool successful, string exception = "None") +{ + public bool Success { get; set; } = successful; + + public string? Exception { get; set; } = exception; } \ No newline at end of file diff --git a/src/Models/UsersViewModel.cs b/src/Models/UsersViewModel.cs new file mode 100644 index 0000000..1729968 --- /dev/null +++ b/src/Models/UsersViewModel.cs @@ -0,0 +1,6 @@ +namespace Berufsschule_HAM.Models; + +public class UsersIndexViewModel +{ + public required IEnumerable UserTableViewModels { get; set; } +} \ No newline at end of file diff --git a/src/Views/Home/Users.cshtml b/src/Views/Home/Users.cshtml index 9a3eb8d..f57572e 100644 --- a/src/Views/Home/Users.cshtml +++ b/src/Views/Home/Users.cshtml @@ -1,6 +1,7 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Berufsschule_HAM.Models -@model HomeIndexViewModel +@using System.Buffers.Text +@model UsersIndexViewModel @inject IViewLocalizer T @{ ViewData["Title"] = T["Users"]; @@ -20,27 +21,33 @@ - - - - + + + + + + - @* @{ - foreach (AssetsTableViewModel assetsTableViewModel in Model.AssetsTableViewModels) + @{ + foreach (UserTableViewModel userTableViewModel in Model.UserTableViewModels) { - - - - + + + + + + } - } *@ + }
UserAsset IDAsset NameLocationUser IDtitleNameSurnameWorkplace Action
@assetsTableViewModel.UserUID@assetsTableViewModel.AssetCn@assetsTableViewModel.AssetName@assetsTableViewModel.LocationName + Photo + @userTableViewModel.Uid@userTableViewModel.Title@userTableViewModel.Name@userTableViewModel.Surname@userTableViewModel.Workplace
- +