using Newtonsoft.Json; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Helpers; using Sarand.Net.Standard.Base.Security; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; namespace Sarand.BusinessMgr.Net.Standard.Base.App { //======================================================================= public abstract class SbmSessionData { //------------------------------------------------------------------- private static long sessionIdxRoot = SacsRandomHelper.GetInt32(1000, 1999); //------------------------------------------------------------------- // Construction. /// Protected constructor for deserialisation only. protected SbmSessionData(long sessionIdx, int itemIdx, SbmSessionContext sessionContext) { SessionIdx = sessionIdx; ItemIdx = itemIdx; SessionContext = sessionContext; userData = CreateUserData(SessionContext, null, null, null); organisationData = new OrganisationData(null, null); } /// /// Plain constructor - Contorl application. /// SessionContext must be supplied. /// protected SbmSessionData(SbmSessionContext sessionContext) { SessionIdx = ++sessionIdxRoot; ItemIdx = 1000; SessionContext = sessionContext; } /// /// Primary constructor - on user login. /// SessionContext and UserAccount must be supplied. /// Roles list is optional. /// protected SbmSessionData(SbmSessionContext sessionContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List supervisedOrganisations, SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation) { SessionIdx = ++sessionIdxRoot; ItemIdx = 1000; SessionContext = sessionContext; userData = CreateUserData(SessionContext, securityItemUser, affiliateUser, supervisedOrganisations); organisationData = new OrganisationData(associationOrganisation, affiliateOrganisation); } //------------------------------------------------------------------- // Properties. // Session and Item indexers. public long SessionIdx { get; } public int ItemIdx { get; private set; } [JsonIgnore] public int NextItemIdx { get { return ++ItemIdx; } } // Session context. public SbmSessionContext SessionContext { get; } [JsonIgnore] public bool ValidUserSession { get { return SysId.IsValid(User.AffiliateId) && SysId.IsValid(User.AffiliateId); } } [JsonIgnore] public DbUpdateInfo DbUpdateInfo { get { return new DbUpdateInfo(User.AffiliateId, StringUtil.OnEmpty(userData.DisplayName, userData.EmailAddress), SbmSystem.ComputerName); } } //------------------------------------------------------------------- // User. public class UserData : ISbmUserContext.IUserData { protected UserData() { } protected UserData(SbmSessionContext sessionContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List supervisedOrganisations) { if (securityItemUser != null) { SecurityItemId = securityItemUser.Id; } if (affiliateUser != null) { AffiliateId = affiliateUser.Id; Refresh(securityItemUser, affiliateUser, supervisedOrganisations); if (sessionContext.Application == Sbm.Application.WebControl) KeepLoggedIn = affiliateUser.KeepLoggedIn_Control; else if (sessionContext.Application == Sbm.Application.WebPortal) KeepLoggedIn = affiliateUser.KeepLoggedIn_Portal; else Debugger.Break(); } this.supervisedOrganisations = supervisedOrganisations ?? new List(); } protected UserData(UserData userData) { SecurityItemId = userData.SecurityItemId; AffiliateId = userData.AffiliateId; Title = userData.Title; FirstName = userData.FirstName; LastName = userData.LastName; DisplayName = userData.DisplayName; EmailAddress = userData.EmailAddress; supervisedOrganisations = userData.supervisedOrganisations; KeepLoggedIn = userData.KeepLoggedIn; } // Properties. public SysId SecurityItemId { get; protected set; } public SysId AffiliateId { get; protected set; } public String Title { get; protected set; } public String FirstName { get; protected set; } public String LastName { get; protected set; } public String DisplayName { get; protected set; } public String EmailAddress { get; protected set; } /// User managed associations - Id and display name. public List SupervisedOrganisations { get { return new List(supervisedOrganisations); } } protected List supervisedOrganisations { get; } = new List(); public bool KeepLoggedIn { get; protected set; } public bool UserAccountSupplied { get; protected set; } // Refresh properties. protected bool Refresh(SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List supervisedOrganisations) { // Check that user matches the session. if (!SysId.IsValid(SecurityItemId) || !SysId.IsValid(securityItemUser?.Id ?? null) || !SecurityItemId.Equals(securityItemUser.Id)) return false; if (!SysId.IsValid(AffiliateId) || !SysId.IsValid(affiliateUser?.Id ?? null) || !AffiliateId.Equals(affiliateUser.Id)) return false; // Refresh properties. EmailAddress = securityItemUser.EmailAddress; Title = affiliateUser.Title; FirstName = affiliateUser.FirstName; LastName = affiliateUser.LastName; DisplayName = affiliateUser.GetDisplayName(); this.supervisedOrganisations.Clear(); this.supervisedOrganisations.AddRange(supervisedOrganisations); return true; } } protected abstract UserData CreateUserData(SbmSessionContext sessionContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List supervisedOrganisations); [JsonProperty("User")] protected UserData userData; [JsonIgnore] /// User account details. public ISbmUserContext.IUserData User { get { return userData; } } public bool ValidUser { get { return SysId.IsValid(userData.SecurityItemId) && SysId.IsValid(userData.AffiliateId); } } public bool KeepLoggedIn { get { return userData.KeepLoggedIn; } } //------------------------------------------------------------------- // Organisation. public class OrganisationData : ISbmUserContext.IOrganisationData { private OrganisationData() { } public OrganisationData(SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation) { AffiliateId = affiliateOrganisation?.Id ?? null; AffiliateType = affiliateOrganisation?.AffiliateType ?? Sbm.AffiliateType.Unknown; AssociationId = associationOrganisation?.Id ?? null; DisplayName = affiliateOrganisation?.GetDisplayName() ?? ""; InterfaceContext = SbmAccountMgr.GetInterfaceContext(AffiliateId); } public SysId AffiliateId { get; protected set; } public Sbm.AffiliateType AffiliateType { get; protected set; } public SysId AssociationId { get; protected set; } public String DisplayName { get; protected set; } public String InterfaceContext { get; } } [JsonProperty("Organisation")] protected OrganisationData organisationData; [JsonIgnore] public ISbmUserContext.IOrganisationData Organisation { get { return organisationData; } } //------------------------------------------------------------------- } //======================================================================= }