using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Controllers;
using Saxonite.Net.Core.Web.Base.Models;
using Saxonite.Net.Core.Web.Online.App;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Online.Models
{
//=======================================================================
public class SaxModel_Online : SaxModel_Base
{
//-------------------------------------------------------------------
// Data members.
private class UserCanManageOptions
{
public bool? OrganisationMembers { get; set; } = null;
public bool? OrganisationOpportunities { get; set; } = null;
public bool? OrganisationSchedule { get; set; } = null;
public bool? OrganisationArticles { get; set; } = null;
}
private readonly UserCanManageOptions userCanManage = new UserCanManageOptions();
//-------------------------------------------------------------------
// Protected construction.
protected SaxModel_Online(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Session.
public SaxSessionData_Online SessionData_Online { get { return SessionData as SaxSessionData_Online; } }
public SysId UserAccountId { get { return SessionData_Online?.User?.UserAccountId ?? null; } }
//-------------------------------------------------------------------
// Menu options.
public bool OrganisationMembersAllowed { get { return UserCanManageOrganisationMembers; } }
public bool ArticlesAllowed { get { return UserIsJournalist || UserCanManageOrganisationArticles; } }
public bool OrganisationOpportunitiesAllowed { get { return UserCanManageOrganisationOpportunities; } }
public bool OrganisationEventsAllowed { get { return UserCanManageOrganisationSchedule; } }
//-------------------------------------------------------------------
// Security profile.
public bool UserIsJournalist { get { return SessionData != null && SessionData.User != null && SessionData.User.IsJournalist; } }
public bool UserCanManageOrganisationMembers
{
get
{
if (userCanManage.OrganisationMembers == null && ValidUserSession)
{
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.MemberAdmin);
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly;
userCanManage.OrganisationMembers = (AccountMgr.GetUserOrganisationCount(prmUserOrganisation) > 0);
}
return userCanManage.OrganisationMembers == true ? true : false;
}
}
public bool UserCanManageOrganisationOpportunities
{
get
{
if (userCanManage.OrganisationOpportunities == null && ValidUserSession)
{
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.OpportunityAdmin);
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly;
userCanManage.OrganisationOpportunities = (AccountMgr.GetUserOrganisationCount(prmUserOrganisation) > 0);
}
return userCanManage.OrganisationOpportunities == true ? true : false;
}
}
public bool UserCanManageOrganisationSchedule
{
get
{
if (userCanManage.OrganisationSchedule == null && ValidUserSession)
{
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.ScheduleAdmin);
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly;
userCanManage.OrganisationSchedule = (AccountMgr.GetUserOrganisationCount(prmUserOrganisation) > 0);
}
return userCanManage.OrganisationSchedule == true ? true : false;
}
}
public bool UserCanManageOrganisationArticles
{
get
{
if (userCanManage.OrganisationArticles == null && ValidUserSession)
{
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId);
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin);
prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.ArticleAdmin);
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly;
userCanManage.OrganisationArticles = (AccountMgr.GetUserOrganisationCount(prmUserOrganisation) > 0);
}
return userCanManage.OrganisationArticles == true ? true : false;
}
}
//-------------------------------------------------------------------
// Item Id Obfuscation.
//-------------------------------------------------------------------
public SysId ExtractSysId(String idx)
{
String fn = GetType().Name + ".ExtractSysId";
if (StringUtil.IsEmpty(idx)) return null;
// Numeric values are assumed to be unencrypted Ids.
if (StringUtil.IsNumeric(idx))
return idx.ToSysId();
try
{
// Attempt to decrypt.
SysId id = DecryptId(idx);
if (SysId.IsValid(id))
return id;
}
catch (Exception exc)
{
SaLogger.Warn(fn + " " + ExceptionUtil.GetErrorStateMessage(exc));
}
return null;
}
//-------------------------------------------------------------------
// Id encryption.
// To obfuscate Id values that are sent to and from the browser.
// NB IV value can be reset evert time the application restarts.
public static String Base64Key_IdObfuscation = SacsEncryptionHelper.EncodePlainKey("|SaxOnIte.Onl1n3-iD+0bfuscAtion|", SacsEncryptionHelper.KeyLength);
public static String Base64IV_IdObfuscation = SacsEncryptionHelper.InitSymmetricEncryptionIV(Base64Key_IdObfuscation);
public static String ParamName_IdObfuscation_Id { get; } = "iob";
public String EncryptId(SysId id)
{
if (!SysId.IsValid(id)) return "";
NameValueCollection idObfuscationParams = new NameValueCollection();
idObfuscationParams.Add(ParamName_IdObfuscation_Id, SysId.ToString(id));
return SaxController_Base.EncryptParameters(idObfuscationParams, Base64IV_IdObfuscation, Base64Key_IdObfuscation);
}
public SysId DecryptId(String encryptedId)
{
if (StringUtil.IsEmpty(encryptedId))
return new SysId();
if (StringUtil.IsNumeric(encryptedId))
return encryptedId.ToSysId();
NameValueCollection idObfuscationParams = SaxController_Base.DecryptParameters(encryptedId, Base64IV_IdObfuscation, Base64Key_IdObfuscation);
return idObfuscationParams.Get(ParamName_IdObfuscation_Id).ToSysId();
}
//-------------------------------------------------------------------
// Reference Data.
//-------------------------------------------------------------------
// Regions.
/// Region Data - to be JSON serialised in Ajax responses.
public class RegionData
{
/// Encrypted Id
public String Id { get; set; }
public int RegionType { get; set; }
public String RegionTypeCode { get; set; }
public String RegionTypeDesc { get; set; }
public String Name { get; set; }
public String ParentId { get; set; }
public String StatusCode { get; set; }
public String StatusDesc { get; set; }
}
public List GetRegionDataList_Active()
{
List regions = new List();
foreach (SaxRegion.Data region in DataCacheConsole.GetActiveRegions())
{
RegionData regionData = new RegionData()
{
Id = GetEncryptedRegionId(region.Id),
RegionType = (int)region.RegionType,
RegionTypeCode = region.RegionType.ToString(),
RegionTypeDesc = Localiser.GetRegionTypeCaption(region.RegionType),
Name = GetRegionCaption(region),
ParentId = SysId.ToString(region.RegionIdParent),
StatusCode = region.StatusCode,
StatusDesc = Localiser.GetStatusCaption(region.Status)
};
regions.Add(regionData);
}
return regions;
}
public String GetEncryptedRegionId(SysId regionId)
{
return DataCacheConsole.GetEncryptedRegionId(regionId, EncryptId(regionId));
}
public String GetRegionCaption(SysId regionId)
{
SaxRegion.Data region = DataCacheConsole.GetAllRegions().Find(item => item.Id.Equals(regionId));
return Localiser.GetRegionName(region);
}
public String GetRegionCaption(SaxRegion.Data region)
{
return Localiser.GetRegionName(region);
}
//-------------------------------------------------------------------
// Sports.
/// Sport Data - to be JSON serialised in Ajax responses.
public class SportData
{
/// Encrypted Id
public String Id { get; set; }
public String SportIdParent { get; set; }
public String Name { get; set; }
public String StatusCode { get; set; }
public String StatusDesc { get; set; }
}
public List GetSportDataList_Active()
{
List sports = new List();
foreach (SaxSport.Data sport in DataCacheConsole.GetActiveSports())
{
SportData sportData = new SportData()
{
Id = GetEncryptedSportId(sport.Id),
SportIdParent = SysId.IsValid(sport.SportIdParent) ? GetEncryptedSportId(sport.SportIdParent) : null,
Name = GetSportCaption(sport),
StatusCode = sport.StatusCode,
StatusDesc = Localiser.GetStatusCaption(sport.Status)
};
sports.Add(sportData);
}
return sports;
}
public List GetChildSports_Active(SysId sportIdParent)
{
List sports = new List();
if (!SysId.IsValid(sportIdParent)) return sports;
List activeSports = DataCacheConsole.GetActiveSports();
sports.AddRange(activeSports.FindAll(item => sportIdParent.Equals(item.SportIdParent)));
return sports;
}
public String GetEncryptedSportId(SysId sportId)
{
return DataCacheConsole.GetEncryptedSportId(sportId, EncryptId(sportId));
}
// Sport caption.
public String GetSportCaption(SysId sportId)
{
SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId));
return GetSportCaption(sport);
}
public String GetSportCaption(SaxSport.Data sport)
{
if (sport == null) return "";
return Localiser.GetSportName(sport);
}
// Speciality type.
public bool SportSpecialityNotRelevant(SysId sportId)
{
SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId));
return SportSpecialityNotRelevant(sport);
}
public bool SportSpecialityNotRelevant(SaxSport.Data sport)
{
if (sport == null) return true;
return sport.SpecialityLabel == Sax.SportSpecialityLabel.NotRelevant;
}
// Speciality label.
public String GetSportSpecialityLabel(SysId sportId)
{
SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId));
return GetSportSpecialityLabel(sport);
}
public String GetSportSpecialityLabel(SaxSport.Data sport)
{
if (sport == null) return "";
switch (sport.SpecialityLabel)
{
case Sax.SportSpecialityLabel.Positon:
return Localiser["label.position"];
case Sax.SportSpecialityLabel.Discipline:
return Localiser["label.discipline"];
}
return Localiser["label.speciality"];
}
//-------------------------------------------------------------------
}
//=======================================================================
}