Files
Common-VS2019/SacsStandardBase/Base/Security/SaSecurityLink.cs
T
2025-01-27 10:01:50 +00:00

287 lines
9.6 KiB
C#

using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Base.Security
{
//=======================================================================
public abstract class SaSecurityLink : SacsHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
public enum Column
{
Pos = 0,
ItemIdOwner,
ItemOwner_Code,
ItemOwner_Desc,
ItemIdTarget,
ItemTarget_Code,
ItemTarget_Desc,
ItemIdContext,
ItemContext_Desc,
DaysApplicable,
DateApplicableFrom,
DateApplicableTo,
Granted_Y,
Denied_X,
Status,
Status_Ind,
Status_Desc,
CreateOn_Date,
UpdateOn_Date,
}
//-------------------------------------------------------------------
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public SysId ItemIdOwner { get; set; } = new SysId();
public SysId ItemIdTarget { get; set; } = new SysId();
public SysId ItemIdContext { get; set; } = new SysId();
public String DayApplicability { get; set; } = String.Empty;
public DateTime ApplicableFrom { get; set; } = DateTime.MinValue;
public DateTime ApplicableTo { get; set; } = DateTime.MinValue;
}
//-------------------------------------------------------------------
// Data.
public new class Data : SacsHierarchyItem.Data
{
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data ()
{
Status = DefaultStatus;
}
// Properties.
public SysId ItemIdOwner
{
get { return data.ItemIdOwner; }
set { CheckChanged(data.ItemIdOwner, value); data.ItemIdOwner = value; }
}
public SysId ItemIdTarget
{
get { return data.ItemIdTarget; }
set { CheckChanged(data.ItemIdTarget, value); data.ItemIdTarget = value; }
}
public SysId ItemIdContext
{
get { return data.ItemIdContext; }
set { CheckChanged(data.ItemIdContext, value); data.ItemIdContext = value; }
}
public String DayApplicability
{
get { return data.DayApplicability; }
set { CheckChanged(data.DayApplicability, value); data.DayApplicability = value; }
}
public DateTime ApplicableFrom
{
get { return data.ApplicableFrom; }
set { CheckChanged(data.ApplicableFrom, value); data.ApplicableFrom = value; }
}
public DateTime ApplicableTo
{
get { return data.ApplicableTo; }
set { CheckChanged(data.ApplicableTo, value); data.ApplicableTo = value; }
}
// Population.
internal void PopulateFrom (Data data)
{
ItemIdOwner = data.ItemIdOwner;
ItemIdTarget = data.ItemIdTarget;
ItemIdContext = data.ItemIdContext;
DayApplicability = data.DayApplicability;
ApplicableFrom = data.ApplicableFrom;
ApplicableTo = data.ApplicableTo;
base.PopulateFrom(data);
}
public Data Clone ()
{
Data data = new Data();
data.PopulateFrom(this);
return data;
}
}
//-------------------------------------------------------------------
// Error field - identify properties with validation error.
public new class ErrField : SacsHierarchyItem.ErrField
{
// Identifies the field that has invalid data.
public ValidValue ItemIdOwner { get; set; } = ValidValue.Valid;
public ValidValue ItemIdTarget { get; set; } = ValidValue.Valid;
public ValidValue ItemIdContext { get; set; } = ValidValue.Valid;
public ValidValue DayApplicability { get; set; } = ValidValue.Valid;
public ValidValue ApplicableFrom { get; set; } = ValidValue.Valid;
public ValidValue ApplicableTo { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
// Data members.
private readonly Data data = new Data();
//-------------------------------------------------------------------
// Construction.
public SaSecurityLink (SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext) :
base()
{
base.SetData(data);
ItemIdOwner = itemIdOwner;
ItemIdTarget = itemIdTarget;
ItemIdContext = itemIdContext;
Status = DefaultStatus;
}
//-------------------------------------------------------------------
// Status.
private static readonly List<SaStatus> securityLinkStatuses = new List<SaStatus>()
{
SaStatus.Granted,
SaStatus.Denied,
};
public static SaStatus DefaultStatus { get { return GrantedStatus; } }
public static SaStatus GrantedStatus { get { return SaStatus.Granted; } }
public static SaStatus DeniedStatus { get { return SaStatus.Denied; } }
public static List<SaStatus> ValidStatuses { get { return new List<SaStatus>(securityLinkStatuses); } }
public static DataValue.TriStateType GetStatusTriState (SaStatus status)
{
switch (status)
{
case SaStatus.Granted:
return DataValue.TriStateType.Green;
case SaStatus.Denied:
return DataValue.TriStateType.Red;
case SaStatus.Deleted:
return DataValue.TriStateType.Purple;
}
return DataValue.TriStateType.Unknown;
}
//-------------------------------------------------------------------
// Properties.
public Data GetData () { return data.Clone(); }
public void SetData (Data data)
{
// Properties that cannot be changed if previously specified.
if (SysId.IsValid(data.Id))
throw new NotSupportedException($"{SysUtil.Fn} Id is not applicable for security links");
if (SysId.IsValid(data.ItemIdOwner) && SysId.ToInt(data.ItemIdOwner) != SysId.ToInt(ItemIdOwner))
throw new NotSupportedException($"{SysUtil.Fn} Owner Item cannot be changed");
if (SysId.IsValid(data.ItemIdTarget) && SysId.ToInt(data.ItemIdTarget) != SysId.ToInt(ItemIdTarget))
throw new NotSupportedException($"{SysUtil.Fn} Target Item cannot be changed");
// Populate individual properties to ensure that 'Changed' indicator is kept up to date.
this.data.PopulateFrom(data);
}
//-------------------------------------------------------------------
// Properties.
public override bool ItemHasId { get { return false; } }
public SysId ItemIdOwner
{
get { return data.ItemIdOwner; }
protected set { data.ItemIdOwner = value; }
}
public SysId ItemIdTarget
{
get { return data.ItemIdTarget; }
protected set { data.ItemIdTarget = value; }
}
public SysId ItemIdContext
{
get { return data.ItemIdContext; }
protected set { data.ItemIdContext = value; }
}
public String DayApplicability
{
get { return data.DayApplicability; }
set { data.DayApplicability = value; }
}
public DateTime ApplicableFrom
{
get { return data.ApplicableFrom; }
set { data.ApplicableFrom = value; }
}
public DateTime ApplicableTo
{
get { return data.ApplicableTo; }
set { data.ApplicableTo = value; }
}
//-------------------------------------------------------------------
// List parameters.
public enum StatusCat
{
Any,
GrantedOnly,
DeniedOnly,
}
/// <summary>
/// Item list parameters.
/// </summary>
public new class Params : SacsHierarchyItem.Params
{
public readonly HashSet<SysId> ItemIdsOwnerIncluded = new HashSet<SysId>();
public SaSecurity.ItemType OwnerItemType { get; set; } = SaSecurity.ItemType.Unknown;
public readonly HashSet<SysId> ItemIdsTargetIncluded = new HashSet<SysId>();
public SaSecurity.ItemType TargetItemType { get; set; } = SaSecurity.ItemType.Unknown;
public readonly HashSet<SysId> ItemIdsContextIncluded = new HashSet<SysId>();
public StatusCat StatusCat { get; set; } = StatusCat.Any;
}
//-------------------------------------------------------------------
}
//=======================================================================
public static class SaSecurityLinkList
{
//-------------------------------------------------------------------
// Link owner.
public static bool ContaineOwnerItemId (this List<SaSecurityLink> links, SysId itemIdOwner)
{
if (!SysId.IsValid(itemIdOwner)) return false;
SaSecurityLink secLink = links.Find(link => SysId.IsValid(link.ItemIdOwner) && link.ItemIdOwner.Equals(itemIdOwner));
return (secLink != null);
}
public static List<SysId> GetOwnerItemIds (this List<SaSecurityLink> links)
{
List<SysId> ownerItemIds = new List<SysId>();
foreach (SaSecurityLink secLink in links)
{
if (SysId.IsValid(secLink.ItemIdOwner) && !ownerItemIds.Contains(secLink.ItemIdOwner))
ownerItemIds.Add(secLink.ItemIdOwner);
}
return ownerItemIds;
}
//-------------------------------------------------------------------
// Link target.
public static bool ContainsTargetItemId (this List<SaSecurityLink> links, SysId itemIdTarget)
{
if (!SysId.IsValid(itemIdTarget)) return false;
SaSecurityLink secLink = links.Find(link => SysId.IsValid(link.ItemIdTarget) && link.ItemIdTarget.Equals(itemIdTarget));
return (secLink != null);
}
public static List<SysId> GetTargetItemIds (this List<SaSecurityLink> links)
{
List<SysId> targetItemIds = new List<SysId>();
foreach (SaSecurityLink secLink in links)
{
if (SysId.IsValid(secLink.ItemIdTarget) && !targetItemIds.Contains(secLink.ItemIdTarget))
targetItemIds.Add(secLink.ItemIdTarget);
}
return targetItemIds;
}
public static SaStatus GetStatusByTargetItemId (this List<SaSecurityLink> links, SysId itemIdTarget)
{
if (!SysId.IsValid(itemIdTarget)) return SaStatus.Unknown;
SaSecurityLink secLink = links.Find(link => SysId.IsValid(link.ItemIdTarget) && link.ItemIdTarget.Equals(itemIdTarget));
return (secLink != null ? secLink.Status : SaStatus.Unknown);
}
//-------------------------------------------------------------------
}
//=======================================================================
}