89 lines
3.3 KiB
C#
89 lines
3.3 KiB
C#
using Disco.Data.Repository;
|
|
using Disco.Models.Repository;
|
|
using Disco.Models.Services.Devices.Importing;
|
|
using Disco.Services.Interop.ActiveDirectory;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
|
|
namespace Disco.Services.Devices.Importing.Fields
|
|
{
|
|
internal class DeviceComputerNameImportField : DeviceImportFieldBase
|
|
{
|
|
private const int maxLength = 60;
|
|
private string parsedValue;
|
|
private string previousValue;
|
|
|
|
public override DeviceImportFieldTypes FieldType { get { return DeviceImportFieldTypes.DeviceComputerName; } }
|
|
|
|
public override object RawParsedValue { get { return parsedValue; } }
|
|
public override string FriendlyValue { get { return parsedValue; } }
|
|
public override string FriendlyPreviousValue { get { return previousValue; } }
|
|
|
|
public override bool Parse(DiscoDataContext Database, IDeviceImportCache Cache, IDeviceImportContext Context, string DeviceSerialNumber, Device ExistingDevice, List<IDeviceImportRecord> PreviousRecords, IDeviceImportDataReader DataReader, int ColumnIndex)
|
|
{
|
|
var value = DataReader.GetString(ColumnIndex);
|
|
|
|
if (string.IsNullOrWhiteSpace(value))
|
|
parsedValue = null;
|
|
else
|
|
parsedValue = value.Trim();
|
|
|
|
if (string.IsNullOrEmpty(parsedValue))
|
|
return Error("The Device Computer Name is required");
|
|
|
|
try
|
|
{
|
|
parsedValue = ActiveDirectory.ParseDomainAccountId(parsedValue);
|
|
}
|
|
catch (ArgumentException ex) when (ex.ParamName == "NetBiosName")
|
|
{
|
|
return Error(ex.Message);
|
|
}
|
|
|
|
if (parsedValue.Length > maxLength)
|
|
return Error($"Cannot be more than {maxLength} characters");
|
|
|
|
if (ExistingDevice != null)
|
|
{
|
|
if (string.Equals(parsedValue, ExistingDevice.DeviceDomainId, StringComparison.OrdinalIgnoreCase))
|
|
return Success(EntityState.Unchanged);
|
|
if (ExistingDevice.EnrolledDate.HasValue)
|
|
return Error("The Device Computer Name cannot be changed after a device has enrolled");
|
|
else
|
|
{
|
|
previousValue = ExistingDevice.DeviceDomainId;
|
|
return Success(EntityState.Modified);
|
|
}
|
|
}
|
|
|
|
return Success(EntityState.Added);
|
|
}
|
|
|
|
public override bool Apply(DiscoDataContext Database, Device Device)
|
|
{
|
|
if (FieldAction == EntityState.Added ||
|
|
FieldAction == EntityState.Modified)
|
|
{
|
|
Device.DeviceDomainId = parsedValue;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public override int? GuessColumn(DiscoDataContext Database, IDeviceImportContext Context, IDeviceImportDataReader DataReader)
|
|
{
|
|
// column name
|
|
var possibleColumns = Context.Columns
|
|
.Where(h => h.Type == DeviceImportFieldTypes.IgnoreColumn &&
|
|
h.Name.IndexOf("name", StringComparison.OrdinalIgnoreCase) >= 0);
|
|
|
|
return possibleColumns.Select(h => (int?)h.Index).FirstOrDefault();
|
|
}
|
|
}
|
|
}
|