using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Standard.Base.App;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Saxonite.Net.Standard.Base.Bus
{
//=======================================================================
public abstract class SaxUserAccount : SacsHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
public enum Column
{
Pos,
Id,
EmailAddress,
Title,
FirstName,
Initials,
LastName,
About,
PhoneMain,
PhoneMobile,
DateOfBirthDay,
DateOfBirthMonth,
DateOfBirthYear,
DateOfBirth,
// Regions.
RegionIdCountry,
RegionCountry_Name,
RegionIdProvince,
RegionProvince_Name,
// Security.
PasswordToken,
PasswordChangedOn,
PasswordChangedAt,
// Login.
LastLoginOn,
LastLoginAt,
LastInvalidLoginOn,
LastInvalidLoginAt,
InvalidLoginCount,
// Associated data.
UserRoleCount,
SystemAdminUser,
// Common.
Notes,
Flags,
Status,
Status_Desc,
Status_Ind,
CreateOn_Date,
UpdateOn_Date,
}
//-------------------------------------------------------------------
/// Properties other than common.
public class DataProperties
{
public String EmailAddress { get; set; } = String.Empty;
public String Title { get; set; } = String.Empty;
public String FirstName { get; set; } = String.Empty;
public String Initials { get; set; } = String.Empty;
public String LastName { get; set; } = String.Empty;
public String About { get; set; } = String.Empty;
public String PhoneMain { get; set; } = String.Empty;
public String PhoneMobile { get; set; } = String.Empty;
public Sax.Gender Gender { get; set; }
public byte DateOfBirthDay { get; set; }
public byte DateOfBirthMonth { get; set; }
public short DateOfBirthYear { get; set; }
public SysId RegionIdCountry { get; set; }
public SysId RegionIdProvince { get; set; }
// Security.
public String PasswordHashed { get; set; } = String.Empty;
public List PasswordHistory { get; } = new List();
public String PasswordToken { get; set; } = String.Empty;
public DateTime PasswordChangedAt { get; set; } = DateTime.MinValue;
// Login.
public DateTime LastLoginAt { get; set; } = DateTime.MinValue;
public DateTime LastInvalidLoginAt { get; set; } = DateTime.MinValue;
public short InvalidLoginCount { get; set; }
}
//-------------------------------------------------------------------
// Data.
public new class Data : SacsHierarchyItem.Data
{
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data()
{
Status = DefaultStatus;
}
// Properties.
public String EmailAddress
{
get { return data.EmailAddress; }
set { CheckChanged(data.EmailAddress, value); data.EmailAddress = value; }
}
public String Title
{
get { return data.Title; }
set { CheckChanged(data.Title, value); data.Title = value; }
}
public String FirstName
{
get { return data.FirstName; }
set { CheckChanged(data.FirstName, value); data.FirstName = value; }
}
public String Initials
{
get { return data.Initials; }
set { CheckChanged(data.Initials, value); data.Initials = value; }
}
public String LastName
{
get { return data.LastName; }
set { CheckChanged(data.LastName, value); data.LastName = value; }
}
public String About
{
get { return data.About; }
set { CheckChanged(data.About, value); data.About = value; }
}
public String PhoneMain
{
get { return data.PhoneMain; }
set { CheckChanged(data.PhoneMain, value); data.PhoneMain = value; }
}
public String PhoneMobile
{
get { return data.PhoneMobile; }
set { CheckChanged(data.PhoneMobile, value); data.PhoneMobile = value; }
}
public Sax.Gender Gender
{
get { return data.Gender; }
set { CheckChanged((int)data.Gender, (int)value); data.Gender = value; }
}
public byte DateOfBirthDay
{
get { return data.DateOfBirthDay; }
set { CheckChanged(data.DateOfBirthDay, value); data.DateOfBirthDay = value; }
}
public byte DateOfBirthMonth
{
get { return data.DateOfBirthMonth; }
set { CheckChanged(data.DateOfBirthMonth, value); data.DateOfBirthMonth = value; }
}
public short DateOfBirthYear
{
get { return data.DateOfBirthYear; }
set { CheckChanged(data.DateOfBirthYear, value); data.DateOfBirthYear = value; }
}
public SysId RegionIdCountry
{
get { return data.RegionIdCountry; }
set { CheckChanged(data.RegionIdCountry, value); data.RegionIdCountry = value; }
}
public SysId RegionIdProvince
{
get { return data.RegionIdProvince; }
set { CheckChanged(data.RegionIdProvince, value); data.RegionIdProvince = value; }
}
// Security.
public String PasswordHashed
{
get { return data.PasswordHashed; }
set { CheckChanged(data.PasswordHashed, value); data.PasswordHashed = value; }
}
public List PasswordHistory
{
get { return data.PasswordHistory; }
set
{
CheckChanged(data.PasswordHistory, value);
data.PasswordHistory.Clear();
data.PasswordHistory.AddRange((value ?? new List()).FindAll(item => !StringUtil.IsEmpty(StringUtil.TrimAll(item))));
}
}
public String PasswordToken
{
get { return data.PasswordToken; }
set { CheckChanged(data.PasswordToken, value); data.PasswordToken = value; }
}
public DateTime PasswordChangedAt
{
get { return data.PasswordChangedAt; }
set { CheckChanged(data.PasswordChangedAt, value); data.PasswordChangedAt = value; }
}
// Login.
public DateTime LastLoginAt
{
get { return data.LastLoginAt; }
set { CheckChanged(data.LastLoginAt, value); data.LastLoginAt = value; }
}
public DateTime LastInvalidLoginAt
{
get { return data.LastInvalidLoginAt; }
set { CheckChanged(data.LastInvalidLoginAt, value); data.LastInvalidLoginAt = value; }
}
public short InvalidLoginCount
{
get { return data.InvalidLoginCount; }
set { CheckChanged(data.InvalidLoginCount, value); data.InvalidLoginCount = value; }
}
// Population.
internal void PopulateFrom(Data data)
{
EmailAddress = data.EmailAddress;
Title = data.Title;
FirstName = data.FirstName;
Initials = data.Initials;
LastName = data.LastName;
About = data.About;
PhoneMain = data.PhoneMain;
PhoneMobile = data.PhoneMobile;
Gender = data.Gender;
DateOfBirthDay = data.DateOfBirthDay;
DateOfBirthMonth = data.DateOfBirthMonth;
DateOfBirthYear = data.DateOfBirthYear;
RegionIdCountry = data.RegionIdCountry;
RegionIdProvince = data.RegionIdProvince;
// Security.
PasswordHashed = data.PasswordHashed;
PasswordHistory = data.PasswordHistory;
PasswordToken = data.PasswordToken;
PasswordChangedAt = data.PasswordChangedAt;
// Login.
LastLoginAt = data.LastLoginAt;
LastInvalidLoginAt = data.LastInvalidLoginAt;
InvalidLoginCount = data.InvalidLoginCount;
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 EmailAddress { get; set; } = ValidValue.Valid;
public ValidValue Title { get; set; } = ValidValue.Valid;
public ValidValue FirstName { get; set; } = ValidValue.Valid;
public ValidValue Initials { get; set; } = ValidValue.Valid;
public ValidValue LastName { get; set; } = ValidValue.Valid;
public ValidValue About { get; set; } = ValidValue.Valid;
public ValidValue PhoneMain { get; set; } = ValidValue.Valid;
public ValidValue PhoneMobile { get; set; } = ValidValue.Valid;
public ValidValue Gender { get; set; } = ValidValue.Valid;
public ValidValue DateOfBirthDay { get; set; } = ValidValue.Valid;
public ValidValue DateOfBirthMonth { get; set; } = ValidValue.Valid;
public ValidValue DateOfBirthYear { get; set; } = ValidValue.Valid;
public ValidValue RegionIdCountry { get; set; } = ValidValue.Valid;
public ValidValue RegionIdProvince { get; set; } = ValidValue.Valid;
// Security.
public ValidValue Password { get; set; } = ValidValue.Valid;
public ValidValue PasswordHistory { get; set; } = ValidValue.Valid;
public ValidValue PasswordToken { get; set; } = ValidValue.Valid;
public ValidValue PasswordChanged { get; set; } = ValidValue.Valid;
// Login.
public ValidValue LastLogin { get; set; } = ValidValue.Valid;
public ValidValue LastInvalidLogin { get; set; } = ValidValue.Valid;
public ValidValue InvalidLoginCount { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
// Data members.
private readonly Data data = new Data();
public static readonly String UserRoleDelim = ",";
public static readonly String PasswordHistoryDelim = ",";
//-------------------------------------------------------------------
// Construction.
protected SaxUserAccount(SysId id) : base(id)
{
base.SetData(data);
Status = DefaultStatus;
}
//-------------------------------------------------------------------
// Status.
private static readonly List validStatuses = new List()
{
SaStatus.Awaiting,
SaStatus.Active,
SaStatus.Inactive,
SaStatus.Deleted,
};
public static SaStatus DefaultStatus { get { return SaStatus.Awaiting; } }
public static List ValidStatuses { get { return new List(validStatuses); } }
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
{
if (status == SaStatus.Active) return DataValue.TriStateType.Green;
if (status == SaStatus.Awaiting) return DataValue.TriStateType.Amber;
if (status == SaStatus.Inactive) return DataValue.TriStateType.Red;
if (status == SaStatus.Deleted) return DataValue.TriStateType.Purple;
return DataValue.TriStateType.Unknown;
}
//-------------------------------------------------------------------
// Utilities.
public ItemId GetItemId()
{
return new ItemId((short)Sax.DataItemType.UserAccount, Id);
}
public static String GetDisplayName(SaxUserAccount userAccount)
{
return GetDisplayName(userAccount.Title, userAccount.FirstName, userAccount.LastName);
}
public static String GetDisplayName(String title, String firstName, String lastName)
{
return StringUtil.TrimAll(StringUtil.EmptyOnNull(title) + " " + StringUtil.EmptyOnNull(firstName) + " " + StringUtil.EmptyOnNull(lastName));
}
public String GetDisplayName()
{
return GetDisplayName(this);
}
//-------------------------------------------------------------------
// 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(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id))
throw new NotSupportedException(fn + " Id cannot be changed");
this.data.PopulateFrom(data);
}
public String EmailAddress
{
get { return data.EmailAddress; }
set { data.EmailAddress = value; }
}
public String Title
{
get { return data.Title; }
set { data.Title = value; }
}
public String FirstName
{
get { return data.FirstName; }
set { data.FirstName = value; }
}
public String Initials
{
get { return data.Initials; }
set { data.Initials = value; }
}
public String LastName
{
get { return data.LastName; }
set { data.LastName = value; }
}
public String About
{
get { return data.About; }
set { data.About = value; }
}
public String PhoneMain
{
get { return data.PhoneMain; }
set { data.PhoneMain = value; }
}
public String PhoneMobile
{
get { return data.PhoneMobile; }
set { data.PhoneMobile = value; }
}
public Sax.Gender Gender
{
get { return data.Gender; }
set { data.Gender = value; }
}
public byte DateOfBirthDay
{
get { return data.DateOfBirthDay; }
set { data.DateOfBirthDay = value; }
}
public byte DateOfBirthMonth
{
get { return data.DateOfBirthMonth; }
set { data.DateOfBirthMonth = value; }
}
public short DateOfBirthYear
{
get { return data.DateOfBirthYear; }
set { data.DateOfBirthYear = value; }
}
public SysId RegionIdCountry
{
get { return data.RegionIdCountry; }
set { data.RegionIdCountry = value; }
}
public SysId RegionIdProvince
{
get { return data.RegionIdProvince; }
set { data.RegionIdProvince = value; }
}
// Security.
public String PasswordHashed
{
get { return data.PasswordHashed; }
set { data.PasswordHashed = value; }
}
public List PasswordHistory
{
get { return data.PasswordHistory; }
set { data.PasswordHistory = value; }
}
public String PasswordToken
{
get { return data.PasswordToken; }
set { data.PasswordToken = value; }
}
public DateTime PasswordChangedAt
{
get { return data.PasswordChangedAt; }
set { data.PasswordChangedAt = value; }
}
// Login.
public DateTime LastLoginAt
{
get { return data.LastLoginAt; }
set { data.LastLoginAt = value; }
}
public DateTime LastInvalidLoginAt
{
get { return data.LastInvalidLoginAt; }
set { data.LastInvalidLoginAt = value; }
}
public short InvalidLoginCount
{
get { return data.InvalidLoginCount; }
set { data.InvalidLoginCount = value; }
}
//-------------------------------------------------------------------
// Flags - positions 1-16 available.
public Byte Flag_KeepLoggedIn_Admin { get; } = 0x1;
public Byte Flag_KeepLoggedIn_Online { get; } = 0x2;
public bool KeepLoggedIn_Admin
{
get { return GetFlag(Flag_KeepLoggedIn_Admin); }
set { SetFlag(Flag_KeepLoggedIn_Admin, value); }
}
public bool KeepLoggedIn_Online
{
get { return GetFlag(Flag_KeepLoggedIn_Online); }
set { SetFlag(Flag_KeepLoggedIn_Online, value); }
}
//-------------------------------------------------------------------
// A s s o c i a t e d D a t a
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// P a r a m s
//-------------------------------------------------------------------
// List parameters.
public enum StatusCat
{
Any,
AwaitingOnly,
ActiveOnly,
AwaitingOrActive,
InactiveOnly,
NotDeleted,
DeletedOnly,
}
///
/// Item list parameters.
///
public new class Params : SacsHierarchyItem.Params
{
// List filtering.
public List IdsIncluded { get; } = new List();
public List IdsExcluded { get; } = new List();
public String EmailAddress { get; set; }
public String NamePartial { get; set; }
/// Exact match on various user account properties including name, email etc.
public String UserFilter { get; set; }
/// Partial match on various user account properties including name, countries etc. Not to be used in Online application!
public String UserFilterPartial { get; set; }
public List SportIdsIncluded { get; } = new List();
public List RegionIdsIncluded { get; } = new List();
public List ActiveRoles { get; } = new List();
// Common properties.
public String NotesPartial { get; set; }
public StatusCat StatusCat { get; set; } = StatusCat.ActiveOnly;
// Table aliases - blank if not linked.
public String Alias_UserSport { get; set; }
public String Alias_UserRole { get; set; }
}
//-------------------------------------------------------------------
}
//=======================================================================
// Item list extension methods.
public static class SaxUserAccountList
{
//-------------------------------------------------------------------
///
/// Extract the User Account Ids.
///
public static List GetIds(this List values)
{
return values.Select(item => item.Id).ToList();
}
//-------------------------------------------------------------------
///
/// Extract the first User Account in list with the specified Id.
///
public static SaxUserAccount GetUserAccountById(this List values, SysId userAccountId)
{
return values.Find(item => item.Id.Equals(userAccountId));
}
//-------------------------------------------------------------------
}
//=======================================================================
}