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 Articles { get; } = new 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 columns = new List() { 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); } //------------------------------------------------------------------- } //======================================================================= }