diff --git a/src/Controllers/AssetsController.cs b/src/Controllers/AssetsController.cs index 5e8b44f..f273111 100644 --- a/src/Controllers/AssetsController.cs +++ b/src/Controllers/AssetsController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Berufsschule_HAM.Models; using Berufsschule_HAM.Services; using System.Text.Json; +using Novell.Directory.Ldap; [Route("[controller]")] public class AssetsController : Controller @@ -22,6 +23,55 @@ public class AssetsController : Controller return list; } + [HttpPost("Create")] + public async Task Create(AssetsCreateRequestModel assetModel) + { + if (assetModel is null) + { + _logger.LogError("Unable to create an asset because the AssetModel is null."); + return false; + } + + try + { + var ownerDn = $"uid={assetModel.Owner},ou=people,dc=example,dc=com"; + + var attributeSet = new LdapAttributeSet(); + attributeSet.Add(new LdapAttribute("objectClass", new[] { + "top", + "device", + "extensibleObject" + })); + attributeSet.Add(new LdapAttribute("cn", assetModel.Cn)); + attributeSet.Add(new LdapAttribute("serialNumber", assetModel.SerialNumber)); + attributeSet.Add(new LdapAttribute("l", assetModel.Location)); + attributeSet.Add(new LdapAttribute("owner", ownerDn)); + attributeSet.Add(new LdapAttribute("name", assetModel.Name)); + attributeSet.Add(new LdapAttribute( + "description", + JsonSerializer.Serialize(new AssetDescription() + { + Type = assetModel.Description.Type, + Purchase = new AssetPurchase + { + PurchasedAt = assetModel.Description.Purchase.PurchasedAt, + PurchaseDate = assetModel.Description.Purchase.PurchaseDate, + PurchaseValue = assetModel.Description.Purchase.PurchaseValue + } + }) + )); + + await _ldap.CreateAsset(attributeSet); + + return true; + } + catch (Exception e) + { + _logger.LogError("Unable to create an asset because the Exception: " + e.Message); + return false; + } + } + [HttpGet("Delete")] public async Task Delete(string cn) { diff --git a/src/Models/AssetsCreateRequestModel.cs b/src/Models/AssetsCreateRequestModel.cs new file mode 100644 index 0000000..fff5224 --- /dev/null +++ b/src/Models/AssetsCreateRequestModel.cs @@ -0,0 +1,11 @@ +namespace Berufsschule_HAM.Models; + +public class AssetsCreateRequestModel +{ + public required string Cn { get; set; } + public AssetDescription? Description { get; set; } = null; + public string? Location { get; set; } = null; + public string? Name { get; set; } = null; + public string? Owner { get; set; } = null; + public string? SerialNumber { get; set; } = null; +} \ No newline at end of file diff --git a/src/Services/LdapService.cs b/src/Services/LdapService.cs index 53ac8eb..32d93bc 100644 --- a/src/Services/LdapService.cs +++ b/src/Services/LdapService.cs @@ -175,10 +175,16 @@ public partial class LdapService : IDisposable await CreateObject(dn, attributeSet); } - public async Task CreateAsset(LdapAttributeSet attributeSet) - { - await CreateObject(AssetsBaseDn, attributeSet); - } +public async Task CreateAsset(LdapAttributeSet attributeSet) +{ + string? cn = attributeSet.GetAttribute("cn")?.StringValue; + + if (string.IsNullOrEmpty(cn)) + throw new ArgumentException("AttributeSet must contain a cn attribute."); + + string dn = PrependRDN($"cn={cn}", AssetsBaseDn); + await CreateObject(dn, attributeSet); +} public async Task CreateLocation(LdapAttributeSet attributeSet) {