56 lines
2.3 KiB
C#

using DigitalData.Core.Contracts.Application;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Configuration;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices;
using Microsoft.Extensions.Caching.Memory;
namespace DigitalData.Core.Application
{
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
public class DirectorySearchService : ServiceBase, IDirectorySearchService
{
private readonly IMemoryCache _memoryCache;
public readonly string SearchRootPath;
public DirectorySearchService(IConfiguration configuration, ILogger<DirectoryService> logger, IMemoryCache memoryCache)
{
SearchRootPath = configuration["DirectorySearch:SearchRootPath"] ?? throw new ConfigurationErrorsException("SearchRootPath configuration is missing.");
_memoryCache = memoryCache;
}
public IServiceResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000)
{
List<ResultPropertyCollection> list = new();
var searcher = new DirectorySearcher()
{
Filter = filter,
SearchScope = searchScope,
SizeLimit = sizeLimit,
SearchRoot = searchRoot
};
foreach (SearchResult result in searcher.FindAll())
{
ResultPropertyCollection rpc = result.Properties;
list.Add(rpc);
}
return Successful<IEnumerable<ResultPropertyCollection>>(list);
}
public IServiceResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000)
{
List<ResultPropertyCollection> list = new();
_memoryCache.TryGetValue(username, out DirectoryEntry? searchRoot);
if (searchRoot is null)
return Failed<IEnumerable<ResultPropertyCollection>>(MessageKey.DirSearcherDisconnected.ToString());
return FindAll(searchRoot, filter, searchScope, sizeLimit);
}
}
}