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, } //------------------------------------------------------------------- /// Properties other than common. 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 { CheckChangedNullable(data.ApplicableFrom, value); data.ApplicableFrom = value; } } public DateTime? ApplicableTo { get { return data.ApplicableTo; } set { CheckChangedNullable(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 securityLinkStatuses = new List() { 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 ValidStatuses { get { return new List(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() { 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, } /// /// Item list parameters. /// public new class Params : SacsHierarchyItem.Params { public readonly HashSet ItemIdsOwnerIncluded = new HashSet(); public SaSecurity.ItemType OwnerItemType { get; set; } = SaSecurity.ItemType.Unknown; public readonly HashSet ItemIdsTargetIncluded = new HashSet(); public SaSecurity.ItemType TargetItemType { get; set; } = SaSecurity.ItemType.Unknown; public readonly HashSet ItemIdsContextIncluded = new HashSet(); public StatusCat StatusCat { get; set; } = StatusCat.Any; } //------------------------------------------------------------------- } //======================================================================= public static class SaSecurityLinkList { //------------------------------------------------------------------- // Link owner. public static bool ContaineOwnerItemId(this List 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 GetOwnerItemIds(this List links) { List ownerItemIds = new List(); 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 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 GetTargetItemIds(this List links) { List targetItemIds = new List(); 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 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); } //------------------------------------------------------------------- } //======================================================================= }