This commit is contained in:
2021-08-09 14:18:08 +01:00
parent 0d7be69e1e
commit 5e5ef7190b
84 changed files with 2449 additions and 1717 deletions
+5 -1
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
public static class Version
{
private static String version { get; } = "1.1.3.0";
private static String version { get; } = "1.1.4.0";
// Retrieve version.
public static String GetFullVersion () { return version; }
public static String GetAppVersion ()
@@ -40,6 +40,10 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
// Version history.
//-------------------------------------------------------------------
// 1.1.4 9-Aug-2021 Organisation Articles.
// - Journalist Article renamed Article and Organisation Id added.
// - Online Organisation Articles.
// - Admin Send Emails for User.
// 1.1.3 23-Jul-2021 Online Members.
// - Online Members.
// - Admin organisation activation.
+3 -3
View File
@@ -145,7 +145,7 @@ namespace Saxonite.Net.Standard.Base.App
// Activty data.
ActivityIndex = 200,
UserActivity = 202,
JournalistArticle = 210,
Article = 210,
OrganisationOpportunity = 220,
OrganisationEvent = 225,
// Item link components.
@@ -234,9 +234,9 @@ namespace Saxonite.Net.Standard.Base.App
Avatar = 100,
/// <summary>User's profile image, uploaded awaiting confirmation.</summary>
AvatarUpload = 101,
/// <summary>Journalist Article image.</summary>
/// <summary>Article image.</summary>
Article = 200,
/// <summary>Journalist Article image uploaded, awaiting confirmation.</summary>
/// <summary>Article image uploaded, awaiting confirmation.</summary>
ArticleUpload = 201,
}
+68 -66
View File
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Wed 14-Jul-2021 14:06:01
// Code generated by Sarand Database Utilities Fri 6-Aug-2021 19:02:06
//---------------------------------------------------------------------------
namespace Saxonite.Base.App
{
@@ -18,10 +18,10 @@ namespace Saxonite.Base.App
{
Unknown = 0,
ActivityIndex,
Article,
ItemAddress,
ItemImage,
ItemSport,
JournalistArticle,
Organisation,
OrganisationOpportunity,
Region,
@@ -53,6 +53,24 @@ namespace Saxonite.Base.App
ActivityIndex_UpdateOn,
ActivityIndex_UpdateBy,
ActivityIndex_UpdateHost,
Article_Id,
Article_UserAccountIdAuthor,
Article_OrganisationId,
Article_SportIdPrimary,
Article_RegionIdPrimary,
Article_Headline,
Article_Summary,
Article_BodyData,
Article_PublishedAt,
Article_Notes,
Article_Flags,
Article_Status,
Article_CreateOn,
Article_CreateBy,
Article_CreateHost,
Article_UpdateOn,
Article_UpdateBy,
Article_UpdateHost,
ItemAddress_Id,
ItemAddress_ItemType,
ItemAddress_ItemId,
@@ -121,23 +139,6 @@ namespace Saxonite.Base.App
ItemSport_UpdateOn,
ItemSport_UpdateBy,
ItemSport_UpdateHost,
JournalistArticle_Id,
JournalistArticle_UserAccountIdJournalist,
JournalistArticle_SportIdPrimary,
JournalistArticle_RegionIdPrimary,
JournalistArticle_Headline,
JournalistArticle_Summary,
JournalistArticle_BodyData,
JournalistArticle_PublishedAt,
JournalistArticle_Notes,
JournalistArticle_Flags,
JournalistArticle_Status,
JournalistArticle_CreateOn,
JournalistArticle_CreateBy,
JournalistArticle_CreateHost,
JournalistArticle_UpdateOn,
JournalistArticle_UpdateBy,
JournalistArticle_UpdateHost,
Organisation_Id,
Organisation_Name,
Organisation_OrganisationType,
@@ -305,7 +306,7 @@ namespace Saxonite.Base.App
//-------------------------------------------------------------------
// Data members.
private static readonly int tableCount = 15;
private static readonly int columnCount = 261;
private static readonly int columnCount = 262;
private static ulong maxTextLen = 0;
//-------------------------------------------------------------------
@@ -452,10 +453,10 @@ namespace Saxonite.Base.App
private static readonly String[] tables =
{
"ActivityIndex",
"Article",
"ItemAddress",
"ItemImage",
"ItemSport",
"JournalistArticle",
"Organisation",
"OrganisationOpportunity",
"Region",
@@ -506,32 +507,18 @@ namespace Saxonite.Base.App
new ColumnDfn(1,"UpdateOn",9,93,false,23),
new ColumnDfn(1,"UpdateBy",4,4,false,10),
new ColumnDfn(1,"UpdateHost",0,12,false,100),
new ColumnDfn(2,"Id",5,-5,true,19),
new ColumnDfn(2,"ItemType",3,5,false,5),
new ColumnDfn(2,"ItemId",4,4,false,10),
new ColumnDfn(2,"AddressType",3,5,false,5),
new ColumnDfn(2,"Caption",0,-9,false,200),
new ColumnDfn(2,"Line1",0,-9,false,200),
new ColumnDfn(2,"Line2",0,-9,false,200),
new ColumnDfn(2,"Line3",0,-9,false,200),
new ColumnDfn(2,"Town",0,-9,false,100),
new ColumnDfn(2,"Province",0,-9,false,100),
new ColumnDfn(2,"RegionIdProvince",4,4,false,10),
new ColumnDfn(2,"Country",0,-9,false,100),
new ColumnDfn(2,"RegionIdCountry",4,4,false,10),
new ColumnDfn(2,"PostalCode",0,-9,false,32),
new ColumnDfn(2,"PhoneMain",0,-9,false,100),
new ColumnDfn(2,"LocationSource",0,12,false,100),
new ColumnDfn(2,"LocationStoredAt",9,93,false,16),
new ColumnDfn(2,"LocationUpdateRequired",1,-7,false,1),
new ColumnDfn(2,"LocationData",0,-9,false,4000),
new ColumnDfn(2,"LocationFormattedAddress",0,-9,false,4000),
new ColumnDfn(2,"LocationLatitude",8,3,false,9),
new ColumnDfn(2,"LocationLongitude",8,3,false,9),
new ColumnDfn(2,"LocationAltitude",8,3,false,9),
new ColumnDfn(2,"Id",4,4,true,10),
new ColumnDfn(2,"UserAccountIdAuthor",4,4,false,10),
new ColumnDfn(2,"OrganisationId",4,4,false,10),
new ColumnDfn(2,"SportIdPrimary",4,4,false,10),
new ColumnDfn(2,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(2,"Headline",0,-9,false,200),
new ColumnDfn(2,"Summary",0,-9,false,2000),
new ColumnDfn(2,"BodyData",0,-9,false,0),
new ColumnDfn(2,"PublishedAt",9,93,false,16),
new ColumnDfn(2,"Notes",0,-9,false,2000),
new ColumnDfn(2,"Flags",3,5,false,5),
new ColumnDfn(2,"Status",0,1,false,3),
new ColumnDfn(2,"Status",0,12,false,3),
new ColumnDfn(2,"CreateOn",9,93,false,23),
new ColumnDfn(2,"CreateBy",4,4,false,10),
new ColumnDfn(2,"CreateHost",0,12,false,100),
@@ -541,30 +528,48 @@ namespace Saxonite.Base.App
new ColumnDfn(3,"Id",5,-5,true,19),
new ColumnDfn(3,"ItemType",3,5,false,5),
new ColumnDfn(3,"ItemId",4,4,false,10),
new ColumnDfn(3,"ImageType",3,5,false,5),
new ColumnDfn(3,"ImageSeq",2,-6,false,3),
new ColumnDfn(3,"SessionUid",5,-5,false,19),
new ColumnDfn(3,"ImageUid",4,4,false,10),
new ColumnDfn(3,"Filename",0,-9,false,1024),
new ColumnDfn(3,"Mime",0,12,false,64),
new ColumnDfn(3,"ContentType",0,12,false,128),
new ColumnDfn(3,"Width",4,4,false,10),
new ColumnDfn(3,"Height",4,4,false,10),
new ColumnDfn(3,"ImageData",10,-3,false,0),
new ColumnDfn(3,"AddressType",3,5,false,5),
new ColumnDfn(3,"Caption",0,-9,false,200),
new ColumnDfn(3,"Line1",0,-9,false,200),
new ColumnDfn(3,"Line2",0,-9,false,200),
new ColumnDfn(3,"Line3",0,-9,false,200),
new ColumnDfn(3,"Town",0,-9,false,100),
new ColumnDfn(3,"Province",0,-9,false,100),
new ColumnDfn(3,"RegionIdProvince",4,4,false,10),
new ColumnDfn(3,"Country",0,-9,false,100),
new ColumnDfn(3,"RegionIdCountry",4,4,false,10),
new ColumnDfn(3,"PostalCode",0,-9,false,32),
new ColumnDfn(3,"PhoneMain",0,-9,false,100),
new ColumnDfn(3,"LocationSource",0,12,false,100),
new ColumnDfn(3,"LocationStoredAt",9,93,false,16),
new ColumnDfn(3,"LocationUpdateRequired",1,-7,false,1),
new ColumnDfn(3,"LocationData",0,-9,false,4000),
new ColumnDfn(3,"LocationFormattedAddress",0,-9,false,4000),
new ColumnDfn(3,"LocationLatitude",8,3,false,9),
new ColumnDfn(3,"LocationLongitude",8,3,false,9),
new ColumnDfn(3,"LocationAltitude",8,3,false,9),
new ColumnDfn(3,"Notes",0,-9,false,2000),
new ColumnDfn(3,"Flags",3,5,false,5),
new ColumnDfn(3,"Status",0,12,false,3),
new ColumnDfn(3,"Status",0,1,false,3),
new ColumnDfn(3,"CreateOn",9,93,false,23),
new ColumnDfn(3,"CreateBy",4,4,false,10),
new ColumnDfn(3,"CreateHost",0,12,false,100),
new ColumnDfn(3,"UpdateOn",9,93,false,23),
new ColumnDfn(3,"UpdateBy",4,4,false,10),
new ColumnDfn(3,"UpdateHost",0,12,false,100),
new ColumnDfn(4,"Id",4,4,true,10),
new ColumnDfn(4,"Id",5,-5,true,19),
new ColumnDfn(4,"ItemType",3,5,false,5),
new ColumnDfn(4,"ItemId",4,4,false,10),
new ColumnDfn(4,"SportId",4,4,false,10),
new ColumnDfn(4,"ItemSportData",0,-9,false,0),
new ColumnDfn(4,"ImageType",3,5,false,5),
new ColumnDfn(4,"ImageSeq",2,-6,false,3),
new ColumnDfn(4,"SessionUid",5,-5,false,19),
new ColumnDfn(4,"ImageUid",4,4,false,10),
new ColumnDfn(4,"Filename",0,-9,false,1024),
new ColumnDfn(4,"Mime",0,12,false,64),
new ColumnDfn(4,"ContentType",0,12,false,128),
new ColumnDfn(4,"Width",4,4,false,10),
new ColumnDfn(4,"Height",4,4,false,10),
new ColumnDfn(4,"ImageData",10,-3,false,0),
new ColumnDfn(4,"Notes",0,-9,false,2000),
new ColumnDfn(4,"Flags",3,5,false,5),
new ColumnDfn(4,"Status",0,12,false,3),
@@ -575,13 +580,10 @@ namespace Saxonite.Base.App
new ColumnDfn(4,"UpdateBy",4,4,false,10),
new ColumnDfn(4,"UpdateHost",0,12,false,100),
new ColumnDfn(5,"Id",4,4,true,10),
new ColumnDfn(5,"UserAccountIdJournalist",4,4,false,10),
new ColumnDfn(5,"SportIdPrimary",4,4,false,10),
new ColumnDfn(5,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(5,"Headline",0,-9,false,200),
new ColumnDfn(5,"Summary",0,-9,false,2000),
new ColumnDfn(5,"BodyData",0,-9,false,0),
new ColumnDfn(5,"PublishedAt",9,93,false,16),
new ColumnDfn(5,"ItemType",3,5,false,5),
new ColumnDfn(5,"ItemId",4,4,false,10),
new ColumnDfn(5,"SportId",4,4,false,10),
new ColumnDfn(5,"ItemSportData",0,-9,false,0),
new ColumnDfn(5,"Notes",0,-9,false,2000),
new ColumnDfn(5,"Flags",3,5,false,5),
new ColumnDfn(5,"Status",0,12,false,3),
@@ -52,7 +52,7 @@ namespace Saxonite.Net.Standard.Base.App
// Activty data.
dataItemTypeCodes.Add(Sax.DataItemType.ActivityIndex, "ActivityIndex", "Activity Index");
dataItemTypeCodes.Add(Sax.DataItemType.UserActivity, "UserActivity", "User Activity");
dataItemTypeCodes.Add(Sax.DataItemType.JournalistArticle, "JournalistArticle", "Journalist Article");
dataItemTypeCodes.Add(Sax.DataItemType.Article, "Article", "Article");
dataItemTypeCodes.Add(Sax.DataItemType.OrganisationOpportunity, "OrganisationOpportunity", "Organisation Opportunity");
dataItemTypeCodes.Add(Sax.DataItemType.OrganisationEvent, "OrganisationEvent", "Organisation Event");
// Item link components.
@@ -29,7 +29,7 @@ namespace Saxonite.Net.Standard.Base.Bus
UserActivity_ViewedAtLast,
UserActivity_Reaction,
UserActivity_ReactedAtLast,
// Journalist Article.
// Article.
Article_Headline,
Article_Summary,
// Organisation opportunity.
@@ -11,9 +11,9 @@ using System.Xml.Linq;
namespace Saxonite.Net.Standard.Base.Bus
{
//=======================================================================
// Journalist Article - Content data.
// Article - Content data.
//=======================================================================
partial class SaxJournalistArticle
partial class SaxArticle
{
//-------------------------------------------------------------------
// Definitions.
@@ -8,9 +8,9 @@ using System.Text;
namespace Saxonite.Net.Standard.Base.Bus
{
//=======================================================================
// Journalist Article.
// Article.
//=======================================================================
public abstract partial class SaxJournalistArticle : SacsHierarchyItem
public abstract partial class SaxArticle : SacsHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
@@ -18,12 +18,15 @@ namespace Saxonite.Net.Standard.Base.Bus
{
Pos,
Id,
// Journalist.
UserAccountIdJournalist,
Journalist_DisplayName,
Journalist_Title,
Journalist_FirstName,
Journalist_LastName,
// Author.
UserAccountIdAuthor,
Author_DisplayName,
Author_Title,
Author_FirstName,
Author_LastName,
// Organisation.
OrganisationId,
Organisation_Name,
// Sport.
SportIdPrimary,
Sport_Name,
@@ -50,7 +53,8 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public SysId UserAccountIdJournalist { get; set; }
public SysId UserAccountIdAuthor { get; set; }
public SysId OrganisationId { get; set; }
public String Headline { get; set; } = String.Empty;
public String Summary { get; set; } = String.Empty;
public SysId SportIdPrimary { get; set; }
@@ -71,10 +75,15 @@ namespace Saxonite.Net.Standard.Base.Bus
Status = DefaultStatus;
}
// Properties.
public SysId UserAccountIdJournalist
public SysId UserAccountIdAuthor
{
get { return data.UserAccountIdJournalist; }
set { CheckChanged(data.UserAccountIdJournalist, value); data.UserAccountIdJournalist = value; }
get { return data.UserAccountIdAuthor; }
set { CheckChanged(data.UserAccountIdAuthor, value); data.UserAccountIdAuthor = value; }
}
public SysId OrganisationId
{
get { return data.OrganisationId; }
set { CheckChanged(data.OrganisationId, value); data.OrganisationId = value; }
}
public SysId SportIdPrimary
{
@@ -109,7 +118,8 @@ namespace Saxonite.Net.Standard.Base.Bus
// Population.
internal void PopulateFrom(Data data)
{
UserAccountIdJournalist = data.UserAccountIdJournalist;
UserAccountIdAuthor = data.UserAccountIdAuthor;
OrganisationId = data.OrganisationId;
SportIdPrimary = data.SportIdPrimary;
RegionIdPrimary = data.RegionIdPrimary;
Headline = data.Headline;
@@ -131,7 +141,8 @@ namespace Saxonite.Net.Standard.Base.Bus
public new class ErrField : SacsHierarchyItem.ErrField
{
// Identifies the field that has invalid data.
public ValidValue UserAccountIdJournalist { get; set; } = ValidValue.Valid;
public ValidValue UserAccountIdAuthor { get; set; } = ValidValue.Valid;
public ValidValue OrganisationId { get; set; } = ValidValue.Valid;
public ValidValue SportIdPrimary { get; set; } = ValidValue.Valid;
public ValidValue RegionIdPrimary { get; set; } = ValidValue.Valid;
public ValidValue Headline { get; set; } = ValidValue.Valid;
@@ -146,10 +157,11 @@ namespace Saxonite.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Construction.
protected SaxJournalistArticle(SysId id, SysId UserAccountIdJournalist) : base(id)
protected SaxArticle(SysId id, SysId UserAccountIdAuthor, SysId organisationId) : base(id)
{
base.SetData(data);
this.UserAccountIdJournalist = UserAccountIdJournalist;
this.UserAccountIdAuthor = UserAccountIdAuthor;
this.OrganisationId = organisationId;
Status = DefaultStatus;
}
@@ -175,7 +187,7 @@ namespace Saxonite.Net.Standard.Base.Bus
// Utilities.
public ItemId GetItemId()
{
return new ItemId((short)Sax.DataItemType.JournalistArticle, Id);
return new ItemId((short)Sax.DataItemType.Article, Id);
}
//-------------------------------------------------------------------
@@ -187,14 +199,21 @@ namespace Saxonite.Net.Standard.Base.Bus
// 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");
if (SysId.IsValid(UserAccountIdJournalist) && SysId.ToInt(UserAccountIdJournalist) != SysId.ToInt(data.UserAccountIdJournalist))
throw new NotSupportedException(fn + " UserAccountIdJournalist cannot be changed");
if (SysId.IsValid(UserAccountIdAuthor) && SysId.ToInt(UserAccountIdAuthor) != SysId.ToInt(data.UserAccountIdAuthor))
throw new NotSupportedException(fn + " UserAccountIdAuthor cannot be changed");
if (SysId.IsValid(OrganisationId) && SysId.ToInt(OrganisationId) != SysId.ToInt(data.OrganisationId))
throw new NotSupportedException(fn + " OrganisationId cannot be changed");
this.data.PopulateFrom(data);
}
public SysId UserAccountIdJournalist
public SysId UserAccountIdAuthor
{
get { return data.UserAccountIdJournalist; }
protected set { data.UserAccountIdJournalist = value; }
get { return data.UserAccountIdAuthor; }
protected set { data.UserAccountIdAuthor = value; }
}
public SysId OrganisationId
{
get { return data.OrganisationId; }
protected set { data.OrganisationId = value; }
}
public String Headline
{
@@ -254,7 +273,8 @@ namespace Saxonite.Net.Standard.Base.Bus
// List filtering.
public List<SysId> IdsIncluded { get; } = new List<SysId>();
public List<SysId> IdsExcluded { get; } = new List<SysId>();
public List<SysId> UserAccountIdsJournalistIncluded { get; } = new List<SysId>();
public List<SysId> UserAccountIdsAuthorIncluded { get; } = new List<SysId>();
public List<SysId> OrganisationIdsIncluded { get; } = new List<SysId>();
public List<SysId> SportIdsIncluded { get; set; } = new List<SysId>();
public List<SysId> RegionIdsIncluded { get; } = new List<SysId>();
public String HeadlinePartial { get; set; }
@@ -270,7 +290,7 @@ namespace Saxonite.Net.Standard.Base.Bus
}
//=======================================================================
// Item list extension methods.
public static class SaxJournalistArticleList
public static class SaxAuthorArticleList
{
}
@@ -58,6 +58,10 @@ namespace Saxonite.Net.Standard.Base.Consoles
}
public ItemId ItemId { get; }
public DateTime EffectiveOn { get; }
public SysId OrganisationId { get; set; }
public String Organisation { get; set; }
public SysId UserAccountIdAuthor { get; set; }
public String Author { get; set; }
public String Caption { get; protected set; }
public String Blurb { get; protected set; }
public SysId SportId { get; protected set; }
@@ -78,7 +82,7 @@ namespace Saxonite.Net.Standard.Base.Consoles
private SaxInternals internals = null;
private readonly List<Sax.DataItemType> validActivityItemTypes = new List<Sax.DataItemType>()
{
Sax.DataItemType.JournalistArticle,
Sax.DataItemType.Article,
Sax.DataItemType.OrganisationOpportunity,
};
@@ -111,9 +115,9 @@ namespace Saxonite.Net.Standard.Base.Consoles
// Store Activity Index for Specific activities.
//-------------------------------------------------------------------
/// <summary>
/// Store the Activity Index for a Journalist Article.
/// Store the Activity Index for an Article.
/// </summary>
public bool StoreActivityIndex(SaxJournalistArticle article, DbUpdateInfo dbUpdateInfo)
public bool StoreActivityIndex(SaxArticle article, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
@@ -139,7 +143,7 @@ namespace Saxonite.Net.Standard.Base.Consoles
}
return ClearActivityIndex(article.GetItemId(), dbUpdateInfo);
}
public bool ClearActivityIndex(SaxJournalistArticle article, DbUpdateInfo dbUpdateInfo)
public bool ClearActivityIndex(SaxArticle article, DbUpdateInfo dbUpdateInfo)
{
return ClearActivityIndex(article.GetItemId(), dbUpdateInfo);
}
@@ -2,6 +2,7 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Base.App;
using Saxonite.Net.Standard.Base.Bus;
@@ -80,10 +81,18 @@ namespace Saxonite.Net.Standard.Base.Mgr
ClearErrorState();
// Email address.
if (errField.EmailAddress != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.EmailAddress, "email", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress), true))
if (errField.EmailAddress != SacsHierarchyItem.ValidValue.Ignore)
{
errField.EmailAddress = SacsHierarchyItem.ValidValue.Invalid;
return false;
if (!IsValidValue(data.EmailAddress, "email", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress), true))
{
errField.EmailAddress = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (!SacsDataValidationHelper.IsValidEmailAddress(data.EmailAddress))
{
errField.EmailAddress = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid email address");
}
}
// Title.
if (errField.Title != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Title, "Title", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.UserAccount_Title)))
@@ -2,6 +2,7 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Base.App;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
@@ -32,6 +33,7 @@ namespace Saxonite.Net.Standard.Base.Mgr
prmUserOrganisation.StatusCat = statusCat;
return GetUserOrganisationCount(prmUserOrganisation) > 0;
}
/// <summary>
/// Does the user have the specified role with the organisation.
/// </summary>
@@ -40,6 +42,7 @@ namespace Saxonite.Net.Standard.Base.Mgr
if (!SysId.IsValid(userAccountId) || !SysId.IsValid(organisationId) || organisationRole <= 0) return false;
return GetOrganisationRolesForUser(userAccountId, organisationId, statusCat).Contains(organisationRole);
}
/// <summary>
/// Retrieve the roles that a user has with the organisation.
/// </summary>
@@ -57,6 +60,53 @@ namespace Saxonite.Net.Standard.Base.Mgr
return organisationRoles;
}
public class OrganisationIdName
{
public SysId Id { get; internal set; }
public String Name { get; internal set; }
}
/// <summary>
/// Get list of organisation Ids that the user has the specified role with.
/// </summary>
public List<OrganisationIdName> GetOrganisationsForUserRole(SysId userAccountId, Sax.OrganisationRole organisationRole, SaxUserOrganisation.StatusCat statusCat = SaxUserOrganisation.StatusCat.ActiveOnly)
{
List<OrganisationIdName> organisationsData = new List<OrganisationIdName>();
String organisationRoleCode = Internals.OrganisationRoleCodes.GetCodeForType(organisationRole);
if (!SysId.IsValid(userAccountId) || StringUtil.IsEmpty(organisationRoleCode)) return organisationsData;
// Columns.
ColumnDfn colOrganisationId = GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.OrganisationId);
ColumnDfn colOrganisationName = GetUserOrganisationColumnDfn(SaxUserOrganisation.Column.Organisation_Name);
// Filter.
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.UserAccountIdsIncluded.Add(userAccountId);
prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly;
prmUserOrganisation.OrganisationMembersOnly = true;
prmUserOrganisation.OrganisationRoles.Add(organisationRole);
prmUserOrganisation.StatusCat = statusCat;
prmUserOrganisation.SortColumns.Add(colOrganisationName);
// Query.
using (DbResultSet resultSet = ExecuteUserOrganisationQuery(new List<ColumnDfn>() { colOrganisationId, colOrganisationName }, prmUserOrganisation))
{
while (resultSet != null && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
SysId organisationId = new SysId(values.GetLong(colOrganisationId.DataName));
String organisationName = values.GetString(colOrganisationName.DataName);
if (SysId.IsValid(organisationId) && !StringUtil.IsEmpty(organisationName))
{
OrganisationIdName organisationData = new OrganisationIdName()
{
Id = organisationId,
Name = organisationName
};
organisationsData.Add(organisationData);
}
}
}
return organisationsData;
}
//-------------------------------------------------------------------
// Create item.
public abstract SaxUserOrganisation CreateUserOrganisation(SysId userAccountId, SysId OrganisationId);
@@ -15,56 +15,56 @@ namespace Saxonite.Net.Standard.Base.Mgr
partial class SaxActivityMgr
{
//*******************************************************************
// Activity Mgr - Journalist Article
// Activity Mgr - Article
//*******************************************************************
// Utilities.
//-------------------------------------------------------------------
// Create item.
public abstract SaxJournalistArticle CreateJournalistArticle(SysId userAccountIdJournalist);
public abstract SaxArticle CreateArticle(SysId userAccountIdAuthor, SysId organisationId);
//-------------------------------------------------------------------
// Item exists.
public bool JournalistArticleExistsById(SysId id)
public bool ArticleExistsById(SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
SaxJournalistArticle.Params prmJournalistArticle = new SaxJournalistArticle.Params();
prmJournalistArticle.IdsIncluded.Add(id);
prmJournalistArticle.StatusCat = SaxJournalistArticle.StatusCat.Any;
return GetJournalistArticleCount(prmJournalistArticle) == 1;
SaxArticle.Params prmArticle = new SaxArticle.Params();
prmArticle.IdsIncluded.Add(id);
prmArticle.StatusCat = SaxArticle.StatusCat.Any;
return GetArticleCount(prmArticle) == 1;
}
//-------------------------------------------------------------------
// Retrieve individual items.
public abstract SaxJournalistArticle GetJournalistArticle(SaxJournalistArticle.Params prmJournalistArticle);
public SaxJournalistArticle GetJournalistArticleById(SysId id)
public abstract SaxArticle GetArticle(SaxArticle.Params prmArticle);
public SaxArticle GetArticleById(SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
SaxJournalistArticle.Params prmJournalistArticle = new SaxJournalistArticle.Params();
prmJournalistArticle.IdsIncluded.Add(id);
prmJournalistArticle.StatusCat = SaxJournalistArticle.StatusCat.Any;
return GetJournalistArticle(prmJournalistArticle);
SaxArticle.Params prmArticle = new SaxArticle.Params();
prmArticle.IdsIncluded.Add(id);
prmArticle.StatusCat = SaxArticle.StatusCat.Any;
return GetArticle(prmArticle);
}
//-------------------------------------------------------------------
// Validate item data.
public bool IsValidJournalistArticle(SaxJournalistArticle journalistArticle)
public bool IsValidArticle(SaxArticle article)
{
ClearErrorState();
if (journalistArticle == null) return SetErrorState(ErrorMessage.ItemNotSpecified);
return IsValidJournalistArticleData(journalistArticle.GetData(), new SaxJournalistArticle.ErrField());
if (article == null) return SetErrorState(ErrorMessage.ItemNotSpecified);
return IsValidArticleData(article.GetData(), new SaxArticle.ErrField());
}
public virtual bool IsValidJournalistArticleData(SaxJournalistArticle.Data data, SaxJournalistArticle.ErrField errField)
public virtual bool IsValidArticleData(SaxArticle.Data data, SaxArticle.ErrField errField)
{
ClearErrorState();
// User Account - Journalist.
if (errField.UserAccountIdJournalist != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.UserAccountIdJournalist))
// User Account - Author.
if (errField.UserAccountIdAuthor != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.UserAccountIdAuthor))
{
errField.UserAccountIdJournalist = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("User must be specified");
errField.UserAccountIdAuthor = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Author must be specified");
}
// Primary Sport.
if (errField.SportIdPrimary != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.SportIdPrimary))
@@ -80,32 +80,32 @@ namespace Saxonite.Net.Standard.Base.Mgr
}
// Headline.
if (errField.Headline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Headline, "headline", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.JournalistArticle_Headline), true))
if (errField.Headline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Headline, "headline", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Article_Headline), true))
{
errField.Headline = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
// Summary.
if (errField.Summary != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Summary, "summary", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.JournalistArticle_Summary), true))
if (errField.Summary != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Summary, "summary", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Article_Summary), true))
{
errField.Summary = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
// Common properties.
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.JournalistArticle_Notes)))
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Article_Notes)))
{
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.Status != SacsHierarchyItem.ValidValue.Ignore)
{
if (!IsValidValue(data.StatusCode, "status", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.JournalistArticle_Status), true, true))
if (!IsValidValue(data.StatusCode, "status", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Article_Status), true, true))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (!SaxJournalistArticle.ValidStatuses.Contains(data.Status))
if (!SaxArticle.ValidStatuses.Contains(data.Status))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState(ErrorMessage.InvalidStatus);
@@ -117,17 +117,41 @@ namespace Saxonite.Net.Standard.Base.Mgr
if (!data.IsStatusDeleted)
{
// User Account - Journalist.
if (errField.UserAccountIdJournalist != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.UserAccountIdJournalist))
// User Account - Author.
if (errField.UserAccountIdAuthor != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.UserAccountIdAuthor))
{
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
prmUserAccount.IdsIncluded.Add(data.UserAccountIdJournalist);
prmUserAccount.ActiveRoles.Add(App.Sax.UserRole.Journalist);
prmUserAccount.StatusCat = SaxUserAccount.StatusCat.NotDeleted;
if (AccountMgr.GetUserAccountCount(prmUserAccount) < 1)
if (SysId.IsValid(data.OrganisationId))
{
errField.UserAccountIdJournalist = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("User must be active Journalist");
// Validate user.
if (!AccountMgr.UserAccountExistsById(data.UserAccountIdAuthor))
{
errField.UserAccountIdAuthor = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid Author specified");
}
}
else
{
// Organisation not specified - user must be a journalist.
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
prmUserAccount.IdsIncluded.Add(data.UserAccountIdAuthor);
prmUserAccount.ActiveRoles.Add(App.Sax.UserRole.Journalist);
prmUserAccount.StatusCat = SaxUserAccount.StatusCat.NotDeleted;
if (AccountMgr.GetUserAccountCount(prmUserAccount) < 1)
{
errField.UserAccountIdAuthor = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("User must be active Journalist");
}
}
}
// Organisation.
if (errField.OrganisationId != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.OrganisationId))
{
// Validate organisation.
if (!AccountMgr.OrganisationExistsById(data.OrganisationId))
{
errField.OrganisationId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid Organisation specified");
}
}
@@ -163,48 +187,48 @@ namespace Saxonite.Net.Standard.Base.Mgr
}
//-------------------------------------------------------------------
// JournalistArticle database interface.
public abstract bool InsertJournalistArticle(SaxJournalistArticle journalistArticle, DbUpdateInfo dbUpdateInfo);
public abstract bool UpdateJournalistArticle(SaxJournalistArticle journalistArticle, DbUpdateInfo dbUpdateInfo);
public virtual bool JournalistArticleCanBeDeleted(SaxJournalistArticle journalistArticle)
// Article database interface.
public abstract bool InsertArticle(SaxArticle article, DbUpdateInfo dbUpdateInfo);
public abstract bool UpdateArticle(SaxArticle article, DbUpdateInfo dbUpdateInfo);
public virtual bool ArticleCanBeDeleted(SaxArticle article)
{
ClearErrorState();
return true;
}
public abstract bool DeleteJournalistArticle(SaxJournalistArticle journalistArticle, DbUpdateInfo dbUpdateInfo);
public abstract bool DeleteArticle(SaxArticle article, DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
// JournalistArticle list:
public abstract ColumnDfn GetJournalistArticleColumnDfn(SaxJournalistArticle.Column columnId, String caption = "", int width = 0);
public abstract List<String> GetJournalistArticleQueryFilter(SaxJournalistArticle.Params prmJournalistArticle);
public abstract long GetJournalistArticleCount(SaxJournalistArticle.Params prmJournalistArticle);
public abstract List<SaxJournalistArticle> GetJournalistArticleList(SaxJournalistArticle.Params prmJournalistArticle);
public abstract DbResultSet ExecuteJournalistArticleQuery(List<ColumnDfn> columns, SaxJournalistArticle.Params prmJournalistArticle);
// Article list:
public abstract ColumnDfn GetArticleColumnDfn(SaxArticle.Column columnId, String caption = "", int width = 0);
public abstract List<String> GetArticleQueryFilter(SaxArticle.Params prmArticle);
public abstract long GetArticleCount(SaxArticle.Params prmArticle);
public abstract List<SaxArticle> GetArticleList(SaxArticle.Params prmArticle);
public abstract DbResultSet ExecuteArticleQuery(List<ColumnDfn> columns, SaxArticle.Params prmArticle);
//-------------------------------------------------------------------
/// <summary>
/// Extract and format result set data value where specific handling is required.
/// <para>Where response is an invalid data value, format value using column.FormatValue(values).</para>
/// </summary>
public virtual DataValue GetJournalistArticleDataValue(ColumnDfn column, NamedValue.Map values)
public virtual DataValue GetArticleDataValue(ColumnDfn column, NamedValue.Map values)
{
DataValue value = new DataValue();
switch ((SaxJournalistArticle.Column)column.Id)
switch ((SaxArticle.Column)column.Id)
{
//-----------------------------------------------------------
// Journalist display name.
case SaxJournalistArticle.Column.Journalist_DisplayName:
// Author display name.
case SaxArticle.Column.Author_DisplayName:
{
String userTitle = values.GetValue(GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Journalist_Title).DataName).ToString();
String userFirstName = values.GetValue(GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Journalist_FirstName).DataName).ToString();
String userLastName = values.GetValue(GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Journalist_LastName).DataName).ToString();
String userTitle = values.GetValue(GetArticleColumnDfn(SaxArticle.Column.Author_Title).DataName).ToString();
String userFirstName = values.GetValue(GetArticleColumnDfn(SaxArticle.Column.Author_FirstName).DataName).ToString();
String userLastName = values.GetValue(GetArticleColumnDfn(SaxArticle.Column.Author_LastName).DataName).ToString();
value = new DataValue(SaxUserAccount.GetDisplayName(userTitle, userFirstName, userLastName));
}
break;
//-----------------------------------------------------------
// Summary - limit to 200 chars.
case SaxJournalistArticle.Column.Summary:
case SaxArticle.Column.Summary:
{
value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200));
}
@@ -212,7 +236,7 @@ namespace Saxonite.Net.Standard.Base.Mgr
//-----------------------------------------------------------
// Notes - limit to 200 chars.
case SaxJournalistArticle.Column.Notes:
case SaxArticle.Column.Notes:
{
value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200));
}
@@ -220,15 +244,15 @@ namespace Saxonite.Net.Standard.Base.Mgr
//-----------------------------------------------------------
// Status.
case SaxJournalistArticle.Column.Status_Desc:
case SaxJournalistArticle.Column.Status_Ind:
case SaxArticle.Column.Status_Desc:
case SaxArticle.Column.Status_Ind:
{
String statusCode = values.GetValue(column.DataName).ToString();
SaStatus status = SacsSystem.GetStatusForCode(statusCode);
if (column.Id == (int)SaxJournalistArticle.Column.Status_Desc)
if (column.Id == (int)SaxArticle.Column.Status_Desc)
value = new DataValue(SacsSystem.GetStatusDesc(status));
else if (column.Id == (int)SaxJournalistArticle.Column.Status_Ind)
value = new DataValue(SaxJournalistArticle.GetStatusTriState(status));
else if (column.Id == (int)SaxArticle.Column.Status_Ind)
value = new DataValue(SaxArticle.GetStatusTriState(status));
}
break;