using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
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 { 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 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)
{
String fn = GetType().Name + ".SetData";
// Properties that cannot be changed if previously specified.
if (SysId.IsValid(data.Id))
throw new NotSupportedException(fn + " Id is not applicable for security links");
if (SysId.IsValid(data.ItemIdOwner) && SysId.ToInt(data.ItemIdOwner) != SysId.ToInt(ItemIdOwner))
throw new NotSupportedException(fn + " Owner Item cannot be changed");
if (SysId.IsValid(data.ItemIdTarget) && SysId.ToInt(data.ItemIdTarget) != SysId.ToInt(ItemIdTarget))
throw new NotSupportedException(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,
}
///
/// Item list parameters.
///
public new class Params : SacsHierarchyItem.Params
{
public readonly List includedItemIdsOwner = new List();
public SaSecurity.ItemType OwnerItemType { get; set; } = SaSecurity.ItemType.Unknown;
public readonly List includedItemIdsTarget = new List();
public SaSecurity.ItemType TargetItemType { get; set; } = SaSecurity.ItemType.Unknown;
public readonly List includedItemIdsContext = new List();
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);
}
//-------------------------------------------------------------------
}
//=======================================================================
}