This commit is contained in:
2021-06-18 19:57:52 +01:00
parent f9c3c01b28
commit 558be9063f
35 changed files with 875 additions and 75 deletions
@@ -8,6 +8,7 @@ using Saxonite.Base.App;
using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Consoles; using Saxonite.Net.Standard.Base.Consoles;
using Saxonite.Net.Standard.Dbas.Mgr;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -20,7 +21,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Data members. // Data members.
private readonly SaxInternals internals; 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 protected class IndexStatsData
{ {
public int EntriesInserted { get; set; } 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 SetBlurb(String blurb) { Blurb = blurb; }
public void SetSport(SysId sportId, String sportName) { SportId = sportId; SportName = sportName; } public void SetSport(SysId sportId, String sportName) { SportId = sportId; SportName = sportName; }
public void SetRegion(SysId regionId, String regionName) { RegionId = regionId; RegionName = regionName; } 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) public static int CompareActivityIndices(ActivityData_Web item1, ActivityData_Web item2)
{ {
int effectiveCompare = item1.EffectiveOn.CompareTo(item2.EffectiveOn); int effectiveCompare = item1.EffectiveOn.CompareTo(item2.EffectiveOn);
@@ -64,6 +71,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
public override IndexResults QueryIndex(IndexContext context) public override IndexResults QueryIndex(IndexContext context)
{ {
String fn = GetType().Name + ".QueryIndex"; String fn = GetType().Name + ".QueryIndex";
ClearErrorState();
IndexResults results = new IndexResults(); IndexResults results = new IndexResults();
if (!context.IsValid()) return results; if (!context.IsValid()) return results;
@@ -72,7 +80,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
ColumnDfn colItemId = internals.ActivityMgr.GetActivityIndexColumnDfn(SaxActivityIndex.Column.ItemId); ColumnDfn colItemId = internals.ActivityMgr.GetActivityIndexColumnDfn(SaxActivityIndex.Column.ItemId);
String colDataNameEffectiveOn = "EffectiveOn"; String colDataNameEffectiveOn = "EffectiveOn";
// Query the index. // Query the Activity Index.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
DbQuery query = new DbQuery(db.DbmsType); DbQuery query = new DbQuery(db.DbmsType);
query.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex, false), alias_ActivityIndex); 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); Sax.DataItemType itemType = (Sax.DataItemType)values.GetLong(colItemType.DataName);
ItemId itemId = new ItemId((short)itemType, new SysId(values.GetLong(colItemId.DataName))); ItemId itemId = new ItemId((short)itemType, new SysId(values.GetLong(colItemId.DataName)));
DateTime effectiveOn = values.GetDate(colDataNameEffectiveOn); 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")); 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); activityDataList.Sort(ActivityData_Web.CompareActivityIndices);
// Populate activity details. // Populate activity details.
PopulateActivityDetails(activityDataList); PopulateActivityDetails(context, activityDataList);
// ToDo Remove activities with blank caption. // ToDo Remove activities with blank caption.
@@ -120,12 +131,64 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Populate Activity Details. // Populate Activity Details.
//------------------------------------------------------------------- //-------------------------------------------------------------------
private void PopulateActivityDetails(List<ActivityData_Web> activities) private void PopulateActivityDetails(IndexContext context, List<ActivityData_Web> activities)
{ {
PopulateJournalistArticleDetails(activities); PopulateUserActivityDetails(context, activities);
PopulateOrganisationOpportunitiesDetails(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. // Extract article Ids.
List<SysId> articleIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.JournalistArticle).Select(ItemId => ItemId.ItemId.Id).ToList(); 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. // Extract opportunity Ids.
List<SysId> opportunityIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.OrganisationOpportunity).Select(ItemId => ItemId.ItemId.Id).ToList(); 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) protected override bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo)
{ {
String fn = GetType().Name + ".StoreActivityIndexData"; String fn = GetType().Name + ".StoreActivityIndexData";
ClearErrorState();
// Validate paramaters.
if (!ItemId.IsValid(indexData.ItemId)) return false; if (!ItemId.IsValid(indexData.ItemId)) return false;
if (!ValidActivityItemTypes.Contains((Sax.DataItemType)indexData.ItemId.Type)) if (!ValidActivityItemTypes.Contains((Sax.DataItemType)indexData.ItemId.Type))
{ {
SaLogger.Warn(fn + " Invalid item type specified for Activity Index: " + ((Sax.DataItemType)indexData.ItemId.Type).ToString()); 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(); IndexStatsData stats = new IndexStatsData();
@@ -287,6 +356,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
protected override bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo) protected override bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo)
{ {
String fn = GetType().Name + ".ClearActivityIndex"; String fn = GetType().Name + ".ClearActivityIndex";
ClearErrorState();
String tableName = SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex); String tableName = SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex);
String filter = String filter =
SaxDbDfn_Core.GetColumnName(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType) + "=" + itemId.Type + SaxDbDfn_Core.GetColumnName(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType) + "=" + itemId.Type +
@@ -297,6 +367,129 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
return true; 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;
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }
//======================================================================= //=======================================================================
@@ -234,12 +234,18 @@
<data name="label.email.address" xml:space="preserve"> <data name="label.email.address" xml:space="preserve">
<value>Email address</value> <value>Email address</value>
</data> </data>
<data name="label.excellent" xml:space="preserve">
<value>Excellent</value>
</data>
<data name="label.first.name" xml:space="preserve"> <data name="label.first.name" xml:space="preserve">
<value>First name</value> <value>First name</value>
</data> </data>
<data name="label.forgotten.password" xml:space="preserve"> <data name="label.forgotten.password" xml:space="preserve">
<value>Forgotten password?</value> <value>Forgotten password?</value>
</data> </data>
<data name="label.good" xml:space="preserve">
<value>Good</value>
</data>
<data name="label.headline" xml:space="preserve"> <data name="label.headline" xml:space="preserve">
<value>Headline</value> <value>Headline</value>
</data> </data>
@@ -357,6 +363,9 @@
<data name="label.update" xml:space="preserve"> <data name="label.update" xml:space="preserve">
<value>update</value> <value>update</value>
</data> </data>
<data name="label.very.good" xml:space="preserve">
<value>Very Good</value>
</data>
<data name="label.yes" xml:space="preserve"> <data name="label.yes" xml:space="preserve">
<value>Yes</value> <value>Yes</value>
</data> </data>
@@ -41,6 +41,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
public String Blurb { get; set; } public String Blurb { get; set; }
public String Sport { get; set; } public String Sport { get; set; }
public String Region { get; set; } public String Region { get; set; }
public int Reaction { get; set; }
public String PublishedOnFmt { get; set; } public String PublishedOnFmt { get; set; }
} }
/// <summary>Article activity info. </summary> /// <summary>Article activity info. </summary>
@@ -124,7 +125,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaxSessionData_Online sessionData = SessionData_Online; SaxSessionData_Online sessionData = SessionData_Online;
// User context. // User context.
SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(); SysId userAccountId = SessionData.User.UserAccountId;
SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId);
// Regions. // Regions.
if (SysId.IsValid(sessionData.User.RegionIdProvince)) if (SysId.IsValid(sessionData.User.RegionIdProvince))
@@ -136,9 +138,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
indexContext.SportIds.AddRange(sessionData.Profile.Sports.Select(item => item.SportId)); indexContext.SportIds.AddRange(sessionData.Profile.Sports.Select(item => item.SportId));
// Populate activities. // Populate activities.
List<ItemId> activityItemIds = new List<ItemId>();
SaxActivityConsole.IndexResults indexResults = ActivityConsole.QueryIndex(indexContext); SaxActivityConsole.IndexResults indexResults = ActivityConsole.QueryIndex(indexContext);
foreach (SaxActivityConsole.IndexResults.ActivityData itemData in indexResults.Items) foreach (SaxActivityConsole.IndexResults.ActivityData itemData in indexResults.Items)
{ {
activityItemIds.Add(itemData.ItemId);
ActivityResponseData activityData = new ActivityResponseData(); ActivityResponseData activityData = new ActivityResponseData();
activityData.ItemType = itemData.ItemId.Type; activityData.ItemType = itemData.ItemId.Type;
if (itemData.ItemId.Type == (int)Sax.DataItemType.JournalistArticle) if (itemData.ItemId.Type == (int)Sax.DataItemType.JournalistArticle)
@@ -151,10 +155,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
activityData.Blurb = itemData.Blurb; activityData.Blurb = itemData.Blurb;
activityData.Sport = Localiser.GetSportName(itemData.SportId, itemData.SportName); activityData.Sport = Localiser.GetSportName(itemData.SportId, itemData.SportName);
activityData.Region = Localiser.GetRegionName(itemData.RegionId, itemData.RegionName); activityData.Region = Localiser.GetRegionName(itemData.RegionId, itemData.RegionName);
activityData.Reaction = (int)itemData.Reaction;
activityData.PublishedOnFmt = Localiser.FormatDate(itemData.EffectiveOn); activityData.PublishedOnFmt = Localiser.FormatDate(itemData.EffectiveOn);
responseData.Activities.Add(activityData); responseData.Activities.Add(activityData);
} }
if (!activityItemIds.IsEmpty())
ActivityConsole.RecordUserActivitiesListed(userAccountId, activityItemIds, DbUpdateInfo);
// Complete response. // Complete response.
responseData.Success = true; responseData.Success = true;
return Json(responseData); return Json(responseData);
@@ -186,7 +194,6 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (!ValidUserSession) if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData); return GetAjaxResult_InvalidSession(responseData);
SaxSessionData_Online sessionData = SessionData_Online; SaxSessionData_Online sessionData = SessionData_Online;
String logSuffix = " User: " + sessionData.User.EmailAddress;
// Identify activity. // Identify activity.
Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType);
@@ -221,11 +228,64 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
responseData.Opportunity = new ActivityResponseData_Opportunity(model, opportunity); responseData.Opportunity = new ActivityResponseData_Opportunity(model, opportunity);
} }
// Record activty viewing.
if (!ActivityConsole.RecordUserActivityViewed(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + getLogSuffix());
return Json(responseData);
}
// Complete response. // Complete response.
responseData.Success = true; responseData.Success = true;
return Json(responseData); return Json(responseData);
} }
//-------------------------------------------------------------------
// Activity Reaction.
//-------------------------------------------------------------------
public class AjaxResponse_ActivityReaction : AjaxResponse_Base
{
public int Reaction { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Activity/Ajax/React")]
[Route("Activity/Ajax/Reaction")]
public IActionResult Ajax_SetActivityReaction(Model_Activity model)
{
String fn = GetType().Name + ".Ajax_SetActivityReaction";
String messageTitle = Localiser["activity.caption.activity"];
AjaxResponse_ActivityReaction responseData = new AjaxResponse_ActivityReaction();
// Validate session and referrer.
if (!ValidReferer)
return Forbid();
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
SaxSessionData_Online sessionData = SessionData_Online;
// Identify activity.
Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType);
SysId itemId = model.ActivityIdx.ToSysId();
if (itemType <= 0 || !SysId.IsValid(itemId))
{
SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + getLogSuffix());
return Json(responseData);
}
// Record activity reaction.
if (!ActivityConsole.RecordUserActivityReaction(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to record Activity Reaction: " + ActivityConsole.ErrorStateMessage + "." + getLogSuffix());
return Json(responseData);
}
// Complete response.
responseData.Reaction = (int)model.GetActivityReaction();
responseData.Success = true;
return Json(responseData);
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }
//======================================================================= //=======================================================================
@@ -4,6 +4,7 @@ using Saxonite.Base.App;
using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Controllers; using Saxonite.Net.Core.Web.Base.Controllers;
using Saxonite.Net.Core.Web.Base.Models; using Saxonite.Net.Core.Web.Base.Models;
using Saxonite.Net.Standard.Base.App;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -33,6 +34,14 @@ namespace Saxonite.Net.Core.Web.Online.Models
// ToDo Replace Type + Idx (Id) with Idx and cross-reference stored in Session data. // ToDo Replace Type + Idx (Id) with Idx and cross-reference stored in Session data.
public String ActivityType { get; set; } public String ActivityType { get; set; }
public String ActivityIdx { get; set; } public String ActivityIdx { get; set; }
public String ActivityReaction{ get; set; }
public Sax.ActivityReaction GetActivityReaction()
{
Sax.ActivityReaction reaction = EnumUtil.ParseEnum(ActivityReaction, Sax.ActivityReaction.Unknown);
if (reaction <= 0 && StringUtil.IsNumeric(ActivityReaction))
reaction = (Sax.ActivityReaction)StringUtil.ToShort(ActivityReaction);
return reaction;
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }
@@ -63,6 +63,14 @@ else
<input type="hidden" name="ActivityIdx" class="ActivityIdx" /> <input type="hidden" name="ActivityIdx" class="ActivityIdx" />
} }
@* Activity React form - to record reaction to the selected activity. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmActivityReact", @class = "", @action = "#", onsubmit = "return false;" }))
{
<input type="hidden" name="ActivityType" class="ActivityType" />
<input type="hidden" name="ActivityIdx" class="ActivityIdx" />
<input type="hidden" name="ActivityReaction" class="ActivityReaction" />
}
@* Activity popup dialog with details. *@ @* Activity popup dialog with details. *@
<div id="dlgActivity" class="sax-dialog"> <div id="dlgActivity" class="sax-dialog">
<div class="sax-content"> <div class="sax-content">
@@ -2,6 +2,29 @@
Home stylesheet. Home stylesheet.
*/ */
.sax-panel-item.Activity .sax-header
{
background-repeat: no-repeat;
background-position: right 4px center;
}
.sax-panel-item.Activity.sax-activity-reaction-1 .sax-header
{
background-image: URL("../img/icon/star-gold-24.png");
}
.sax-panel-item.Activity.sax-activity-reaction-2 .sax-header
{
background-image: URL("../img/icon/star-gold-2-24.png");
}
.sax-panel-item.Activity.sax-activity-reaction-3 .sax-header
{
background-image: URL("../img/icon/star-gold-3-24.png");
}
/* Activity Details */
#dlgActivity.ui-dialog-content.ui-widget-content #dlgActivity.ui-dialog-content.ui-widget-content
{ {
padding: 4px 4px 0 4px; padding: 4px 4px 0 4px;
@@ -46,4 +69,34 @@
{ {
} }
.ui-dialog.sax-dialog-activity button.ActivityReaction
{
min-width: 80px;
color: transparent;
background-color: transparent;
background-position: center center;
background-repeat: no-repeat;
}
.ui-dialog.sax-dialog-activity button.ActivityReaction.sax-selected
{
border-color: #d4af37;
box-shadow: 0 0 2px 2px #d4af37 inset;
}
.ui-dialog.sax-dialog-activity button.ActivityReaction1
{
background-image: url("../img/icon/star-gold-24.png");
}
.ui-dialog.sax-dialog-activity button.ActivityReaction2
{
background-image: url("../img/icon/star-gold-2-24.png");
}
.ui-dialog.sax-dialog-activity button.ActivityReaction3
{
background-image: url("../img/icon/star-gold-3-24.png");
}
/* The End */ /* The End */
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

+52 -13
View File
@@ -23,7 +23,7 @@
} }
sax.doRefreshResults = function (response) sax.doRefreshResults = function (response)
{ {
//sax.debug('doRefreshResults', response); sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse; delete sax.awaitingRefreshResponse;
var $results = $('.sax-panel-results'); var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty();
@@ -44,31 +44,38 @@
} }
sax.populateItem = function ($item, item) sax.populateItem = function ($item, item)
{ {
sax.debug('populateItem', item); //sax.debug('populateItem', item);
if (!item) return; if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.itemIdx).addClass(item.itemTypeClass); $item.prop('id', sax.itemIdPrefix + item.itemIdx).addClass(item.itemTypeClass).toggleClass('sax-activity-reaction-' + item.reaction, !!item.reaction);
$('.ActivityCaption', $item).text(item.caption); $('.ActivityCaption', $item).text(item.caption);
$('.ActivityBlurb', $item).text(item.blurb); $('.ActivityBlurb', $item).text(item.blurb);
$('.ActivitySport', $item).text(item.sport); $('.ActivitySport', $item).text(item.sport);
$('.ActivityRegion', $item).text(item.region); $('.ActivityRegion', $item).text(item.region);
$('.ActivityPublishedOn', $item).text(item.publishedOnFmt); $('.ActivityPublishedOn', $item).text(item.publishedOnFmt);
$item.off('click').on('click', function () { sax.expandActivity(item.itemType, item.itemIdx); }) $item.off('click').on('click', function () { sax.expandActivity(item, $item); })
$('.sax-panel-results .sax-panel-messages').hide().empty(); $('.sax-panel-results .sax-panel-messages').hide().empty();
} }
sax.refreshItem = function ()
{
if (!sax.activity) return;
for (let i = 1; i < 4; i++)
sax.activity.$item.toggleClass('sax-activity-reaction-' + i, sax.activity.item.reaction == i);
}
//-------------------------------------------------------------- //--------------------------------------------------------------
sax.expandActivity = function (type, idx) sax.expandActivity = function (item, $item)
{ {
sax.debug('expandActivity(' + type + ',' + idx + ')'); //sax.debug('expandActivity', item, $item);
let $frm = $('#frmActivityId'); let $frm = $('#frmActivityId');
$('.ActivityType', $frm).val(type); $('.ActivityType', $frm).val(item.itemType);
$('.ActivityIdx', $frm).val(idx); $('.ActivityIdx', $frm).val(item.itemIdx);
sax.activity = { item:item, $item: $item };
sax.ajax.activityInfo = sax.ajax.activityInfo || { url: sax.url.base + 'Activity/Ajax/GetInfo', formId: 'frmActivityId', callbackFn: sax.showActivityDetails, noWaitIcon: true }; sax.ajax.activityInfo = sax.ajax.activityInfo || { url: sax.url.base + 'Activity/Ajax/GetInfo', formId: 'frmActivityId', callbackFn: sax.showActivityDetails, noWaitIcon: true };
sax.doAjaxRequest(sax.ajax.activityInfo, 50); sax.doAjaxRequest(sax.ajax.activityInfo, 50);
} }
sax.showActivityDetails = function (response) sax.showActivityDetails = function (response)
{ {
sax.debug('showActivityDetails', response); //sax.debug('showActivityDetails', response);
let $act = $('#dlgActivity .sax-content').empty(); let $act = $('#dlgActivity .sax-content').empty();
let item; let item;
if (item = response.article) if (item = response.article)
@@ -82,9 +89,7 @@
let seg = segs[segIdx]; let seg = segs[segIdx];
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html); let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html);
$('.ArticleContentSegments', $itm).append($seg); $('.ArticleContentSegments', $itm).append($seg);
sax.debug(seg, $seg);
} }
sax.debug($itm);
$act.append($itm); $act.append($itm);
} }
else if (item = response.opportunity) else if (item = response.opportunity)
@@ -96,15 +101,49 @@
$act.append($itm); $act.append($itm);
} }
else return; else return;
sax.setActivityReactionButton(sax.activity.item.reaction);
sax.openDialog(sax.$dlg.activity, 800, 1600); sax.openDialog(sax.$dlg.activity, 800, 1600);
} }
//--------------------------------------------------------------
let selectedClass = 'sax-selected';
sax.setActivityReactionButton = function (r)
{
sax.clearActivityReactionButton();
$('.sax-dialog-activity button.ActivityReaction' + r).addClass(selectedClass);
}
sax.clearActivityReactionButton = function (r)
{
$('.sax-dialog-activity button.ActivityReaction').removeClass(selectedClass);
}
sax.setActivityReaction = function (r)
{
//sax.debug('setActivityReaction', r);
if ($('.sax-dialog-activity button.ActivityReaction' + r).hasClass(selectedClass)) r = 0;
sax.clearActivityReactionButton();
let fn = function (response)
{
if (!response.success) return;
sax.activity.item.reaction = response.reaction;
sax.setActivityReactionButton(response.reaction);
}
let $frm = $('#frmActivityReact');
$('.ActivityType', $frm).val(sax.activity.item.itemType);
$('.ActivityIdx', $frm).val(sax.activity.item.itemIdx);
$('.ActivityReaction', $frm).val(r);
sax.ajax.activityReact = sax.ajax.activityReact || { url: sax.url.base + 'Activity/Ajax/React', formId: 'frmActivityReact', callbackFn: fn, noWaitIcon: true };
sax.doAjaxRequest(sax.ajax.activityReact, 20);
}
//-------------------------------------------------------------- //--------------------------------------------------------------
$(function () $(function ()
{ {
var opt = sax.dlgOpts(); var opt = sax.dlgOpts();
opt.dialogClass += ' sax-dialog-border-thin sax-dialog-rounding-none sax-dialog-titlebar-hide'; opt.dialogClass += ' sax-dialog-activity sax-dialog-border-thin sax-dialog-rounding-none sax-dialog-titlebar-hide';
opt.buttons[sax.dlg.btn.close] = function () { $(this).dialog('close'); }; opt.buttons['close'] = { text: sax.dlg.btn.close, class: "floatr", click: function () { sax.refreshItem(); delete sax.activity; $(this).dialog('close'); } };
opt.buttons['react1'] = { text: '1', class: "floatl ActivityReaction ActivityReaction1", click: function () { sax.setActivityReaction(1); } };
opt.buttons['react2'] = { text: '2', class: "floatl ActivityReaction ActivityReaction2", click: function () { sax.setActivityReaction(2); } };
opt.buttons['react3'] = { text: '3', class: "floatl ActivityReaction ActivityReaction3", click: function () { sax.setActivityReaction(3); } };
sax.$dlg.activity = $('#dlgActivity').dialog(opt); sax.$dlg.activity = $('#dlgActivity').dialog(opt);
setTimeout(sax.refreshResults, 250); setTimeout(sax.refreshResults, 250);
+3 -3
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
public static class Version public static class Version
{ {
private static String version { get; } = "1.0.8.0"; private static String version { get; } = "1.0.8.1";
// Retrieve version. // Retrieve version.
public static String GetFullVersion () { return version; } public static String GetFullVersion () { return version; }
public static String GetAppVersion () public static String GetAppVersion ()
@@ -41,8 +41,8 @@ namespace Saxonite.Net.Standard.Base.App
// Version history. // Version history.
//------------------------------------------------------------------- //-------------------------------------------------------------------
// 1.0.8 15-Jun-2021 Online Article Content // 1.0.8 15-Jun-2021 Online Article Content
// - Journalist Articles now have styled content. // - Journalist Articles styled content.
// - Online home page click through activity for details. // - Online home page click through activity for details with reaction.
// 1.0.7 8-Jun-2021 Online Activities & Profile // 1.0.7 8-Jun-2021 Online Activities & Profile
// - Style Online Activities by type. // - Style Online Activities by type.
// - Profile Contact Image upload. // - Profile Contact Image upload.
+16 -2
View File
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Base.App namespace Saxonite.Base.App
{ {
@@ -199,7 +199,14 @@ namespace Saxonite.Base.App
UserActivity_UserAccountId, UserActivity_UserAccountId,
UserActivity_ItemType, UserActivity_ItemType,
UserActivity_ItemId, UserActivity_ItemId,
UserActivity_CurrentlyListed,
UserActivity_ListedAtFirst,
UserActivity_ListedAtLast,
UserActivity_ViewedAtFirst,
UserActivity_ViewedAtLast,
UserActivity_Reaction, UserActivity_Reaction,
UserActivity_ReactedAtFirst,
UserActivity_ReactedAtLast,
UserActivity_UserActivityData, UserActivity_UserActivityData,
UserActivity_Notes, UserActivity_Notes,
UserActivity_Flags, UserActivity_Flags,
@@ -262,7 +269,7 @@ namespace Saxonite.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Data members. // Data members.
private static readonly int tableCount = 14; private static readonly int tableCount = 14;
private static readonly int columnCount = 219; private static readonly int columnCount = 226;
private static ulong maxTextLen = 0; private static ulong maxTextLen = 0;
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -609,7 +616,14 @@ namespace Saxonite.Base.App
new ColumnDfn(10,"UserAccountId",4,4,false,10), new ColumnDfn(10,"UserAccountId",4,4,false,10),
new ColumnDfn(10,"ItemType",3,5,false,5), new ColumnDfn(10,"ItemType",3,5,false,5),
new ColumnDfn(10,"ItemId",5,-5,false,19), new ColumnDfn(10,"ItemId",5,-5,false,19),
new ColumnDfn(10,"CurrentlyListed",1,-7,false,1),
new ColumnDfn(10,"ListedAtFirst",9,93,false,16),
new ColumnDfn(10,"ListedAtLast",9,93,false,16),
new ColumnDfn(10,"ViewedAtFirst",9,93,false,16),
new ColumnDfn(10,"ViewedAtLast",9,93,false,16),
new ColumnDfn(10,"Reaction",3,5,false,5), new ColumnDfn(10,"Reaction",3,5,false,5),
new ColumnDfn(10,"ReactedAtFirst",9,93,false,16),
new ColumnDfn(10,"ReactedAtLast",9,93,false,16),
new ColumnDfn(10,"UserActivityData",0,-9,false,0), new ColumnDfn(10,"UserActivityData",0,-9,false,0),
new ColumnDfn(10,"Notes",0,-9,false,2000), new ColumnDfn(10,"Notes",0,-9,false,2000),
new ColumnDfn(10,"Flags",3,5,false,5), new ColumnDfn(10,"Flags",3,5,false,5),
@@ -23,6 +23,12 @@ namespace Saxonite.Net.Standard.Base.Bus
ItemType_Code, ItemType_Code,
ItemType_Desc, ItemType_Desc,
ItemId, ItemId,
// User Activity.
UserActivity_UserAccountId,
UserActivity_ListedAtLast,
UserActivity_ViewedAtLast,
UserActivity_Reaction,
UserActivity_ReactedAtLast,
// Journalist Article. // Journalist Article.
Article_Headline, Article_Headline,
Article_Summary, Article_Summary,
@@ -230,6 +236,8 @@ namespace Saxonite.Net.Standard.Base.Bus
public List<SysId> RegionIdsIncluded { get; } = new List<SysId>(); public List<SysId> RegionIdsIncluded { get; } = new List<SysId>();
public DateTime EffectiveFrom { get; set; } public DateTime EffectiveFrom { get; set; }
public DateTime EffectiveTo { get; set; } public DateTime EffectiveTo { get; set; }
/// <summary>User Account - to include User Activity data in result.</summary>
public SysId UserAccountId { get; set; }
// Table aliases - blank if not linked. // Table aliases - blank if not linked.
public String Alias_ActivityIndex { get; set; } public String Alias_ActivityIndex { get; set; }
} }
@@ -30,6 +30,13 @@ namespace Saxonite.Net.Standard.Base.Bus
ItemType_Code, ItemType_Code,
ItemType_Desc, ItemType_Desc,
ItemId, ItemId,
FirstListedAt,
LastListedAt,
FirstViewedAt,
LastViewedAt,
Reaction,
FirstReactedAt,
LastReactedAt,
// Associated data. // Associated data.
// Common. // Common.
Notes, Notes,
@@ -47,7 +54,14 @@ namespace Saxonite.Net.Standard.Base.Bus
{ {
public SysId UserAccountId { get; set; } public SysId UserAccountId { get; set; }
public ItemId ItemId { get; set; } public ItemId ItemId { get; set; }
public bool CurrentlyListed {get; set; }
public DateTime ListedAtFirst { get; set; }
public DateTime ListedAtLast { get; set; }
public DateTime ViewedAtFirst { get; set; }
public DateTime ViewedAtLast { get; set; }
public Sax.ActivityReaction Reaction { get; set; } public Sax.ActivityReaction Reaction { get; set; }
public DateTime ReactedAtFirst { get; set; }
public DateTime ReactedAtLast { get; set; }
public String UserActivityData { get; set; } public String UserActivityData { get; set; }
} }
@@ -73,11 +87,46 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.ItemId; } get { return data.ItemId; }
set { CheckChanged(data.ItemId, value); data.ItemId = value; } set { CheckChanged(data.ItemId, value); data.ItemId = value; }
} }
public bool CurrentlyListed
{
get { return data.CurrentlyListed; }
set { CheckChanged(data.CurrentlyListed, value); data.CurrentlyListed = value; }
}
public DateTime ListedAtFirst
{
get { return data.ListedAtFirst; }
set { CheckChanged(data.ListedAtFirst, value); data.ListedAtFirst = value; }
}
public DateTime ListedAtLast
{
get { return data.ListedAtLast; }
set { CheckChanged(data.ListedAtLast, value); data.ListedAtLast = value; }
}
public DateTime ViewedAtFirst
{
get { return data.ViewedAtFirst; }
set { CheckChanged(data.ViewedAtFirst, value); data.ViewedAtFirst = value; }
}
public DateTime ViewedAtLast
{
get { return data.ViewedAtLast; }
set { CheckChanged(data.ViewedAtLast, value); data.ViewedAtLast = value; }
}
public Sax.ActivityReaction Reaction public Sax.ActivityReaction Reaction
{ {
get { return data.Reaction; } get { return data.Reaction; }
set { CheckChanged((int)data.Reaction, (int)value); data.Reaction = value; } set { CheckChanged((int)data.Reaction, (int)value); data.Reaction = value; }
} }
public DateTime ReactedAtFirst
{
get { return data.ReactedAtFirst; }
set { CheckChanged(data.ReactedAtFirst, value); data.ReactedAtFirst = value; }
}
public DateTime ReactedAtLast
{
get { return data.ReactedAtLast; }
set { CheckChanged(data.ReactedAtLast, value); data.ReactedAtLast = value; }
}
public String UserActivityData public String UserActivityData
{ {
get { return data.UserActivityData; } get { return data.UserActivityData; }
@@ -88,7 +137,14 @@ namespace Saxonite.Net.Standard.Base.Bus
{ {
UserAccountId = data.UserAccountId; UserAccountId = data.UserAccountId;
ItemId = data.ItemId; ItemId = data.ItemId;
CurrentlyListed = data.CurrentlyListed;
ListedAtFirst = data.ListedAtFirst;
ListedAtLast = data.ListedAtLast;
ViewedAtFirst = data.ViewedAtFirst;
ViewedAtLast = data.ViewedAtLast;
Reaction = data.Reaction; Reaction = data.Reaction;
ReactedAtFirst = data.ReactedAtFirst;
ReactedAtLast = data.ReactedAtLast;
UserActivityData = data.UserActivityData; UserActivityData = data.UserActivityData;
base.PopulateFrom(data); base.PopulateFrom(data);
} }
@@ -107,7 +163,14 @@ namespace Saxonite.Net.Standard.Base.Bus
// Identifies the field that has invalid data. // Identifies the field that has invalid data.
public ValidValue UserAccountId { get; set; } = ValidValue.Valid; public ValidValue UserAccountId { get; set; } = ValidValue.Valid;
public ValidValue ItemId { get; set; } = ValidValue.Valid; public ValidValue ItemId { get; set; } = ValidValue.Valid;
public ValidValue CurrentlyListed { get; set; } = ValidValue.Valid;
public ValidValue ListedAtFirst { get; set; } = ValidValue.Valid;
public ValidValue ListedAtLast { get; set; } = ValidValue.Valid;
public ValidValue ViewedAtFirst { get; set; } = ValidValue.Valid;
public ValidValue ViewedAtLast { get; set; } = ValidValue.Valid;
public ValidValue Reaction { get; set; } = ValidValue.Valid; public ValidValue Reaction { get; set; } = ValidValue.Valid;
public ValidValue ReactedAtFirst { get; set; } = ValidValue.Valid;
public ValidValue ReactedAtLast { get; set; } = ValidValue.Valid;
public ValidValue UserActivityData { get; set; } = ValidValue.Valid; public ValidValue UserActivityData { get; set; } = ValidValue.Valid;
} }
@@ -175,11 +238,46 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.ItemId; } get { return data.ItemId; }
protected set { data.ItemId = value; } protected set { data.ItemId = value; }
} }
public bool CurrentlyListed
{
get { return data.CurrentlyListed; }
set { data.CurrentlyListed = value; }
}
public DateTime ListedAtFirst
{
get { return data.ListedAtFirst; }
set { data.ListedAtFirst = value; }
}
public DateTime ListedAtLast
{
get { return data.ListedAtLast; }
set { data.ListedAtLast = value; }
}
public DateTime ViewedAtFirst
{
get { return data.ViewedAtFirst; }
set { data.ViewedAtFirst = value; }
}
public DateTime ViewedAtLast
{
get { return data.ViewedAtLast; }
set { data.ViewedAtLast = value; }
}
public Sax.ActivityReaction Reaction public Sax.ActivityReaction Reaction
{ {
get { return data.Reaction; } get { return data.Reaction; }
set { data.Reaction = value; } set { data.Reaction = value; }
} }
public DateTime ReactedAtFirst
{
get { return data.ReactedAtFirst; }
set { data.ReactedAtFirst = value; }
}
public DateTime ReactedAtLast
{
get { return data.ReactedAtLast; }
set { data.ReactedAtLast = value; }
}
public String UserActivityData public String UserActivityData
{ {
get { return data.UserActivityData; } get { return data.UserActivityData; }
@@ -15,7 +15,7 @@ namespace Saxonite.Net.Standard.Base.Consoles
// to identifying the activities that are relevant to a User or other context // to identifying the activities that are relevant to a User or other context
// that defines at least one region/sport combination and an effective date (usually today). // that defines at least one region/sport combination and an effective date (usually today).
//======================================================================= //=======================================================================
public abstract class SaxActivityConsole : SacsDisposable public abstract class SaxActivityConsole : SaErrorStateItem
{ {
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Definitions. // Definitions.
@@ -24,6 +24,11 @@ namespace Saxonite.Net.Standard.Base.Consoles
/// </summary> /// </summary>
public class IndexContext public class IndexContext
{ {
public IndexContext (SysId userAccountId)
{
UserAccountId = userAccountId;
}
public SysId UserAccountId { get; }
public List<SysId> SportIds { get; } = new List<SysId>(); public List<SysId> SportIds { get; } = new List<SysId>();
public List<SysId> RegionIds { get; } = new List<SysId>(); public List<SysId> RegionIds { get; } = new List<SysId>();
// Default period is ~3 months up to today. // Default period is ~3 months up to today.
@@ -59,6 +64,11 @@ namespace Saxonite.Net.Standard.Base.Consoles
public String SportName { get; protected set; } public String SportName { get; protected set; }
public SysId RegionId { get; protected set; } public SysId RegionId { get; protected set; }
public String RegionName { get; protected set; } public String RegionName { get; protected set; }
// User Activity.
public DateTime LastListedAt { get; protected set; }
public DateTime LastViewedAt { get; protected set; }
public Sax.ActivityReaction Reaction { get; protected set; }
public DateTime LastReactedAt { get; protected set; }
} }
public List<ActivityData> Items { get; } = new List<ActivityData>(); public List<ActivityData> Items { get; } = new List<ActivityData>();
} }
@@ -105,6 +115,8 @@ namespace Saxonite.Net.Standard.Base.Consoles
/// </summary> /// </summary>
public bool StoreActivityIndex(SaxJournalistArticle article, DbUpdateInfo dbUpdateInfo) public bool StoreActivityIndex(SaxJournalistArticle article, DbUpdateInfo dbUpdateInfo)
{ {
ClearErrorState();
// Only active articles have an activity index. // Only active articles have an activity index.
if (!article.IsStatusActive) ClearActivityIndex(article.GetItemId(), dbUpdateInfo); if (!article.IsStatusActive) ClearActivityIndex(article.GetItemId(), dbUpdateInfo);
@@ -128,6 +140,8 @@ namespace Saxonite.Net.Standard.Base.Consoles
/// </summary> /// </summary>
public bool StoreActivityIndex(SaxOrganisationOpportunity opportunity, DbUpdateInfo dbUpdateInfo) public bool StoreActivityIndex(SaxOrganisationOpportunity opportunity, DbUpdateInfo dbUpdateInfo)
{ {
ClearErrorState();
// Only active opportunities have an activity index. // Only active opportunities have an activity index.
if (!opportunity.IsStatusActive) ClearActivityIndex(opportunity.GetItemId(), dbUpdateInfo); if (!opportunity.IsStatusActive) ClearActivityIndex(opportunity.GetItemId(), dbUpdateInfo);
@@ -209,16 +223,15 @@ namespace Saxonite.Net.Standard.Base.Consoles
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Activity Index data.
protected abstract bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo); protected abstract bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
protected abstract bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo); protected abstract bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo);
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Utilities. // Activity Index Utilities.
//-------------------------------------------------------------------
protected List<IndexEntryData> GetEntriesForIndex(IndexData indexData) protected List<IndexEntryData> GetEntriesForIndex(IndexData indexData)
{ {
ClearErrorState();
List<IndexEntryData> indexEntries = new List<IndexEntryData>(); List<IndexEntryData> indexEntries = new List<IndexEntryData>();
if (ItemId.IsValid(indexData.ItemId) && DateUtil.IsValid(indexData.EffectiveOn)) if (ItemId.IsValid(indexData.ItemId) && DateUtil.IsValid(indexData.EffectiveOn))
{ {
@@ -235,6 +248,13 @@ namespace Saxonite.Net.Standard.Base.Consoles
return indexEntries; return indexEntries;
} }
//-------------------------------------------------------------------
// User Activities
//-------------------------------------------------------------------
public abstract bool RecordUserActivitiesListed(SysId userAccountId, List<ItemId> activityItemIds, DbUpdateInfo dbUpdateInfo);
public abstract bool RecordUserActivityViewed(SysId userAccountId, ItemId activityItemId, DbUpdateInfo dbUpdateInfo);
public abstract bool RecordUserActivityReaction(SysId userAccountId, ItemId activityItemId, Sax.ActivityReaction activityReaction, DbUpdateInfo dbUpdateInfo);
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }
//======================================================================= //=======================================================================
@@ -26,6 +26,15 @@ namespace Saxonite.Net.Standard.Base.Mgr
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Retrieve individual items. // Retrieve individual items.
public abstract SaxUserActivity GetUserActivity(SaxUserActivity.Params prmUserActivity); public abstract SaxUserActivity GetUserActivity(SaxUserActivity.Params prmUserActivity);
public SaxUserActivity GetUserActivityForUserItem(SysId userAccountId, ItemId itemId)
{
if (!SysId.IsValid(userAccountId) || !ItemId.IsValid(itemId)) return null;
SaxUserActivity.Params prmUserActivity = new SaxUserActivity.Params();
prmUserActivity.UserAccountIdsIncluded.Add(userAccountId);
prmUserActivity.ItemIdsIncluded.Add(itemId);
prmUserActivity.StatusCat = SaxUserActivity.StatusCat.Any;
return ActivityMgr.GetUserActivity(prmUserActivity);
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Validate item data. // Validate item data.
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -23,7 +23,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public ColumnDataInt32 _UserAccountId { get; } = new ColumnDataInt32("UserAccountId"); public ColumnDataInt32 _UserAccountId { get; } = new ColumnDataInt32("UserAccountId");
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType"); public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt64 _ItemId { get; } = new ColumnDataInt64("ItemId"); public ColumnDataInt64 _ItemId { get; } = new ColumnDataInt64("ItemId");
public ColumnDataBoolean _CurrentlyListed { get; } = new ColumnDataBoolean("CurrentlyListed");
public ColumnDataDateTime _ListedAtFirst { get; } = new ColumnDataDateTime("ListedAtFirst");
public ColumnDataDateTime _ListedAtLast { get; } = new ColumnDataDateTime("ListedAtLast");
public ColumnDataDateTime _ViewedAtFirst { get; } = new ColumnDataDateTime("ViewedAtFirst");
public ColumnDataDateTime _ViewedAtLast { get; } = new ColumnDataDateTime("ViewedAtLast");
public ColumnDataInt16 _Reaction { get; } = new ColumnDataInt16("Reaction"); public ColumnDataInt16 _Reaction { get; } = new ColumnDataInt16("Reaction");
public ColumnDataDateTime _ReactedAtFirst { get; } = new ColumnDataDateTime("ReactedAtFirst");
public ColumnDataDateTime _ReactedAtLast { get; } = new ColumnDataDateTime("ReactedAtLast");
public ColumnDataString _UserActivityData { get; } = new ColumnDataString("UserActivityData"); public ColumnDataString _UserActivityData { get; } = new ColumnDataString("UserActivityData");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes"); public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags"); public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
@@ -44,7 +51,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
"UserAccountId", "UserAccountId",
"ItemType", "ItemType",
"ItemId", "ItemId",
"CurrentlyListed",
"ListedAtFirst",
"ListedAtLast",
"ViewedAtFirst",
"ViewedAtLast",
"Reaction", "Reaction",
"ReactedAtFirst",
"ReactedAtLast",
"UserActivityData", "UserActivityData",
"Notes", "Notes",
"Flags", "Flags",
@@ -91,7 +105,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public Int32 _UserAccountId { get { return Cols._UserAccountId.Value; } set { Cols._UserAccountId.Value = value; } } public Int32 _UserAccountId { get { return Cols._UserAccountId.Value; } set { Cols._UserAccountId.Value = value; } }
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } } public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int64 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } } public Int64 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public Boolean _CurrentlyListed { get { return Cols._CurrentlyListed.Value; } set { Cols._CurrentlyListed.Value = value; } }
public DateTime _ListedAtFirst { get { return Cols._ListedAtFirst.Value; } set { Cols._ListedAtFirst.Value = value; } }
public DateTime _ListedAtLast { get { return Cols._ListedAtLast.Value; } set { Cols._ListedAtLast.Value = value; } }
public DateTime _ViewedAtFirst { get { return Cols._ViewedAtFirst.Value; } set { Cols._ViewedAtFirst.Value = value; } }
public DateTime _ViewedAtLast { get { return Cols._ViewedAtLast.Value; } set { Cols._ViewedAtLast.Value = value; } }
public Int16 _Reaction { get { return Cols._Reaction.Value; } set { Cols._Reaction.Value = value; } } public Int16 _Reaction { get { return Cols._Reaction.Value; } set { Cols._Reaction.Value = value; } }
public DateTime _ReactedAtFirst { get { return Cols._ReactedAtFirst.Value; } set { Cols._ReactedAtFirst.Value = value; } }
public DateTime _ReactedAtLast { get { return Cols._ReactedAtLast.Value; } set { Cols._ReactedAtLast.Value = value; } }
public String _UserActivityData { get { return Cols._UserActivityData.Value; } set { Cols._UserActivityData.Value = value; } } public String _UserActivityData { get { return Cols._UserActivityData.Value; } set { Cols._UserActivityData.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } } public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } } public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
@@ -127,7 +148,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
_UserAccountId = GetFieldInt32(dbDataReader, "UserAccountId", _UserAccountId); _UserAccountId = GetFieldInt32(dbDataReader, "UserAccountId", _UserAccountId);
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType); _ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt64(dbDataReader, "ItemId", _ItemId); _ItemId = GetFieldInt64(dbDataReader, "ItemId", _ItemId);
_CurrentlyListed = GetFieldBoolean(dbDataReader, "CurrentlyListed", _CurrentlyListed);
_ListedAtFirst = GetFieldDateTime(dbDataReader, "ListedAtFirst", _ListedAtFirst);
_ListedAtLast = GetFieldDateTime(dbDataReader, "ListedAtLast", _ListedAtLast);
_ViewedAtFirst = GetFieldDateTime(dbDataReader, "ViewedAtFirst", _ViewedAtFirst);
_ViewedAtLast = GetFieldDateTime(dbDataReader, "ViewedAtLast", _ViewedAtLast);
_Reaction = GetFieldInt16(dbDataReader, "Reaction", _Reaction); _Reaction = GetFieldInt16(dbDataReader, "Reaction", _Reaction);
_ReactedAtFirst = GetFieldDateTime(dbDataReader, "ReactedAtFirst", _ReactedAtFirst);
_ReactedAtLast = GetFieldDateTime(dbDataReader, "ReactedAtLast", _ReactedAtLast);
_UserActivityData = GetFieldString(dbDataReader, "UserActivityData", _UserActivityData); _UserActivityData = GetFieldString(dbDataReader, "UserActivityData", _UserActivityData);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes); _Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags); _Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
@@ -162,7 +190,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType); if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("CurrentlyListed")) AddCommandParameter(dbCommand, "@CurrentlyListed", _CurrentlyListed);
if (columnNames.ContainsCI("ListedAtFirst")) AddCommandParameter(dbCommand, "@ListedAtFirst", _ListedAtFirst);
if (columnNames.ContainsCI("ListedAtLast")) AddCommandParameter(dbCommand, "@ListedAtLast", _ListedAtLast);
if (columnNames.ContainsCI("ViewedAtFirst")) AddCommandParameter(dbCommand, "@ViewedAtFirst", _ViewedAtFirst);
if (columnNames.ContainsCI("ViewedAtLast")) AddCommandParameter(dbCommand, "@ViewedAtLast", _ViewedAtLast);
if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction); if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction);
if (columnNames.ContainsCI("ReactedAtFirst")) AddCommandParameter(dbCommand, "@ReactedAtFirst", _ReactedAtFirst);
if (columnNames.ContainsCI("ReactedAtLast")) AddCommandParameter(dbCommand, "@ReactedAtLast", _ReactedAtLast);
if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData); if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
@@ -212,7 +247,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType); if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("CurrentlyListed")) AddCommandParameter(dbCommand, "@CurrentlyListed", _CurrentlyListed);
if (columnNames.ContainsCI("ListedAtFirst")) AddCommandParameter(dbCommand, "@ListedAtFirst", _ListedAtFirst);
if (columnNames.ContainsCI("ListedAtLast")) AddCommandParameter(dbCommand, "@ListedAtLast", _ListedAtLast);
if (columnNames.ContainsCI("ViewedAtFirst")) AddCommandParameter(dbCommand, "@ViewedAtFirst", _ViewedAtFirst);
if (columnNames.ContainsCI("ViewedAtLast")) AddCommandParameter(dbCommand, "@ViewedAtLast", _ViewedAtLast);
if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction); if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction);
if (columnNames.ContainsCI("ReactedAtFirst")) AddCommandParameter(dbCommand, "@ReactedAtFirst", _ReactedAtFirst);
if (columnNames.ContainsCI("ReactedAtLast")) AddCommandParameter(dbCommand, "@ReactedAtLast", _ReactedAtLast);
if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData); if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 // Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -238,15 +238,17 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Item column definitions. // Item column definitions.
private static readonly String aliasActivityIndex = "ActIdx"; public static String aliasActivityIndex { get; } = "ActIdx";
private static readonly String aliasActivityIndex_Article = "ActIdx_JrnArt"; public static String aliasActivityIndex_UserActivity { get; } = "ActIdx_UsrAct";
private static readonly String prefixActivityIndex_Article = "ActIdx_JrnArt_"; private static String prefixActivityIndex_UserActivity { get; } = aliasActivityIndex_UserActivity + "_";
private static readonly String aliasActivityIndex_Opportunity = "ActIdx_OrgOpp"; public static String aliasActivityIndex_Article { get; } = "ActIdx_JrnArt";
private static readonly String prefixActivityIndex_Opportunity = "ActIdx_OrgOpp_"; private static String prefixActivityIndex_Article { get; } = aliasActivityIndex_Article + "_";
private static readonly String aliasActivityIndex_Region = "ActIdx_Rgn"; public static String aliasActivityIndex_Opportunity { get; } = "ActIdx_OrgOpp";
private static readonly String prefixActivityIndex_Region = "ActIdx_Rgn_"; private static String prefixActivityIndex_Opportunity { get; } = aliasActivityIndex_Opportunity + "_";
private static readonly String aliasActivityIndex_Sport = "ActIdx_Spt"; public static String aliasActivityIndex_Region { get; } = "ActIdx_Rgn";
private static readonly String prefixActivityIndex_Sport = "ActIdx_Spt_"; private static String prefixActivityIndex_Region { get; } = aliasActivityIndex_Region + "_";
public static String aliasActivityIndex_Sport { get; } = "ActIdx_Spt";
private static String prefixActivityIndex_Sport { get; } = aliasActivityIndex_Sport + "_";
private void SetActivityIndexColDfn private void SetActivityIndexColDfn
(ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol, (ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
@@ -290,6 +292,29 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
columnDfn.ReadOnly = true; columnDfn.ReadOnly = true;
break; break;
//-----------------------------------------------------------
// User Activity.
case SaxActivityIndex.Column.UserActivity_UserAccountId:
SetActivityIndexColDfn(columnDfn, "User #", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity);
columnDfn.ReadOnly = true;
break;
case SaxActivityIndex.Column.UserActivity_ListedAtLast:
SetActivityIndexColDfn(columnDfn, "Last Listed", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity);
columnDfn.ReadOnly = true;
break;
case SaxActivityIndex.Column.UserActivity_ViewedAtLast:
SetActivityIndexColDfn(columnDfn, "Last Viewed", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity);
columnDfn.ReadOnly = true;
break;
case SaxActivityIndex.Column.UserActivity_Reaction:
SetActivityIndexColDfn(columnDfn, "Reaction", 60, SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity);
columnDfn.ReadOnly = true;
break;
case SaxActivityIndex.Column.UserActivity_ReactedAtLast:
SetActivityIndexColDfn(columnDfn, "Last Reacted", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity);
columnDfn.ReadOnly = true;
break;
//----------------------------------------------------------- //-----------------------------------------------------------
// Article. // Article.
case SaxActivityIndex.Column.Article_Headline: case SaxActivityIndex.Column.Article_Headline:
@@ -546,6 +571,26 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
if (columns.HasId(SaxActivityIndex.Column.UpdateOn_Date)) if (columns.HasId(SaxActivityIndex.Column.UpdateOn_Date))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_UpdateOn, aliasActivityIndex)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_UpdateOn, aliasActivityIndex));
//---------------------------------------------------------------------
// User Activity.
if (columns.HasId(SaxActivityIndex.Column.UserActivity_UserAccountId) || columns.HasId(SaxActivityIndex.Column.UserActivity_ListedAtLast) || columns.HasId(SaxActivityIndex.Column.UserActivity_ViewedAtLast) || columns.HasId(SaxActivityIndex.Column.UserActivity_Reaction) || columns.HasId(SaxActivityIndex.Column.UserActivity_ReactedAtLast))
{
DbQueryJoin joinUserActivity = new DbQueryJoin(DbJoinType.LeftOuter);
joinUserActivity.Table = new StringPair(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserActivity), aliasActivityIndex_UserActivity);
joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserActivityData, aliasActivityIndex_UserActivity) + "=" + prm.UserAccountId.ToString());
joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemType, aliasActivityIndex_UserActivity) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType, aliasActivityIndex));
joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemId, aliasActivityIndex_UserActivity) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemId, aliasActivityIndex));
query.Joins.Add(joinUserActivity);
List<SaxDbDfn_Core.ColumnIdx> cols = new List<SaxDbDfn_Core.ColumnIdx>();
cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId);
cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast);
cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast);
cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction);
cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast);
foreach (var col in cols)
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasActivityIndex_UserActivity), prefixActivityIndex_UserActivity + SaxDbDfn_Core.GetColumnName(col, false));
}
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// Article. // Article.
if (columns.HasId(SaxActivityIndex.Column.Article_Headline) || columns.HasId(SaxActivityIndex.Column.Article_Summary)) if (columns.HasId(SaxActivityIndex.Column.Article_Headline) || columns.HasId(SaxActivityIndex.Column.Article_Summary))
@@ -207,7 +207,14 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
dbUserActivity._UserAccountId = SysId.ToInt(userActivity.UserAccountId); dbUserActivity._UserAccountId = SysId.ToInt(userActivity.UserAccountId);
dbUserActivity._ItemType = userActivity.ItemId.Type; dbUserActivity._ItemType = userActivity.ItemId.Type;
dbUserActivity._ItemId = SysId.ToInt(userActivity.ItemId.Id); dbUserActivity._ItemId = SysId.ToInt(userActivity.ItemId.Id);
dbUserActivity._CurrentlyListed = userActivity.CurrentlyListed;
dbUserActivity._ListedAtFirst = userActivity.ListedAtFirst;
dbUserActivity._ListedAtLast = userActivity.ListedAtLast;
dbUserActivity._ViewedAtFirst = userActivity.ViewedAtFirst;
dbUserActivity._ViewedAtLast = userActivity.ViewedAtLast;
dbUserActivity._Reaction = (short)userActivity.Reaction; dbUserActivity._Reaction = (short)userActivity.Reaction;
dbUserActivity._ReactedAtFirst = userActivity.ReactedAtFirst;
dbUserActivity._ReactedAtLast = userActivity.ReactedAtLast;
dbUserActivity._UserActivityData = userActivity.UserActivityData; dbUserActivity._UserActivityData = userActivity.UserActivityData;
dbUserActivity._Notes = userActivity.Notes; dbUserActivity._Notes = userActivity.Notes;
dbUserActivity._Status = SacsSystem.GetStatusCode(userActivity.Status); dbUserActivity._Status = SacsSystem.GetStatusCode(userActivity.Status);
@@ -227,7 +234,14 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//userActivity.Id = new SysId(dbUserActivity._Id); //userActivity.Id = new SysId(dbUserActivity._Id);
//userActivity.UserAccountId = new SysId(dbUserActivity._UserAccountId); //userActivity.UserAccountId = new SysId(dbUserActivity._UserAccountId);
//userActivity.ItemId = new ItemId(dbUserActivity._ItemType, new SysId(dbUserActivity._ItemId); //userActivity.ItemId = new ItemId(dbUserActivity._ItemType, new SysId(dbUserActivity._ItemId);
userActivity.CurrentlyListed = dbUserActivity._CurrentlyListed;
userActivity.ListedAtFirst = dbUserActivity._ListedAtFirst;
userActivity.ListedAtLast = dbUserActivity._ListedAtLast;
userActivity.ViewedAtFirst = dbUserActivity._ViewedAtFirst;
userActivity.ViewedAtLast = dbUserActivity._ViewedAtLast;
userActivity.Reaction = (Sax.ActivityReaction)dbUserActivity._Reaction; userActivity.Reaction = (Sax.ActivityReaction)dbUserActivity._Reaction;
userActivity.ReactedAtFirst = dbUserActivity._ReactedAtFirst;
userActivity.ReactedAtLast = dbUserActivity._ReactedAtLast;
userActivity.UserActivityData = dbUserActivity._UserActivityData; userActivity.UserActivityData = dbUserActivity._UserActivityData;
userActivity.Notes = dbUserActivity._Notes; userActivity.Notes = dbUserActivity._Notes;
userActivity.Status = SacsSystem.GetStatusForCode(dbUserActivity._Status); userActivity.Status = SacsSystem.GetStatusForCode(dbUserActivity._Status);
@@ -321,6 +335,27 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//----------------------------------------------------------- //-----------------------------------------------------------
// Properties. // Properties.
case SaxUserActivity.Column.FirstListedAt:
SetUserActivityColDfn(columnDfn, "First listed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
case SaxUserActivity.Column.LastListedAt:
SetUserActivityColDfn(columnDfn, "Last listed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
case SaxUserActivity.Column.FirstViewedAt:
SetUserActivityColDfn(columnDfn, "First viewed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
case SaxUserActivity.Column.LastViewedAt:
SetUserActivityColDfn(columnDfn, "Last viewed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
case SaxUserActivity.Column.Reaction:
SetUserActivityColDfn(columnDfn, "Reaction", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaxUserActivity.Column.FirstReactedAt:
SetUserActivityColDfn(columnDfn, "First reacted", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
case SaxUserActivity.Column.LastReactedAt:
SetUserActivityColDfn(columnDfn, "Last reacted", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime);
break;
//----------------------------------------------------------- //-----------------------------------------------------------
// Derived properties. // Derived properties.
@@ -504,6 +539,20 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, aliasUserActivity));
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemType, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemType, aliasUserActivity));
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemId, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemId, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.FirstListedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtFirst, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.LastListedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.FirstViewedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtFirst, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.LastViewedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.Reaction))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.FirstReactedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtFirst, aliasUserActivity));
if (columns.HasId(SaxUserActivity.Column.LastReactedAt))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, aliasUserActivity));
// Common properties. // Common properties.
if (columns.HasId(SaxUserActivity.Column.Notes)) if (columns.HasId(SaxUserActivity.Column.Notes))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Notes, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Notes, aliasUserActivity));
@@ -3503,6 +3503,91 @@
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>5</Pos> <Pos>5</Pos>
<Name>CurrentlyListed</Name>
<DataType>Bit</DataType>
<DataTypeName />
<DataTypeNative>-7</DataTypeNative>
<DataTypeNameNative>bit</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>1</Size>
<BufferLen>1</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>6</Pos>
<Name>ListedAtFirst</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>7</Pos>
<Name>ListedAtLast</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>8</Pos>
<Name>ViewedAtFirst</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>9</Pos>
<Name>ViewedAtLast</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>10</Pos>
<Name>Reaction</Name> <Name>Reaction</Name>
<DataType>SmallInt</DataType> <DataType>SmallInt</DataType>
<DataTypeName /> <DataTypeName />
@@ -3512,6 +3597,23 @@
<Size>5</Size> <Size>5</Size>
<BufferLen>2</BufferLen> <BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits> <DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>11</Pos>
<Name>ReactedAtFirst</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable> <Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable> <IsNullable>true</IsNullable>
<Remarks /> <Remarks />
@@ -3519,7 +3621,24 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>6</Pos> <Pos>12</Pos>
<Name>ReactedAtLast</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Pos>13</Pos>
<Name>UserActivityData</Name> <Name>UserActivityData</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -3529,14 +3648,14 @@
<Size>0</Size> <Size>0</Size>
<BufferLen>0</BufferLen> <BufferLen>0</BufferLen>
<DecimalDigits>0</DecimalDigits> <DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable> <Nullable>NoNulls</Nullable>
<IsNullable>true</IsNullable> <IsNullable>false</IsNullable>
<Remarks /> <Remarks />
</DbDfnColumn> </DbDfnColumn>
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>7</Pos> <Pos>14</Pos>
<Name>Notes</Name> <Name>Notes</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -3553,7 +3672,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>8</Pos> <Pos>15</Pos>
<Name>Flags</Name> <Name>Flags</Name>
<DataType>SmallInt</DataType> <DataType>SmallInt</DataType>
<DataTypeName /> <DataTypeName />
@@ -3570,7 +3689,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>9</Pos> <Pos>16</Pos>
<Name>Status</Name> <Name>Status</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -3587,7 +3706,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>10</Pos> <Pos>17</Pos>
<Name>CreateOn</Name> <Name>CreateOn</Name>
<DataType>DateTime</DataType> <DataType>DateTime</DataType>
<DataTypeName /> <DataTypeName />
@@ -3604,7 +3723,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>11</Pos> <Pos>18</Pos>
<Name>CreateBy</Name> <Name>CreateBy</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -3621,7 +3740,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>12</Pos> <Pos>19</Pos>
<Name>CreateHost</Name> <Name>CreateHost</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -3638,7 +3757,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>13</Pos> <Pos>20</Pos>
<Name>UpdateOn</Name> <Name>UpdateOn</Name>
<DataType>DateTime</DataType> <DataType>DateTime</DataType>
<DataTypeName /> <DataTypeName />
@@ -3655,7 +3774,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>14</Pos> <Pos>21</Pos>
<Name>UpdateBy</Name> <Name>UpdateBy</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -3672,7 +3791,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>UserActivity</Table> <Table>UserActivity</Table>
<Pos>15</Pos> <Pos>22</Pos>
<Name>UpdateHost</Name> <Name>UpdateHost</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -3783,6 +3902,31 @@
</DbDfnIndexColumn> </DbDfnIndexColumn>
</Columns> </Columns>
</DbDfnIndex> </DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>UserActivity</Table>
<Name>IDX_UserActivity_User_CurrentlyListed</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>UserAccountId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>CurrentlyListed</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices> </Indices>
</DbDfnTable> </DbDfnTable>
<DbDfnTable> <DbDfnTable>