using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Helpers; using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Online.Controllers; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading.Tasks; namespace Saxonite.Net.Core.Web.Online.App { //======================================================================= public class SaxSessionData_Online : SaxSessionData_Web { //------------------------------------------------------------------- // Construction. [JsonConstructor] private SaxSessionData_Online(long sessionIdx, int itemIdx, SaxSessionContext sessionContext) : base(sessionIdx, itemIdx, sessionContext) { } /// /// SessionData construction. /// SessionContext and UserAccount must be supplied. /// Organisation is optional. /// public SaxSessionData_Online(SaxSessionContext sessionContext, SaxUserAccount userAccount, List userRoles) : base(sessionContext, userAccount, userRoles) { } //------------------------------------------------------------------- // Contact details. private class UserData_Online : UserData { public UserData_Online(SaxSessionContext sessionContext, SaxUserAccount userAccount, List userRoles) : base(sessionContext, userAccount, userRoles) { } public UserData_Online(UserData userData) : base(userData) { } public new bool RefreshUserData(SaxUserAccount userAccount) { return base.RefreshUserData(userAccount); } } protected override UserData CreateUserData(SaxSessionContext sessionContext, SaxUserAccount userAccount, List userRoles) { return new UserData_Online(sessionContext, userAccount, userRoles); } /// User - JSON deserialisation route. public new UserData User { get { return base.User; } set { SetUser(new UserData_Online(value)); } } /// /// Update the user's contect details against the session. /// - User Account must match that already against the session. /// public bool RefreshUser(SaxUserAccount userAccount) { UserData_Online user = User as UserData_Online; if (user != null) return user.RefreshUserData(userAccount); return false; } //------------------------------------------------------------------- // User Profile. // Protected constructors & setters for JSON deserialisation. public class UserProfileData { public UserProfileData() { } // Sports. public class SportData { [JsonConstructor] public SportData(SysId sportId, SaStatus status) { SportId = sportId; Status = status; } public SysId SportId { get; protected set; } public SaStatus Status { get; protected set; } } private class SportData_Online : SportData { // Internal class to allow values to be updated. public SportData_Online(SysId sportId, SaStatus status) : base(sportId, status) { } public SportData_Online(SportData sportData) : base(sportData.SportId, sportData.Status) { } public void SetSportId(SysId sportId) { SportId = sportId; } public void SetStatus(SaStatus status) { Status = status; } } [JsonIgnore] private readonly List sports = new List(); [JsonIgnore] public int SportCount { get { return sports.Count; } } public List Sports { get { return new List(sports); } protected set { sports.Clear(); sports.AddRange(value.Select(item => new SportData_Online(item))); } } public void AddSport(SysId sportId, SaStatus status) { if (!SysId.IsValid(sportId)) throw new NotSupportedException("Session Profile Sport must have a valid Id"); SportData_Online sport = this.sports.Find(item => item.SportId == sportId); if (sport != null) { sport.SetStatus(status); } else this.sports.Add(new SportData_Online(sportId, status)); } public void ClearSports() { this.sports.Clear(); } } public UserProfileData Profile { get; protected set; } = new UserProfileData(); //------------------------------------------------------------------- // Filter properties. public class FilterData { /// Id for currently selected Organisation. public SysId OrganisationId { get; set; } /// Display text for currently selected Organisation. public String OrganisationCaption { get; set; } /// /// Store the properties for the currently selected Organisation. /// public bool SetOrganisation(SaxOrganisation organisation) { if (organisation == null) return false; if (!organisation.IsStatusActive) return false; OrganisationId = organisation.Id; OrganisationCaption = organisation.Name; return true; } /// Id for currently selected Organisation of which the user is a member. public SysId OrganisationIdMember { get; set; } /// Display text for currently selected Organisation of which the user is a member. public String OrganisationCaptionMember { get; set; } /// /// Store the properties for the currently selected Organisation for which the User is a member. /// public bool SetMemberOrganisation(SaxOrganisation organisation) { if (organisation == null) return false; if (!organisation.IsStatusActive) return false; OrganisationIdMember = organisation.Id; OrganisationCaptionMember = organisation.Name; return true; } } public FilterData Filter { get; private set; } = new FilterData(); //------------------------------------------------------------------- // Online application encryption IV value - for consistent encryption during session. public String Base64IV_OnlineApp { get; private set; } = SacsEncryptionHelper.InitSymmetricEncryptionIV(SaxController_Online.Base64Key_OnlineApp); //------------------------------------------------------------------- // JSON Deserialisation. [JsonExtensionData] #pragma warning disable IDE0044 // Add readonly modifier private IDictionary _additionalData = null; #pragma warning restore IDE0044 // Add readonly modifier [OnDeserialized] private void OnDeserialized(StreamingContext context) { if (_additionalData != null) { foreach (String name in _additionalData.Keys) { JToken value = _additionalData[name]; SaLogger.Info("OnDeserialized Name: " + name + ". Value: " + value.ToString()); } } } //------------------------------------------------------------------- } //======================================================================= }