Files
BusinessMgr-2019/SaBusMgrStandardBase/Base/App/SbmSessionData.cs
T
2021-08-05 20:36:06 +01:00

171 lines
7.3 KiB
C#

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.
/// <summary>Protected constructor for deserialisation only.</summary>
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);
}
/// <summary>
/// Primary constructor - on user login.
/// <para>SessionContext and UserAccount must be supplied.</para>
/// <para>Roles list is optional.</para>
/// </summary>
protected SbmSessionData(SbmSessionContext sessionContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> 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<SysIdString> 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<SysIdString>();
}
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; }
/// <summary>User managed associations - Id and display name.</summary>
public List<SysIdString> SupervisedOrganisations { get { return new List<SysIdString>(supervisedOrganisations); } }
protected List<SysIdString> supervisedOrganisations { get; } = new List<SysIdString>();
public bool KeepLoggedIn { get; protected set; }
public bool UserAccountSupplied { get; protected set; }
// Refresh properties.
protected bool Refresh(SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> 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<SysIdString> supervisedOrganisations);
[JsonProperty("User")]
protected UserData userData;
[JsonIgnore]
/// <summary>User account details.</summary>
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; } }
//-------------------------------------------------------------------
}
//=======================================================================
}