284 lines
11 KiB
C#
284 lines
11 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Sarand.Net.Standard.Base.App;
|
|
using Sarand.Net.Standard.Base.Bus;
|
|
using Sarand.Net.Standard.Base.Core;
|
|
using Sarand.Net.Standard.Base.Dbas;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
using Saxonite.Net.Core.Web.Online.Models;
|
|
using Saxonite.Net.Standard.Base.App;
|
|
using Saxonite.Net.Standard.Base.Bus;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Saxonite.Net.Core.Web.Online.Controllers
|
|
{
|
|
//=======================================================================
|
|
// Online Journalist Controller - Ajax actions.
|
|
//=======================================================================
|
|
partial class JournalistController
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Journalist Article data.
|
|
public class ArticleData_List
|
|
{
|
|
public String Id { get; set; }
|
|
public String Headline { get; set; }
|
|
public String Summary { get; set; }
|
|
public String RegionCaptionPrimary { get; set; }
|
|
public String SportCaptionPrimary { get; set; }
|
|
public String PublishedOnFmt { get; set; }
|
|
public String CreatedOnFmt { get; set; }
|
|
public String StatusCode { get; set; }
|
|
public String StatusDesc { get; set; }
|
|
}
|
|
public class ArticleData_Full : ArticleData_List
|
|
{
|
|
public String RegionIdPrimary { get; set; }
|
|
public String SportIdPrimary { get; set; }
|
|
public String PublishedOn_YYYYMMDD { get; set; }
|
|
}
|
|
private void PopulateArticleResponseData(Model_Journalist model, SaxJournalistArticle article, ArticleData_List data)
|
|
{
|
|
data.Id = SysId.ToString(article.Id);
|
|
data.Headline = article.Headline;
|
|
data.Summary = article.Summary;
|
|
data.RegionCaptionPrimary = model.GetRegionCaption(article.RegionIdPrimary);
|
|
data.SportCaptionPrimary = model.GetSportCaption(article.SportIdPrimary);
|
|
data.CreatedOnFmt = DateUtil.Format(article.CreateStamp.On, "d-MMM-yyyy");
|
|
data.PublishedOnFmt = DateUtil.Format(article.PublishedAt, "d-MMM-yyyy");
|
|
data.StatusCode = article.StatusCode;
|
|
data.StatusDesc = article.StatusDesc;
|
|
}
|
|
private void PopulateArticleResponseData(Model_Journalist model, SaxJournalistArticle article, ArticleData_Full data)
|
|
{
|
|
PopulateArticleResponseData(model, article, data as ArticleData_List);
|
|
data.RegionIdPrimary = SysId.ToString(article.RegionIdPrimary);
|
|
data.SportIdPrimary = SysId.ToString(article.SportIdPrimary);
|
|
data.PublishedOn_YYYYMMDD = DateUtil.Format(article.PublishedAt, "yyyyMMdd");
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Get Article List ajax request.
|
|
//-------------------------------------------------------------------
|
|
public class AjaxResponse_ArticleList : AjaxResponse_Data
|
|
{
|
|
public List<ArticleData_List> Articles { get; } = new List<ArticleData_List>();
|
|
}
|
|
//-------------------------------------------------------------------
|
|
[HttpPost]
|
|
[Route("Journalist/Ajax/GetArticleList")]
|
|
public IActionResult Ajax_GetArticleList(Model_Journalist model)
|
|
{
|
|
String fn = GetType().Name + ".Ajax_GetArticleList";
|
|
String messageTitle = Localiser["journalist.caption.articles"];
|
|
AjaxResponse_ArticleList responseData = new AjaxResponse_ArticleList();
|
|
|
|
// Validate session and referrer.
|
|
if (!ValidReferer)
|
|
return Forbid();
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
if (!UserIsJournalist)
|
|
return GetAjaxResult_GoHome(responseData);
|
|
|
|
// Item filter.
|
|
SaxJournalistArticle.Params prmArticle = new SaxJournalistArticle.Params();
|
|
prmArticle.UserAccountIdsJournalistIncluded.Add(SessionData.User.UserAccountId);
|
|
prmArticle.ArticleFilter = model.Filter.Article;
|
|
prmArticle.StatusCat = SaxJournalistArticle.StatusCat.NotDeleted;
|
|
model.DataItemTotal = (ulong)ActivityMgr.GetJournalistArticleCount(prmArticle);
|
|
model.PopulatePagingTo(prmArticle.ResultsPaging);
|
|
|
|
// Item columns.
|
|
ColumnDfn colId = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Id);
|
|
ColumnDfn colHeadline = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Headline);
|
|
ColumnDfn colSummary = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Summary);
|
|
ColumnDfn colRegionIdPrimary = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.RegionIdPrimary);
|
|
ColumnDfn colSportIdPrimary = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.SportIdPrimary);
|
|
ColumnDfn colPublishedOn = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.PublishedAt_Date);
|
|
ColumnDfn colStatus = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.Status);
|
|
ColumnDfn colCreatedOn = ActivityMgr.GetJournalistArticleColumnDfn(SaxJournalistArticle.Column.CreateOn_Date);
|
|
List<ColumnDfn> columns = new List<ColumnDfn>()
|
|
{
|
|
colId, colHeadline, colSummary,
|
|
colRegionIdPrimary, colSportIdPrimary, colPublishedOn,
|
|
colStatus, colCreatedOn
|
|
};
|
|
|
|
// Sort columns.
|
|
colCreatedOn.SortAscending = false;
|
|
prmArticle.SortColumns.Add(colCreatedOn);
|
|
|
|
// Query items.
|
|
model.DataItemCount = 0;
|
|
using (DbResultSet resultSet = ActivityMgr.ExecuteJournalistArticleQuery(columns, prmArticle))
|
|
{
|
|
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
|
{
|
|
model.DataItemCount++;
|
|
NamedValue.Map values = resultSet.GetRecordValues();
|
|
ArticleData_List articleData = new ArticleData_List()
|
|
{
|
|
Id = values.GetString(colId.DataName),
|
|
Headline = values.GetString(colHeadline.DataName),
|
|
Summary = values.GetString(colSummary.DataName),
|
|
RegionCaptionPrimary = model.GetRegionCaption(values.GetString(colRegionIdPrimary.DataName).ToSysId()),
|
|
SportCaptionPrimary = model.GetSportCaption(values.GetString(colSportIdPrimary.DataName).ToSysId()),
|
|
CreatedOnFmt = DateUtil.Format(values.GetDateTime(colCreatedOn.DataName), "d-MMM-yyyy"),
|
|
PublishedOnFmt = DateUtil.Format(values.GetDateTime(colPublishedOn.DataName), "d-MMM-yyyy"),
|
|
StatusCode = values.GetString(colStatus.DataName),
|
|
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
|
|
};
|
|
responseData.Articles.Add(articleData);
|
|
}
|
|
}
|
|
|
|
// Complete response.
|
|
responseData.SetPaging(model);
|
|
responseData.Success = true;
|
|
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Get Article ajax request.
|
|
//-------------------------------------------------------------------
|
|
public class AjaxResponse_Article : AjaxResponse_Data
|
|
{
|
|
public ArticleData_Full Article { get; } = new ArticleData_Full();
|
|
}
|
|
//-------------------------------------------------------------------
|
|
[HttpPost]
|
|
[Route("Journalist/Ajax/GetArticle")]
|
|
public IActionResult Ajax_GetArticle(Model_Journalist model)
|
|
{
|
|
String fn = GetType().Name + ".Ajax_GetArticle";
|
|
String messageTitle = Localiser["journalist.caption.article"];
|
|
AjaxResponse_Article responseData = new AjaxResponse_Article();
|
|
|
|
// Validate session and referrer.
|
|
if (!ValidReferer)
|
|
return Forbid();
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
if (!UserIsJournalist)
|
|
return GetAjaxResult_GoHome(responseData);
|
|
|
|
// Identify item.
|
|
SysId articleId = model.ArticleId.ToSysId();
|
|
if (!SysId.IsValid(articleId))
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
|
|
|
// Retrieve item.
|
|
SaxJournalistArticle article = ActivityMgr.GetJournalistArticleById(articleId);
|
|
if (article == null)
|
|
{
|
|
SaLogger.Warn(fn + " Failed to retrieve Journalist Article for Id: '" + model.ArticleId + "'");
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
|
}
|
|
|
|
// Construct response.
|
|
PopulateArticleResponseData(model, article, responseData.Article);
|
|
|
|
// Complete response.
|
|
responseData.Success = true;
|
|
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Store Article ajax request.
|
|
//-------------------------------------------------------------------
|
|
[HttpPost]
|
|
[Route("Journalist/Ajax/StoreArticle")]
|
|
public IActionResult Ajax_StoreArticle(Model_Journalist model)
|
|
{
|
|
String fn = GetType().Name + ".Ajax_StoreArticle";
|
|
String messageTitle = Localiser["journalist.caption.article"];
|
|
AjaxResponse_Article responseData = new AjaxResponse_Article();
|
|
|
|
// Validate session and referrer.
|
|
if (!ValidReferer)
|
|
return Forbid();
|
|
if (!ValidUserSession)
|
|
return GetAjaxResult_InvalidSession(responseData);
|
|
if (!UserIsJournalist)
|
|
return GetAjaxResult_GoHome(responseData);
|
|
|
|
// Validate item properties.
|
|
model.ValidateArticleData(responseData);
|
|
if (responseData.HasControlErrors())
|
|
return Json(responseData);
|
|
|
|
// Validate Article against Id against 'Exists' flag.
|
|
SysId articleId = model.ArticleId.ToSysId();
|
|
bool articleExists = StringUtil.ToBool(model.ArticleExists);
|
|
if (articleExists && !SysId.IsValid(articleId))
|
|
{
|
|
SaLogger.Warn(fn + " Id not specified for existing Article.");
|
|
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
|
}
|
|
if (!articleExists && SysId.IsValid(articleId))
|
|
{
|
|
SaLogger.Warn(fn + " Id specified for new Article: '" + model.ArticleId + "'");
|
|
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
|
}
|
|
|
|
// Retrieve existing item.
|
|
SaxJournalistArticle article = ActivityMgr.GetJournalistArticleById(articleId);
|
|
if (article == null && SysId.IsValid(articleId))
|
|
{
|
|
SaLogger.Warn(fn + " Failed to retrieve article for Id: '" + model.ArticleId + "'");
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
|
}
|
|
|
|
// Create new item if required.
|
|
if (article == null)
|
|
article = ActivityMgr.CreateJournalistArticle(SessionData.User.UserAccountId);
|
|
|
|
// Populate item properties.
|
|
if (model.ArticleRegionId != null)
|
|
article.RegionIdPrimary = model.ArticleRegionId.ToSysId();
|
|
if (model.ArticleSportId != null)
|
|
article.SportIdPrimary = model.ArticleSportId.ToSysId();
|
|
if (model.ArticleHeadline != null)
|
|
article.Headline = model.ArticleHeadline;
|
|
if (model.ArticleSummary != null)
|
|
article.Summary = model.ArticleSummary;
|
|
if (model.ArticleStatusCode != null)
|
|
article.Status = model.ArticleStatus;
|
|
|
|
// Store item.
|
|
if (!SysId.IsValid(article.Id))
|
|
{
|
|
if (!ActivityMgr.InsertJournalistArticle(article, DbUpdateInfo))
|
|
{
|
|
SaLogger.Warn(fn + " Failed to insert article: " + ActivityMgr.ErrorStateMessage);
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!ActivityMgr.UpdateJournalistArticle(article, DbUpdateInfo))
|
|
{
|
|
SaLogger.Warn(fn + " Failed to update article [Id:" + SysId.ToString(article.Id) + "]: " + ActivityMgr.ErrorStateMessage);
|
|
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage));
|
|
}
|
|
}
|
|
|
|
// Construct response.
|
|
PopulateArticleResponseData(model, article, responseData.Article);
|
|
|
|
// Complete response.
|
|
responseData.Success = true;
|
|
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|