using Microsoft.AspNetCore.Http; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using Saxonite.Base.App; using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.Controllers; 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.Models { //======================================================================= public class Model_Article : SaxModel_Online { //------------------------------------------------------------------- // Construction. public Model_Article(SaxLocaliser localiser) : base(localiser) { AdditionalFiles_CSS.Add("css/sax-art.css"); AdditionalFiles_JS.Add("js/sax-art.js"); } //------------------------------------------------------------------- // List configuration. public class FilterData { public String OrganisationId { get; set; } public String OrganisationCaption { get; set; } public String Article { get; set; } } public FilterData Filter { get; } = new FilterData(); /// /// User has rights to author articles for at least one organisation. /// - Output only - not returned with form data. /// - Only populated for initial page construction. /// public bool UserCanAuthorOrganisationArticles { get; set; } /// /// User has rights to author articles as a journalist. /// - Output only - not returned with form data. /// - Only populated for initial page construction. /// public bool UserCanAuthorJournalistArticles { get; set; } //------------------------------------------------------------------- // Article properties. public String ArticleId { get; set; } public String ArticleExists { get; set; } // Organisation. public String ArticleOrganisationId { get; set; } // Sport. public String ArticleSportId { get; set; } public String ArticleSportCaption { get; set; } // Region. public String ArticleRegionId { get; set; } public String ArticleRegionCaption { get; } // Article Content. public String ArticleHeadline { get; set; } public String ArticleSummary { get; set; } public String ArticleStatusCode { get; set; } public SaStatus ArticleStatus { get { return SacsSystem.GetStatusForCode(ArticleStatusCode); } } // Article content. public List ArticleContentSegmentBodies { get; set; } public List ArticleContentSegmentItemImageIds { get; set; } public List ArticleContentSegmentImageIdxs { get; set; } // Article images. public List ArticleImage { get; set; } // Article publication. public String ArticlePublished { get; set; } public bool ArticlePublish { get; set; } public String ArticlePublishOn { get; set; } public DateTime GetArticlePublishOn() { return ParseDateFromForm(ArticlePublishOn); } public String ArticleExpiresAfterDays { get; set; } //------------------------------------------------------------------- // Validation. //------------------------------------------------------------------- // Article. public bool ValidateArticleData(SaxController_Base.AjaxResponse_Data responseData) { // Article headline. if (ArticleHeadline != null) { responseData.SetControlValue(nameof(ArticleHeadline), ArticleHeadline); if (StringUtil.IsEmpty(ArticleHeadline)) responseData.SetControlError(nameof(ArticleHeadline), Localiser["msg.validation.mandatory.value"]); else if (StringUtil.GetLength(ArticleHeadline) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Headline)) responseData.SetControlError(nameof(ArticleHeadline), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Headline)]); } // Article summary. if (ArticleSummary != null) { responseData.SetControlValue(nameof(ArticleSummary), ArticleSummary); if (StringUtil.IsEmpty(ArticleSummary)) responseData.SetControlError(nameof(ArticleSummary), Localiser["msg.validation.mandatory.value"]); else if (StringUtil.GetLength(ArticleSummary) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Summary)) responseData.SetControlError(nameof(ArticleSummary), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Summary)]); } // Article sport. if (ArticleSportId != null) { SysId articleSportId = ExtractSysId(ArticleSportId); if (!SysId.IsValid(articleSportId)) responseData.SetControlError(nameof(ArticleSportId), Localiser["msg.validation.mandatory.value"]); } // Article region. if (ArticleRegionId != null) { SysId articleRegionId = ExtractSysId(ArticleRegionId); if (!SysId.IsValid(articleRegionId)) responseData.SetControlError(nameof(ArticleRegionId), Localiser["msg.validation.mandatory.value"]); } // Article publication. // Only relevant when the article hasn't yet been published and user has selected 'Publish'. if (!ArticlePublished.ToBool() && ArticlePublish) { String controlName = "ArticlePublication"; DateTime publishedOn = GetArticlePublishOn(); if (StringUtil.IsEmpty(ArticlePublishOn)) responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); else if (!DateUtil.IsValid(publishedOn)) responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); else if (publishedOn.CompareTo(DateUtil.IncrementDate(DateTime.Today, Sax.Config.Articles.PublishMaxDaysAhead)) > 0) responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); } // Article status. if (ArticleStatusCode != null) { if (StringUtil.IsEmpty(ArticleStatusCode)) responseData.SetControlError(nameof(ArticleStatusCode), Localiser["msg.validation.mandatory.value"]); else if (!SaxArticle.ValidStatuses.Contains(ArticleStatus)) responseData.SetControlError(nameof(ArticleStatusCode), Localiser["msg.validation.invalid.value"]); } return !responseData.HasControlErrors(); } //------------------------------------------------------------------- } //======================================================================= }