Merge pull request #63 from LD-Reborn/feature/Create_Assets

CRUD - Assets create
This commit is contained in:
LD50
2025-10-04 17:20:38 +02:00
committed by GitHub
5 changed files with 114 additions and 12 deletions

View File

@@ -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,88 @@ public class AssetsController : Controller
return list;
}
[HttpPost("Create")]
public async Task<bool> Create(AssetsCreateRequestModel assetModel)
{
if (assetModel is null)
{
_logger.LogError("Unable to create an asset because the AssetModel is null.");
return false;
}
try
{
LdapAttributeSet attributeSet =
[
new LdapAttribute("objectClass", new[] {"top", "device", "extensibleObject"}),
];
if (assetModel.Cn != null)
{
attributeSet.Add(new LdapAttribute("cn", assetModel.Cn));
}
if (assetModel.SerialNumber != null)
{
attributeSet.Add(new LdapAttribute("serialNumber", assetModel.SerialNumber));
}
if (assetModel.Location != null)
{
attributeSet.Add(new LdapAttribute("l", assetModel.Location));
}
if (assetModel.Owner != null)
{
var ownerDn = $"uid={assetModel.Owner}";
attributeSet.Add(new LdapAttribute("owner", ownerDn));
}
if (assetModel.Name != null)
{
attributeSet.Add(new LdapAttribute("name", assetModel.Name));
}
if (assetModel.Description != null)
{
var assetDescription = new AssetDescription();
if (assetModel.Description.Type != null)
{
assetDescription.Type = assetModel.Description.Type;
}
if (assetModel.Description.Purchase != null)
{
var purchase = new AssetPurchase();
if (assetModel.Description.Purchase.PurchasedAt != null)
{
purchase.PurchasedAt = assetModel.Description.Purchase.PurchasedAt;
}
if (assetModel.Description.Purchase.PurchaseDate != null)
{
purchase.PurchaseDate = assetModel.Description.Purchase.PurchaseDate;
}
if (assetModel.Description.Purchase.PurchasedBy != null)
{
purchase.PurchasedBy = assetModel.Description.Purchase.PurchasedBy;
}
if (assetModel.Description.Purchase.PurchaseValue != null)
{
purchase.PurchaseValue = assetModel.Description.Purchase.PurchaseValue;
}
assetDescription.Purchase = purchase;
}
attributeSet.Add(new LdapAttribute("description", JsonSerializer.Serialize(assetDescription)));
}
await _ldap.CreateAsset(attributeSet);
return true;
}
catch (Exception e)
{
_logger.LogError($"Unable to create an asset because of the exception: {e.Message}", e);
return false;
}
}
[HttpGet("Delete")]
public async Task<bool> Delete(string cn)
{

View File

@@ -72,13 +72,14 @@ public class GroupsController : Controller
new LdapAttribute("objectClass", "top"),
new LdapAttribute("cn", cn),
new LdapAttribute("gidNumber", gidNumber),
new LdapAttribute("description",
JsonSerializer.Serialize(
new GroupPermissions()
new LdapAttribute(
"description",
JsonSerializer.Serialize(new GroupPermissions()
{
Permissions = [.. permissions]
})),
}))
];
await _ldap.CreateGroup(cn, attributeSet);
return true;
}

View File

@@ -74,6 +74,7 @@ public class UsersController : Controller
byte[] hashedPassword = SHA256.HashData(passwordBytes);
userPassword = "{SHA256}" + Convert.ToBase64String(hashedPassword);
}
LdapAttributeSet attributeSet =
[
new LdapAttribute("objectClass", "inetOrgPerson"),
@@ -83,7 +84,7 @@ public class UsersController : Controller
new LdapAttribute("uid", uid),
new LdapAttribute("jpegPhoto", jpegPhoto),
new LdapAttribute("description", description),
new LdapAttribute("userPassword", userPassword)
new LdapAttribute("userPassword", userPassword),
];
await _ldap.CreateUser(uid, attributeSet);
return true;

View File

@@ -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;
}

View File

@@ -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)
{