diff --git a/src/Controllers/GroupsController.cs b/src/Controllers/GroupsController.cs index 2be22b7..b3c7d92 100644 --- a/src/Controllers/GroupsController.cs +++ b/src/Controllers/GroupsController.cs @@ -18,30 +18,52 @@ public class GroupsController : Controller _logger = logger; } - [HttpGet("Index")] - public async Task> Index(GroupsIndexRequestModel requestModel) + [HttpGet("Get")] + public async Task GetAsync(GroupsIndexRequestModel model) { - string? cn = requestModel.Cn; - List attributes = [.. _ldap.GroupsAttributes]; - if (!requestModel.GidNumber) attributes.Remove("gidNumber"); - if (!requestModel.Permissions) attributes.Remove("description"); - IEnumerable groups; - if (cn is null) + if (model is null) { - groups = await _ldap.ListGroupsAsync([.. attributes]); + return new GroupsGetResponseModel( + successful: false, + groupModels: null, + exception: "Unable to create a group because the GroupsCreateRequestModel is null."); } - else + try { - try + + string? cn = model.Cn; + List attributes = [.. _ldap.GroupsAttributes]; + if (!model.GidNumber) attributes.Remove("gidNumber"); + if (!model.Permissions) attributes.Remove("description"); + IEnumerable groups; + if (cn is null) { - groups = [await _ldap.GetGroupByCnAsync(cn, [.. attributes])]; + groups = await _ldap.ListGroupsAsync([.. attributes]); } - catch (InvalidOperationException) + else { - groups = []; + try + { + groups = [await _ldap.GetGroupByCnAsync(cn, [.. attributes])]; + } + catch (InvalidOperationException) + { + groups = []; + } } + return new(true, groups); + } catch (Exception ex) + { + if (model.Cn is not null) + { + _logger.LogError("Unable to get group {model.Cn}: {ex.Message} - {ex.StackTrace}", [model.Cn, ex.Message, ex.StackTrace]); + } + else + { + _logger.LogError("Unable to get groups: {ex.Message} - {ex.StackTrace}", [ex.Message, ex.StackTrace]); + } + return new(false, null, ex.Message); } - return groups; } [HttpDelete("Delete")] @@ -75,6 +97,7 @@ public class GroupsController : Controller List permissions = model.Permissions; string gidNumber = "0"; // TODO implement counter string cn = model.Cn; + string displayName = model.DisplayName; LdapAttributeSet attributeSet = [ @@ -84,7 +107,7 @@ public class GroupsController : Controller new LdapAttribute("gidNumber", gidNumber), new LdapAttribute( "description", - JsonSerializer.Serialize(new GroupPermissions(){Permissions = permissions})) + JsonSerializer.Serialize(new GroupDescription(){DisplayName = displayName, Permissions = permissions})) ]; await _ldap.CreateGroup(cn, attributeSet); @@ -97,13 +120,13 @@ public class GroupsController : Controller } } - [HttpPost("Update")] - public async Task Update([FromBody]GroupsModifyRequestModel requestModel) + [HttpPatch("Update")] + public async Task Update([FromBody]GroupsModifyRequestModel requestModel) { if (requestModel is null) { _logger.LogError("Unable to update a group because the GroupsModifyRequestModel is null"); - return false; + return new(false, "Unable to update a group because the GroupsModifyRequestModel is null"); } string cn = requestModel.Cn; @@ -116,10 +139,10 @@ public class GroupsController : Controller { await _ldap.UpdateGroup(cn, "gidNumber", requestModel.GidNumber); } - if (requestModel.Permissions is not null) + if (requestModel.Description is not null) { - await _ldap.UpdateGroup(cn, "description", JsonSerializer.Serialize(requestModel.Permissions)); + await _ldap.UpdateGroup(cn, "description", JsonSerializer.Serialize(requestModel.Description)); } - return true; + return new(true); } } \ No newline at end of file diff --git a/src/Models/GroupModel.cs b/src/Models/GroupModel.cs index e094979..0b7c424 100644 --- a/src/Models/GroupModel.cs +++ b/src/Models/GroupModel.cs @@ -6,15 +6,18 @@ namespace Berufsschule_HAM.Models; public class GroupModel { + [JsonPropertyName("Cn")] public required string Cn { get; set; } + [JsonPropertyName("DisplayName")] public string DisplayName { get; set; } + [JsonPropertyName("GidNumber")] public string? GidNumber { get; set; } + [JsonPropertyName("Permissions")] public List Permissions { get; set; } public GroupModel(Dictionary ldapData) { Cn = ldapData.GetValueOrDefault("cn") ?? throw new GroupModelConfigurationException(); GidNumber = ldapData.GetValueOrDefault("gidNumber"); - DisplayName = ldapData.GetValueOrDefault("displayName") ?? Cn; string? descriptionValue = ldapData.GetValueOrDefault("description"); if (descriptionValue is null) { @@ -22,13 +25,18 @@ public class GroupModel } else { - Permissions = JsonSerializer.Deserialize(descriptionValue)?.Permissions ?? []; + GroupDescription? description = JsonSerializer.Deserialize(descriptionValue); + DisplayName = description?.DisplayName ?? Cn; + Permissions = description?.Permissions ?? []; } } } -public class GroupPermissions +public class GroupDescription { + [JsonPropertyName("DisplayName")] + public required string DisplayName { get; set; } + [JsonPropertyName("Permissions")] public required List Permissions { get; set; } } diff --git a/src/Models/GroupsRequestModels.cs b/src/Models/GroupsRequestModels.cs index 73ce67c..6ae237e 100644 --- a/src/Models/GroupsRequestModels.cs +++ b/src/Models/GroupsRequestModels.cs @@ -21,8 +21,12 @@ public class GroupsCreateRequestModel public class GroupsModifyRequestModel { + [JsonPropertyName("Cn")] public required string Cn { get; set; } + [JsonPropertyName("NewCn")] public string? NewCn { get; set; } = null; + [JsonPropertyName("GidNumber")] public string? GidNumber { get; set; } = null; - public GroupPermissions? Permissions { get; set; } = null; + [JsonPropertyName("Description")] + public GroupDescription? Description { get; set; } = null; } \ No newline at end of file diff --git a/src/Models/GroupsResponseModels.cs b/src/Models/GroupsResponseModels.cs index 3bfd446..ce3fac7 100644 --- a/src/Models/GroupsResponseModels.cs +++ b/src/Models/GroupsResponseModels.cs @@ -1,11 +1,27 @@ +using System.Text.Json.Serialization; + namespace Berufsschule_HAM.Models; +public class GroupsGetResponseModel(bool successful, IEnumerable? groupModels, string exception = "None") +{ + public bool Success { get; set; } = successful; + [JsonPropertyName("GroupModels")] + public IEnumerable GroupModels { get; set; } = groupModels ?? []; + public string? Exception { get; set; } = exception; +} + public class GroupsCreateResponseModel(bool successful, string exception = "None") { public bool Success { get; set; } = successful; public string? Exception { get; set; } = exception; } +public class GroupsUpdateResponseModel(bool successful, string exception = "None") +{ + public bool Success { get; set; } = successful; + public string? Exception { get; set; } = exception; +} + public class GroupsDeleteResponseModel(bool successful, string exception = "None") { public bool Success { get; set; } = successful; diff --git a/src/Views/Home/Groups.cshtml b/src/Views/Home/Groups.cshtml index 98b6897..ba533d9 100644 --- a/src/Views/Home/Groups.cshtml +++ b/src/Views/Home/Groups.cshtml @@ -45,7 +45,12 @@ @(groupTableViewModel.CanManageGroups ? "☑️" : "❌")
- + +
+ +
+ + + +
+ + + + + \ No newline at end of file