feat(DirectorySearchQuery): Implementierung von DirectorySearchQueryHandler mit Eigenschaftsfilterung und Ergebnissammlung

- Aktualisierung von DirectorySearchQuery, um Eigenschaften zu akzeptieren und IEnumerable<ResultPropertyCollection> zurückzugeben
- Implementierung von DirectorySearchQueryHandler, um die Suche mit benutzerdefinierten Filtern, Bereichen und Eigenschaftsauswahl auszuführen
- Hinzufügen einer Logik, um nur angeforderte Eigenschaften zu laden, wenn diese angegeben sind
- Ersetzen von NotImplementedException durch die tatsächliche DirectorySearcher-Logik
This commit is contained in:
Developer 02 2025-08-03 08:53:23 +02:00
parent e75127c74e
commit 452cc6345c

View File

@ -4,13 +4,14 @@ using System.DirectoryServices;
namespace DigitalData.ActiveDirectory;
public record DirectorySearchQuery(string? Filter = null, SearchScope Scope = SearchScope.Subtree, int SizeLimit = 5000) : IRequest
public record DirectorySearchQuery(string? Filter = null, SearchScope Scope = SearchScope.Subtree, int SizeLimit = 5000, params string[] properties)
: IRequest<IEnumerable<ResultPropertyCollection>>
{
public Action<DirectorySearcher>? Options { get; set; }
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
public class DirectorySearchQueryHandler(IOptions<ActiveDirectoryOptions> options) : IRequestHandler<DirectorySearchQuery>
public class DirectorySearchQueryHandler(IOptions<ActiveDirectoryOptions> options) : IRequestHandler<DirectorySearchQuery, IEnumerable<ResultPropertyCollection>>
{
public DirectoryEntry DirectoryEntry => new ()
@ -20,8 +21,26 @@ public class DirectorySearchQueryHandler(IOptions<ActiveDirectoryOptions> option
Password = options.Value.Password
};
public Task Handle(DirectorySearchQuery request, CancellationToken cancellationToken)
public Task<IEnumerable<ResultPropertyCollection>> Handle(DirectorySearchQuery request, CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
return Task.Run(() =>
{
using var _dirEntry = DirectoryEntry;
using var searcher = new DirectorySearcher()
{
Filter = request.Filter,
SearchScope = request.Scope,
SizeLimit = request.SizeLimit,
SearchRoot = _dirEntry
};
request.Options?.Invoke(searcher);
if (request.properties.Length > 0)
searcher.PropertiesToLoad.Clear();
searcher.PropertiesToLoad.AddRange([.. request.properties.Where(p => p is not null)]);
return searcher.FindAll().Cast<SearchResult>().Select(r => r.Properties);
});
}
}