v1.0.8.1
This commit is contained in:
@@ -8,6 +8,7 @@ using Saxonite.Base.App;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Base.Consoles;
|
||||
using Saxonite.Net.Standard.Dbas.Mgr;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -20,7 +21,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private readonly SaxInternals internals;
|
||||
private readonly String alias_ActivityIndex = "ActIdx";
|
||||
private readonly String alias_ActivityIndex = SaxActivityMgr_Dbas.aliasActivityIndex;
|
||||
private readonly String alias_ActivityIndex_UserActivity = SaxActivityMgr_Dbas.aliasActivityIndex_UserActivity;
|
||||
protected class IndexStatsData
|
||||
{
|
||||
public int EntriesInserted { get; set; }
|
||||
@@ -54,6 +56,11 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
public void SetBlurb(String blurb) { Blurb = blurb; }
|
||||
public void SetSport(SysId sportId, String sportName) { SportId = sportId; SportName = sportName; }
|
||||
public void SetRegion(SysId regionId, String regionName) { RegionId = regionId; RegionName = regionName; }
|
||||
// User Activity.
|
||||
public void SetLastListedAt(DateTime lastListedAt) { LastListedAt = lastListedAt; }
|
||||
public void SetLastViewedAt(DateTime lastViewedAt) { LastViewedAt = lastViewedAt; }
|
||||
public void SetReaction(Sax.ActivityReaction reaction) { Reaction = reaction; }
|
||||
public void SetLastReactedAt(DateTime lastReactedAt) { LastReactedAt = lastReactedAt; }
|
||||
public static int CompareActivityIndices(ActivityData_Web item1, ActivityData_Web item2)
|
||||
{
|
||||
int effectiveCompare = item1.EffectiveOn.CompareTo(item2.EffectiveOn);
|
||||
@@ -64,6 +71,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
public override IndexResults QueryIndex(IndexContext context)
|
||||
{
|
||||
String fn = GetType().Name + ".QueryIndex";
|
||||
ClearErrorState();
|
||||
IndexResults results = new IndexResults();
|
||||
if (!context.IsValid()) return results;
|
||||
|
||||
@@ -72,7 +80,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
ColumnDfn colItemId = internals.ActivityMgr.GetActivityIndexColumnDfn(SaxActivityIndex.Column.ItemId);
|
||||
String colDataNameEffectiveOn = "EffectiveOn";
|
||||
|
||||
// Query the index.
|
||||
// Query the Activity Index.
|
||||
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
|
||||
DbQuery query = new DbQuery(db.DbmsType);
|
||||
query.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex, false), alias_ActivityIndex);
|
||||
@@ -102,14 +110,17 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
Sax.DataItemType itemType = (Sax.DataItemType)values.GetLong(colItemType.DataName);
|
||||
ItemId itemId = new ItemId((short)itemType, new SysId(values.GetLong(colItemId.DataName)));
|
||||
DateTime effectiveOn = values.GetDate(colDataNameEffectiveOn);
|
||||
activityDataList.Add(new ActivityData_Web(itemId, effectiveOn));
|
||||
ActivityData_Web activtyData = new ActivityData_Web(itemId, effectiveOn);
|
||||
activityDataList.Add(activtyData);
|
||||
SaLogger.Info(fn + " Activity found - " + itemType.ToString() + ":" + SysId.ToString(itemId.Id) + ". Effective: " + DateUtil.Format(effectiveOn, "d-MMM-yyyy"));
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the activity list.
|
||||
activityDataList.Sort(ActivityData_Web.CompareActivityIndices);
|
||||
|
||||
// Populate activity details.
|
||||
PopulateActivityDetails(activityDataList);
|
||||
PopulateActivityDetails(context, activityDataList);
|
||||
|
||||
// ToDo Remove activities with blank caption.
|
||||
|
||||
@@ -120,12 +131,64 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
//-------------------------------------------------------------------
|
||||
// Populate Activity Details.
|
||||
//-------------------------------------------------------------------
|
||||
private void PopulateActivityDetails(List<ActivityData_Web> activities)
|
||||
private void PopulateActivityDetails(IndexContext context, List<ActivityData_Web> activities)
|
||||
{
|
||||
PopulateJournalistArticleDetails(activities);
|
||||
PopulateOrganisationOpportunitiesDetails(activities);
|
||||
PopulateUserActivityDetails(context, activities);
|
||||
PopulateJournalistArticleDetails(context, activities);
|
||||
PopulateOrganisationOpportunitiesDetails(context, activities);
|
||||
}
|
||||
private void PopulateJournalistArticleDetails(List<ActivityData_Web> activities)
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private void PopulateUserActivityDetails(IndexContext context, List<ActivityData_Web> activities)
|
||||
{
|
||||
// Validate parameters.
|
||||
if (!SysId.IsValid(context.UserAccountId)) return;
|
||||
|
||||
// Extract article Ids.
|
||||
List<ItemId> activityItemIds = activities.Select(item => new ItemId(item.ItemId.Type, item.ItemId.Id)).ToList();
|
||||
if (activityItemIds.IsEmpty()) return;
|
||||
|
||||
// User Activity columns - limit to essential information.
|
||||
ColumnDfn colItemType = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.ItemType);
|
||||
ColumnDfn colItemId = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.ItemId);
|
||||
ColumnDfn colUserAccountId = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.UserAccountId);
|
||||
ColumnDfn colLastListedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastListedAt);
|
||||
ColumnDfn colLastViewedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastViewedAt);
|
||||
ColumnDfn colReaction = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.Reaction);
|
||||
ColumnDfn colLastReactedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastReactedAt);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>() { colItemType, colItemId, colUserAccountId, colLastListedAt, colLastViewedAt, colReaction, colLastReactedAt };
|
||||
|
||||
// User Activity filter.
|
||||
SaxUserActivity.Params prmUserActivity = new SaxUserActivity.Params();
|
||||
prmUserActivity.ItemIdsIncluded.AddRange(activityItemIds);
|
||||
prmUserActivity.StatusCat = SaxUserActivity.StatusCat.ActiveOnly;
|
||||
|
||||
using (DbResultSet dbResultSet = Internals.ActivityMgr.ExecuteUserActivityQuery(columns, prmUserActivity))
|
||||
{
|
||||
while (dbResultSet != null && dbResultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = dbResultSet.GetRecordValues();
|
||||
ItemId activityItemId = new ItemId((short)values.GetLong(colItemType.DataName), new SysId(values.GetLong(colItemId.DataName)));
|
||||
DateTime lastListedAt = values.GetDateTime(colLastListedAt.DataName);
|
||||
DateTime lastViewedAt = values.GetDateTime(colLastViewedAt.DataName);
|
||||
Sax.ActivityReaction reaction = (Sax.ActivityReaction)values.GetLong(colReaction.DataName);
|
||||
DateTime lastReactedAt = values.GetDateTime(colLastReactedAt.DataName);
|
||||
|
||||
// Populate to corresponding activities.
|
||||
foreach (ActivityData_Web activity in activities.FindAll(item => item.ItemId.Equals(activityItemId)))
|
||||
{
|
||||
activity.SetLastListedAt(lastListedAt);
|
||||
activity.SetLastViewedAt(lastViewedAt);
|
||||
activity.SetReaction(reaction);
|
||||
activity.SetLastReactedAt(lastReactedAt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Journalist Article details.
|
||||
private void PopulateJournalistArticleDetails(IndexContext context, List<ActivityData_Web> activities)
|
||||
{
|
||||
// Extract article Ids.
|
||||
List<SysId> articleIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.JournalistArticle).Select(ItemId => ItemId.ItemId.Id).ToList();
|
||||
@@ -170,7 +233,10 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
}
|
||||
}
|
||||
}
|
||||
private void PopulateOrganisationOpportunitiesDetails(List<ActivityData_Web> activities)
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Organisation Opportunity details.
|
||||
private void PopulateOrganisationOpportunitiesDetails(IndexContext context, List<ActivityData_Web> activities)
|
||||
{
|
||||
// Extract opportunity Ids.
|
||||
List<SysId> opportunityIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.OrganisationOpportunity).Select(ItemId => ItemId.ItemId.Id).ToList();
|
||||
@@ -222,11 +288,14 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
protected override bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
String fn = GetType().Name + ".StoreActivityIndexData";
|
||||
ClearErrorState();
|
||||
|
||||
// Validate paramaters.
|
||||
if (!ItemId.IsValid(indexData.ItemId)) return false;
|
||||
if (!ValidActivityItemTypes.Contains((Sax.DataItemType)indexData.ItemId.Type))
|
||||
{
|
||||
SaLogger.Warn(fn + " Invalid item type specified for Activity Index: " + ((Sax.DataItemType)indexData.ItemId.Type).ToString());
|
||||
return false;
|
||||
return SetErrorState("Invalid item type specified for Activity Index");
|
||||
}
|
||||
IndexStatsData stats = new IndexStatsData();
|
||||
|
||||
@@ -287,6 +356,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
protected override bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
String fn = GetType().Name + ".ClearActivityIndex";
|
||||
ClearErrorState();
|
||||
String tableName = SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex);
|
||||
String filter =
|
||||
SaxDbDfn_Core.GetColumnName(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType) + "=" + itemId.Type +
|
||||
@@ -297,6 +367,129 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// User Activities
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Record listing of activties by user - those populated to the application page.
|
||||
/// <para>- Activities not previously listed are added to the user's list.</para>
|
||||
/// <para>- Activities previously listed are updated in the user's list.</para>
|
||||
/// <para>- User Activties no longer listed are flagged as 'Not currently listed'.</para>
|
||||
/// </summary>
|
||||
public override bool RecordUserActivitiesListed(SysId userAccountId, List<ItemId> activityItemIds, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
String fn = GetType().Name + ".RecordUserActivitiesListed";
|
||||
if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified");
|
||||
if (activityItemIds.IsEmpty()) return SetErrorState("Activity item ids must be specified");
|
||||
String sqlNow = "'" + DateUtil.FormatSqlDateTime(DateTime.Now) + "'";
|
||||
String sqlStatus = "'" + SacsSystem.GetStatusCode(SaxUserActivity.DefaultStatus) + "'";
|
||||
|
||||
// Merge query - insert missing user activities and update existing.
|
||||
List<String> query = new List<String>()
|
||||
{
|
||||
"Merge",
|
||||
"\tInto " + SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserActivity) + " As UsrAct",
|
||||
// Virtual table defining Activity Item Ids currently listed.
|
||||
"\tUsing",
|
||||
"\t(",
|
||||
"\t\tSelect ItemType, ItemId From (Select 0 ItemType, 0 ItemId" + activityItemIds.Select(item => " Union Select " + item.Type.ToString() + ", " + item.Id.ToString()).ToList().Concat("", " ") + ") Dat Where Dat.ItemType>0 And Dat.ItemId>0",
|
||||
"\t) As Act",
|
||||
"\tOn UsrAct.UserAccountId="+userAccountId.ToString() + " And UsrAct.ItemType=Act.ItemType And UsrAct.ItemId=Act.ItemId",
|
||||
// Matched - Update the User Activity to indicate 'Currently listed' and update the last listed date/time.
|
||||
"\tWhen Matched Then",
|
||||
"\t\tUpdate Set CurrentlyListed=1, ListedAtLast=" + sqlNow + ", Status=" + sqlStatus + ", UpdateOn=" + sqlNow + ", UpdateBy=" + dbUpdateInfo.UserId.ToString() + ", UpdateHost='" + dbUpdateInfo.Host + "'",
|
||||
// Not Matched By Target - Insert the User Activity and indicate 'Currently listed' with first and last listed date/times.
|
||||
"\tWhen Not Matched Then",
|
||||
"\t\tInsert",
|
||||
"\t\t\t(UserAccountId, ItemType, ItemId, CurrentlyListed, ListedAtFirst, ListedAtLast, Reaction, UserActivityData, Notes, Flags, Status, CreateOn, CreateBy, CreateHost, UpdateOn, UpdateBy, UpdateHost)",
|
||||
"\t\t\tValues ("+userAccountId.ToString()+", Act.ItemType, Act.ItemId, 1, " + sqlNow + ", " + sqlNow + ", 0, '', '', 0, " + sqlStatus + ", " + sqlNow + ", " + dbUpdateInfo.UserId.ToString() + ", '" + dbUpdateInfo.Host + "', " + sqlNow + ", " + dbUpdateInfo.UserId.ToString() + ", '" + dbUpdateInfo.Host + "')",
|
||||
// Not Matched By Source - Update the User Activity to indicate 'Not currently listed'.
|
||||
"\tWhen Not Matched By Source And UsrAct.UserAccountId=" + userAccountId.ToString() + " And CurrentlyListed=1 Then",
|
||||
"\t\tUpdate Set CurrentlyListed=0, UpdateOn=" + sqlNow + ", UpdateBy=" + dbUpdateInfo.UserId.ToString() + ", UpdateHost='" + dbUpdateInfo.Host + "'",
|
||||
";"
|
||||
};
|
||||
String sql = query.Concat("\n");
|
||||
//SaLogger.Debug(fn + " Query:\n" + sql);
|
||||
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
|
||||
int rows = db.ExecuteNonQuery(sql);
|
||||
if (db.HasErrorState())
|
||||
SaLogger.Debug(fn + " Database error: " + db.ErrorStateMessage);
|
||||
SaLogger.Debug(fn + " Rows modified: " + rows);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
public override bool RecordUserActivityViewed(SysId userAccountId, ItemId activityItemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
String fn = GetType().Name + ".RecordUserActivityViewed";
|
||||
if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified");
|
||||
if (!ItemId.IsValid(activityItemId)) return SetErrorState("Activity item id must be specified");
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
SaxUserActivity userActivity = internals.ActivityMgr.GetUserActivityForUserItem(userAccountId, activityItemId);
|
||||
if (userActivity != null)
|
||||
{
|
||||
// Update activity.
|
||||
userActivity.CurrentlyListed = true;
|
||||
if (!DateUtil.IsValid(userActivity.ViewedAtFirst))
|
||||
userActivity.ViewedAtFirst = now;
|
||||
userActivity.ViewedAtLast = now;
|
||||
userActivity.Status = SaxUserActivity.DefaultStatus;
|
||||
if (!internals.ActivityMgr.UpdateUserActivity(userActivity, dbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to update User Activity for viewing: " + internals.ActivityMgr.ErrorStateMessage);
|
||||
return SetErrorState(internals.ActivityMgr.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SaLogger.Warn(fn + " User Activity not found. UserAccountId: " + userAccountId.ToString() + ". Item Type: " + (Sax.DataItemType)activityItemId.Type + ". ItemId: " + activityItemId.Id.ToString() + ".");
|
||||
return SetErrorState("User Activity not found");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
public override bool RecordUserActivityReaction(SysId userAccountId, ItemId activityItemId, Sax.ActivityReaction activityReaction, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
String fn = GetType().Name + ".RecordUserActivityReaction";
|
||||
if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified");
|
||||
if (!ItemId.IsValid(activityItemId)) return SetErrorState("Activity item id must be specified");
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
SaxUserActivity userActivity = internals.ActivityMgr.GetUserActivityForUserItem(userAccountId, activityItemId);
|
||||
if (userActivity != null)
|
||||
{
|
||||
if (userActivity.Reaction != activityReaction)
|
||||
{
|
||||
// Update activity.
|
||||
userActivity.CurrentlyListed = true;
|
||||
if (!DateUtil.IsValid(userActivity.ViewedAtFirst))
|
||||
userActivity.ViewedAtFirst = now;
|
||||
userActivity.ViewedAtLast = now;
|
||||
userActivity.Reaction = activityReaction;
|
||||
if (!DateUtil.IsValid(userActivity.ReactedAtFirst))
|
||||
userActivity.ReactedAtFirst = now;
|
||||
userActivity.ReactedAtLast = now;
|
||||
userActivity.Status = SaxUserActivity.DefaultStatus;
|
||||
if (!internals.ActivityMgr.UpdateUserActivity(userActivity, dbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to update User Activity with reaction: " + internals.ActivityMgr.ErrorStateMessage);
|
||||
return SetErrorState(internals.ActivityMgr.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SaLogger.Warn(fn + " User Activity not found. UserAccountId: " + userAccountId.ToString() + ". Item Type: " + (Sax.DataItemType)activityItemId.Type + ". ItemId: " + activityItemId.Id.ToString() + ".");
|
||||
return SetErrorState("User Activity not found");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
|
||||
Reference in New Issue
Block a user