From 7d167aa877213dd9598a313f5a8a15e360a91468 Mon Sep 17 00:00:00 2001 From: anomny Date: Mon, 6 Oct 2025 20:32:48 +0200 Subject: [PATCH 1/6] Create a more general AssetResponseModel and use in delete --- src/Controllers/AssetsController.cs | 13 +++++++------ src/Models/AssetsDeleteResponseModel.cs | 14 -------------- src/Models/AssetsResponseModel.cs | 7 +++++++ 3 files changed, 14 insertions(+), 20 deletions(-) delete mode 100644 src/Models/AssetsDeleteResponseModel.cs create mode 100644 src/Models/AssetsResponseModel.cs diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index d961049..a7152ce 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -4,6 +4,7 @@ using Berufsschule_HAM.Services; using System.Text.Json; using Novell.Directory.Ldap; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.ModelBinding; [Authorize] [Route("[controller]")] @@ -107,26 +108,26 @@ public class AssetsController : Controller } } - [HttpGet("Delete")] - public async Task Delete(string cn) + [HttpDelete("Delete")] + public async Task Delete([BindRequired] string cn) { - AssetsDeleteResponseModel response; + AssetsResponseModel response; return await Task.Run(async () => { if (cn is null) { - response = new AssetsDeleteResponseModel(false, AssetsDeleteErrorEnum.CnIsNull); + response = new AssetsResponseModel(false, "Cn was not provided."); return response; } try { await _ldap.DeleteAssetAsync(cn); - response = new AssetsDeleteResponseModel(true, AssetsDeleteErrorEnum.None); + response = new AssetsResponseModel(true); } catch (Exception e) { - response = new AssetsDeleteResponseModel(false, AssetsDeleteErrorEnum.UnableToDeleteAsset, e.Message); + response = new AssetsResponseModel(false, e.Message); } return response; diff --git a/src/Models/AssetsDeleteResponseModel.cs b/src/Models/AssetsDeleteResponseModel.cs deleted file mode 100644 index 590991f..0000000 --- a/src/Models/AssetsDeleteResponseModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -public class AssetsDeleteResponseModel(bool successful, AssetsDeleteErrorEnum errorReason, string exception = "none") -{ - public bool Success { get; set; } = successful; - public AssetsDeleteErrorEnum Reason { get; set; } = errorReason; - - public string? Exception { get; set; } = exception; -} - -public enum AssetsDeleteErrorEnum -{ - None, - CnIsNull, - UnableToDeleteAsset -} \ No newline at end of file diff --git a/src/Models/AssetsResponseModel.cs b/src/Models/AssetsResponseModel.cs new file mode 100644 index 0000000..3adcf47 --- /dev/null +++ b/src/Models/AssetsResponseModel.cs @@ -0,0 +1,7 @@ +public class AssetsResponseModel(bool successful, string exception = "none") +{ + public bool Success { get; set; } = successful; + + public string? Exception { get; set; } = exception; +} + From 89d7cb6315a50524c13865569c31d441085a0bca Mon Sep 17 00:00:00 2001 From: anomny Date: Mon, 6 Oct 2025 20:53:35 +0200 Subject: [PATCH 2/6] Update the general asset response model to work with GetAll call. --- src/Controllers/AssetsController.cs | 22 ++++++++++++++++------ src/Models/AssetsResponseModel.cs | 6 +++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index a7152ce..5305d59 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -19,11 +19,21 @@ public class AssetsController : Controller _logger = logger; } - [HttpGet("Index")] - public async Task> Index() + [HttpGet("GetAll")] + public async Task GetAllAssetModelAsync() { - var list = await _ldap.ListDeviceAsync(); - return list; + AssetsResponseModel result; + try + { + var assetList = await _ldap.ListDeviceAsync(); + result = new AssetsResponseModel(successful: true, assetsModel: assetList); + } + catch (Exception e) + { + result = new AssetsResponseModel(successful: false, exception: e.Message); + } + + return result; } [HttpPost("Create")] @@ -116,7 +126,7 @@ public class AssetsController : Controller { if (cn is null) { - response = new AssetsResponseModel(false, "Cn was not provided."); + response = new AssetsResponseModel(successful: false, exception: "Cn was not provided."); return response; } @@ -127,7 +137,7 @@ public class AssetsController : Controller } catch (Exception e) { - response = new AssetsResponseModel(false, e.Message); + response = new AssetsResponseModel(successful: false, exception: e.Message); } return response; diff --git a/src/Models/AssetsResponseModel.cs b/src/Models/AssetsResponseModel.cs index 3adcf47..4e7fdca 100644 --- a/src/Models/AssetsResponseModel.cs +++ b/src/Models/AssetsResponseModel.cs @@ -1,7 +1,11 @@ -public class AssetsResponseModel(bool successful, string exception = "none") +using Berufsschule_HAM.Models; + +public class AssetsResponseModel(bool successful, IEnumerable? assetsModel = null, string exception = "None") { public bool Success { get; set; } = successful; + public IEnumerable? AssetsModel { get; set; } = assetsModel; + public string? Exception { get; set; } = exception; } From ba96fe0b228cc5aa4e2dc7df60aa939f044135a9 Mon Sep 17 00:00:00 2001 From: anomny Date: Mon, 6 Oct 2025 21:05:58 +0200 Subject: [PATCH 3/6] Use new response model for create call --- src/Controllers/AssetsController.cs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index 5305d59..b5072a1 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -37,12 +37,16 @@ public class AssetsController : Controller } [HttpPost("Create")] - public async Task Create(AssetsCreateRequestModel assetModel) + public async Task Create(AssetsCreateRequestModel assetModel) { + AssetsResponseModel result; if (assetModel is null) { - _logger.LogError("Unable to create an asset because the AssetModel is null."); - return false; + result = new AssetsResponseModel( + successful: false, + exception: "Unable to create an asset because the AssetsCreateRequestModel is null."); + + return result; } try @@ -63,7 +67,7 @@ public class AssetsController : Controller if (assetModel.Location != null) { attributeSet.Add(new LdapAttribute("l", assetModel.Location)); - } + } if (assetModel.Owner != null) { var ownerDn = $"uid={assetModel.Owner}"; @@ -108,14 +112,14 @@ public class AssetsController : Controller } await _ldap.CreateAsset(attributeSet); - - return true; + result = new AssetsResponseModel(successful: true); } catch (Exception e) { - _logger.LogError($"Unable to create an asset because of the exception: {e.Message}", e); - return false; - } + result = new AssetsResponseModel(successful: false, exception: e.Message); + } + + return result; } [HttpDelete("Delete")] From c25e196814538d69932fcd7b86d430ff2e985460 Mon Sep 17 00:00:00 2001 From: anomny Date: Mon, 6 Oct 2025 21:16:48 +0200 Subject: [PATCH 4/6] Use new assets response model for update call --- src/Controllers/AssetsController.cs | 102 ++++++++++++++++------------ 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index b5072a1..c988dbb 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -148,61 +148,75 @@ public class AssetsController : Controller }); } - [HttpPost("Update")] - public async Task Update(AssetsModifyRequestModel requestModel) + [HttpPatch("Update")] + public async Task Update(AssetsModifyRequestModel requestModel) { + AssetsResponseModel result; if (requestModel is null) { - _logger.LogError("Unable to update an asset because the AssetsModifyRequestModel is null"); - return false; - } - string cn = requestModel.Cn; + result = new AssetsResponseModel( + successful: false, + exception: "Unable to update an asset because the AssetsModifyRequestModel is null"); - if (requestModel.NewCn is not null) - { - await _ldap.UpdateAsset(cn, "cn", requestModel.NewCn); - cn = requestModel.NewCn; + return result; } - if (requestModel.Location is not null) + + try { - await _ldap.UpdateAsset(cn, "l", requestModel.Location); - } - if (requestModel.Name is not null) - { - await _ldap.UpdateAsset(cn, "name", requestModel.Name); - } - if (requestModel.Owner is not null) - { - await _ldap.UpdateAsset(cn, "owner", requestModel.Owner); - } - if (requestModel.SerialNumber is not null) - { - await _ldap.UpdateAsset(cn, "serialNumber", requestModel.SerialNumber); - } - if (requestModel.Description is not null) - { - AssetModel? asset = null; - if (requestModel.Description.Type is null) + var cn = requestModel.Cn; + if (requestModel.NewCn is not null) { - asset ??= await _ldap.GetAssetByCnAsync(cn); - requestModel.Description.Type = asset.Description?.Type; + await _ldap.UpdateAsset(cn, "cn", requestModel.NewCn); + cn = requestModel.NewCn; } - if (requestModel.Description.Purchase is not null) + if (requestModel.Location is not null) { - asset ??= await _ldap.GetAssetByCnAsync(cn); - requestModel.Description.Purchase.PurchasedAt ??= asset.Description?.Purchase?.PurchasedAt; - requestModel.Description.Purchase.PurchaseDate ??= asset.Description?.Purchase?.PurchaseDate; - requestModel.Description.Purchase.PurchasedBy ??= asset.Description?.Purchase?.PurchasedBy; - requestModel.Description.Purchase.PurchaseValue ??= asset.Description?.Purchase?.PurchaseValue; + await _ldap.UpdateAsset(cn, "l", requestModel.Location); + } + if (requestModel.Name is not null) + { + await _ldap.UpdateAsset(cn, "name", requestModel.Name); + } + if (requestModel.Owner is not null) + { + await _ldap.UpdateAsset(cn, "owner", requestModel.Owner); + } + if (requestModel.SerialNumber is not null) + { + await _ldap.UpdateAsset(cn, "serialNumber", requestModel.SerialNumber); + } + if (requestModel.Description is not null) + { + AssetModel? asset = null; + if (requestModel.Description.Type is null) + { + asset ??= await _ldap.GetAssetByCnAsync(cn); + requestModel.Description.Type = asset.Description?.Type; + } + if (requestModel.Description.Purchase is not null) + { + asset ??= await _ldap.GetAssetByCnAsync(cn); + requestModel.Description.Purchase.PurchasedAt ??= asset.Description?.Purchase?.PurchasedAt; + requestModel.Description.Purchase.PurchaseDate ??= asset.Description?.Purchase?.PurchaseDate; + requestModel.Description.Purchase.PurchasedBy ??= asset.Description?.Purchase?.PurchasedBy; + requestModel.Description.Purchase.PurchaseValue ??= asset.Description?.Purchase?.PurchaseValue; + } + + if (requestModel.Description.Purchase is null) + { + asset ??= await _ldap.GetAssetByCnAsync(cn); + requestModel.Description.Purchase = asset.Description?.Purchase; + } + await _ldap.UpdateAsset(cn, "description", JsonSerializer.Serialize(requestModel.Description)); } - if (requestModel.Description.Purchase is null) - { - asset ??= await _ldap.GetAssetByCnAsync(cn); - requestModel.Description.Purchase = asset.Description?.Purchase; - } - await _ldap.UpdateAsset(cn, "description", JsonSerializer.Serialize(requestModel.Description)); + result = new AssetsResponseModel(successful: true); } - return true; + catch (Exception e) + { + result = new AssetsResponseModel(successful: false, exception: e.Message); + } + + return result; } } \ No newline at end of file From 1d26781e8e3ba3e6a8ad7638125e6ff5b54708d7 Mon Sep 17 00:00:00 2001 From: anomny Date: Mon, 6 Oct 2025 21:25:10 +0200 Subject: [PATCH 5/6] Have a different reponse model for get all --- src/Controllers/AssetsController.cs | 15 +++------------ src/Models/AssetsResponseModel.cs | 6 +----- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index c988dbb..4b62399 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -20,20 +20,11 @@ public class AssetsController : Controller } [HttpGet("GetAll")] - public async Task GetAllAssetModelAsync() + public async Task> GetAllAssetModelAsync() { - AssetsResponseModel result; - try - { - var assetList = await _ldap.ListDeviceAsync(); - result = new AssetsResponseModel(successful: true, assetsModel: assetList); - } - catch (Exception e) - { - result = new AssetsResponseModel(successful: false, exception: e.Message); - } + var assetsList = await _ldap.ListDeviceAsync(); - return result; + return assetsList; } [HttpPost("Create")] diff --git a/src/Models/AssetsResponseModel.cs b/src/Models/AssetsResponseModel.cs index 4e7fdca..9bec9c5 100644 --- a/src/Models/AssetsResponseModel.cs +++ b/src/Models/AssetsResponseModel.cs @@ -1,11 +1,7 @@ -using Berufsschule_HAM.Models; - -public class AssetsResponseModel(bool successful, IEnumerable? assetsModel = null, string exception = "None") +public class AssetsResponseModel(bool successful, string exception = "None") { public bool Success { get; set; } = successful; - public IEnumerable? AssetsModel { get; set; } = assetsModel; - public string? Exception { get; set; } = exception; } From 9acc650707b61fc30f8c121e9e6daa108cba07e4 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Wed, 8 Oct 2025 21:50:57 +0200 Subject: [PATCH 6/6] Implemented ResponseModels for Assets, Reverted error handling removal --- src/Controllers/AssetsController.cs | 45 +++++++++++++++++------------ src/Models/AssetsResponseModel.cs | 27 ++++++++++++++++- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index 4b62399..2d3002c 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -20,20 +20,29 @@ public class AssetsController : Controller } [HttpGet("GetAll")] - public async Task> GetAllAssetModelAsync() + public async Task GetAllAssetModelAsync() { - var assetsList = await _ldap.ListDeviceAsync(); + AssetsIndexResponseModel result; + try + { + var assetList = await _ldap.ListDeviceAsync(); + result = new AssetsIndexResponseModel(successful: true, assetsModel: assetList); + } + catch (Exception e) + { + result = new AssetsIndexResponseModel(successful: false, exception: e.Message); + } - return assetsList; + return result; } [HttpPost("Create")] - public async Task Create(AssetsCreateRequestModel assetModel) + public async Task Create(AssetsCreateRequestModel assetModel) { - AssetsResponseModel result; + AssetsCreateResponseModel result; if (assetModel is null) { - result = new AssetsResponseModel( + result = new AssetsCreateResponseModel( successful: false, exception: "Unable to create an asset because the AssetsCreateRequestModel is null."); @@ -103,36 +112,36 @@ public class AssetsController : Controller } await _ldap.CreateAsset(attributeSet); - result = new AssetsResponseModel(successful: true); + result = new AssetsCreateResponseModel(successful: true); } catch (Exception e) { - result = new AssetsResponseModel(successful: false, exception: e.Message); + result = new AssetsCreateResponseModel(successful: false, exception: e.Message); } return result; } [HttpDelete("Delete")] - public async Task Delete([BindRequired] string cn) + public async Task Delete([BindRequired] string cn) { - AssetsResponseModel response; + AssetsDeleteResponseModel response; return await Task.Run(async () => { if (cn is null) { - response = new AssetsResponseModel(successful: false, exception: "Cn was not provided."); + response = new AssetsDeleteResponseModel(successful: false, exception: "Cn was not provided."); return response; } try { await _ldap.DeleteAssetAsync(cn); - response = new AssetsResponseModel(true); + response = new AssetsDeleteResponseModel(true); } catch (Exception e) { - response = new AssetsResponseModel(successful: false, exception: e.Message); + response = new AssetsDeleteResponseModel(successful: false, exception: e.Message); } return response; @@ -140,12 +149,12 @@ public class AssetsController : Controller } [HttpPatch("Update")] - public async Task Update(AssetsModifyRequestModel requestModel) + public async Task Update(AssetsModifyRequestModel requestModel) { - AssetsResponseModel result; + AssetsUpdateResponseModel result; if (requestModel is null) { - result = new AssetsResponseModel( + result = new AssetsUpdateResponseModel( successful: false, exception: "Unable to update an asset because the AssetsModifyRequestModel is null"); @@ -201,11 +210,11 @@ public class AssetsController : Controller await _ldap.UpdateAsset(cn, "description", JsonSerializer.Serialize(requestModel.Description)); } - result = new AssetsResponseModel(successful: true); + result = new AssetsUpdateResponseModel(successful: true); } catch (Exception e) { - result = new AssetsResponseModel(successful: false, exception: e.Message); + result = new AssetsUpdateResponseModel(successful: false, exception: e.Message); } return result; diff --git a/src/Models/AssetsResponseModel.cs b/src/Models/AssetsResponseModel.cs index 9bec9c5..e9a899e 100644 --- a/src/Models/AssetsResponseModel.cs +++ b/src/Models/AssetsResponseModel.cs @@ -1,7 +1,32 @@ -public class AssetsResponseModel(bool successful, string exception = "None") +using Berufsschule_HAM.Models; + +public class AssetsCreateResponseModel(bool successful, string exception = "None") { public bool Success { get; set; } = successful; public string? Exception { get; set; } = exception; } +public class AssetsUpdateResponseModel(bool successful, string exception = "None") +{ + public bool Success { get; set; } = successful; + + public string? Exception { get; set; } = exception; +} + +public class AssetsDeleteResponseModel(bool successful, string exception = "None") +{ + public bool Success { get; set; } = successful; + + public string? Exception { get; set; } = exception; +} + +public class AssetsIndexResponseModel(bool successful, IEnumerable? assetsModel = null, string exception = "None") +{ + public bool Success { get; set; } = successful; + + public IEnumerable? AssetsModel { get; set; } = assetsModel; + + public string? Exception { get; set; } = exception; +} +