Add core comparison service
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Plugins.ADCompare.Models;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Disco.Plugins.ADCompare.Features
|
||||
{
|
||||
public class ADCompareService
|
||||
{
|
||||
private readonly DiscoDataContext database;
|
||||
|
||||
public ADCompareService(DiscoDataContext database)
|
||||
{
|
||||
this.database = database;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compare all Disco users against their Active Directory accounts.
|
||||
/// Returns a summary with per-user comparison results.
|
||||
/// </summary>
|
||||
public ComparisonSummary CompareAllUsers()
|
||||
{
|
||||
var summary = new ComparisonSummary();
|
||||
|
||||
// Load all users from Disco database
|
||||
var discoUsers = database.Users.ToList();
|
||||
summary.TotalDiscoUsers = discoUsers.Count;
|
||||
|
||||
foreach (var discoUser in discoUsers)
|
||||
{
|
||||
var result = CompareUser(discoUser);
|
||||
summary.Results.Add(result);
|
||||
}
|
||||
|
||||
summary.UsersCompared = summary.Results.Count(r => r.UserFoundInAD);
|
||||
summary.UsersNotFoundInAD = summary.Results.Count(r => !r.UserFoundInAD);
|
||||
summary.UsersWithMismatches = summary.Results.Count(r => r.HasMismatches);
|
||||
summary.UsersInSync = summary.Results.Count(r => r.UserFoundInAD && !r.HasMismatches && !r.ADAccountDisabled);
|
||||
summary.ADAccountsDisabled = summary.Results.Count(r => r.ADAccountDisabled);
|
||||
|
||||
return summary;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compare a single Disco user against their AD account.
|
||||
/// </summary>
|
||||
public UserComparisonResult CompareUser(User discoUser)
|
||||
{
|
||||
var result = new UserComparisonResult
|
||||
{
|
||||
UserId = discoUser.UserId,
|
||||
DisplayName = discoUser.DisplayName
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
// Look up the user in AD using their UserId (DOMAIN\username format)
|
||||
var adUser = ActiveDirectory.RetrieveADUserAccount(discoUser.UserId);
|
||||
|
||||
if (adUser == null)
|
||||
{
|
||||
result.UserFoundInAD = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
result.UserFoundInAD = true;
|
||||
result.ADAccountDisabled = adUser.IsDisabled;
|
||||
|
||||
// Compare core fields
|
||||
CompareField(result, "Display Name", discoUser.DisplayName, adUser.DisplayName);
|
||||
CompareField(result, "Surname", discoUser.Surname, adUser.Surname);
|
||||
CompareField(result, "Given Name", discoUser.GivenName, adUser.GivenName);
|
||||
CompareField(result, "Email Address", discoUser.EmailAddress, adUser.Email);
|
||||
CompareField(result, "Phone Number", discoUser.PhoneNumber, adUser.Phone);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// If we can't look up the user in AD, mark as not found
|
||||
result.UserFoundInAD = false;
|
||||
result.Mismatches.Add(new FieldMismatch(
|
||||
"AD Lookup Error",
|
||||
discoUser.UserId,
|
||||
ex.Message
|
||||
));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compare a single field between Disco and AD values.
|
||||
/// Treats null and empty string as equivalent.
|
||||
/// </summary>
|
||||
private void CompareField(UserComparisonResult result, string fieldName, string discoValue, string adValue)
|
||||
{
|
||||
var normalisedDisco = NormaliseValue(discoValue);
|
||||
var normalisedAD = NormaliseValue(adValue);
|
||||
|
||||
if (!string.Equals(normalisedDisco, normalisedAD, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
result.Mismatches.Add(new FieldMismatch(fieldName, discoValue ?? "(empty)", adValue ?? "(empty)"));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Normalise a value for comparison - treat null and whitespace as empty.
|
||||
/// </summary>
|
||||
private string NormaliseValue(string value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
return string.Empty;
|
||||
|
||||
return value.Trim();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user