157 lines
6.3 KiB
C#
157 lines
6.3 KiB
C#
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();
|
|
/// <summary>
|
|
/// User has rights to author articles for at least one organisation.
|
|
/// <para>- Output only - not returned with form data.</para>
|
|
/// <para>- Only populated for initial page construction.</para>
|
|
/// </summary>
|
|
public bool UserCanAuthorOrganisationArticles { get; set; }
|
|
/// <summary>
|
|
/// User has rights to author articles as a journalist.
|
|
/// <para>- Output only - not returned with form data.</para>
|
|
/// <para>- Only populated for initial page construction.</para>
|
|
/// </summary>
|
|
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<String> ArticleContentSegmentBodies { get; set; }
|
|
public List<String> ArticleContentSegmentItemImageIds { get; set; }
|
|
public List<String> ArticleContentSegmentImageIdxs { get; set; }
|
|
// Article images.
|
|
public List<IFormFile> 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();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|