v1.2.3.2
This commit is contained in:
@@ -173,6 +173,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
SysId userAccountId = UserAccountId;
|
||||
SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId);
|
||||
|
||||
// Period.
|
||||
indexContext.EffectiveTo = DateTime.Today;
|
||||
|
||||
// Regions.
|
||||
if (SysId.IsValid(sessionData.User.RegionIdProvince))
|
||||
indexContext.RegionIds.Add(sessionData.User.RegionIdProvince);
|
||||
|
||||
@@ -67,7 +67,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
{
|
||||
public String RegionIdPrimary { get; set; }
|
||||
public String SportIdPrimary { get; set; }
|
||||
public bool Published { get; set; }
|
||||
public bool? Published { get; set; } = null;
|
||||
public bool? PublishedInFuture { get; set; } = null;
|
||||
public String PublishedOn_YYYYMMDD { get; set; }
|
||||
public String PublishedOn_Calendar { get; set; }
|
||||
public ArticleContentData Content { get; } = new ArticleContentData();
|
||||
@@ -90,7 +91,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
PopulateArticleResponseData(model, article, data as ArticleData_List);
|
||||
data.RegionIdPrimary = model.GetEncryptedRegionId(article.RegionIdPrimary);
|
||||
data.SportIdPrimary = model.GetEncryptedSportId(article.SportIdPrimary);
|
||||
data.Published = DateUtil.IsValid(article.PublishedAt);
|
||||
data.Published = DateUtil.IsValid(article.PublishedAt) ? true : (bool?)null;
|
||||
data.PublishedInFuture = (data.Published == true && article.PublishedAt.CompareTo(DateTime.Today) >= 0) ? true : (bool?)null;
|
||||
data.PublishedOn_YYYYMMDD = DateUtil.Format(article.PublishedAt, "yyyyMMdd");
|
||||
data.PublishedOn_Calendar = model.FormatDateForForm(article.PublishedAt);
|
||||
|
||||
@@ -126,6 +128,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
public List<ArticleData_List> Articles { get; } = new List<ArticleData_List>();
|
||||
/// <summary>Organisations that the user has rights to author articles for.</summary>
|
||||
public List<OrganisationData> Organisations { get; set; }
|
||||
public ItemIdName defaultSport { get; set; }
|
||||
public ItemIdName defaultRegion { get; set; }
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
@@ -144,88 +148,120 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
SysId userAccountId = UserAccountId;
|
||||
RefreshModel(model);
|
||||
|
||||
// Organisations that the user has rights to author articles for.
|
||||
foreach (SaxAccountMgr.OrganisationIdName organisation in AccountMgr.GetOrganisationsForAnyUserRole(userAccountId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }))
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
if (responseData.Organisations == null) responseData.Organisations = new List<OrganisationData>();
|
||||
OrganisationData organisationData = new OrganisationData()
|
||||
// User account.
|
||||
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId);
|
||||
disposableItems.Add(userAccount);
|
||||
|
||||
// Organisations that the user has rights to author articles for.
|
||||
foreach (SaxAccountMgr.OrganisationIdName articleOrganisation in AccountMgr.GetOrganisationsForAnyUserRole(userAccountId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }))
|
||||
{
|
||||
Id = model.EncryptId(organisation.Id),
|
||||
Name = organisation.Name
|
||||
};
|
||||
responseData.Organisations.Add(organisationData);
|
||||
}
|
||||
|
||||
// User must either be a journalist or allowed to author organisation articles.
|
||||
if (!UserIsJournalist && responseData.Organisations == null) return GetAjaxResult_GoHome(responseData);
|
||||
if (UserIsJournalist && responseData.Organisations != null)
|
||||
{
|
||||
OrganisationData organisationData = new OrganisationData()
|
||||
{
|
||||
Id = "",
|
||||
Name = "No Organisation - Journalist Articles"
|
||||
};
|
||||
responseData.Organisations.Insert(0, organisationData);
|
||||
}
|
||||
|
||||
// Filter organisation.
|
||||
SysId organisationIdFilter = model.ExtractSysId(model.Filter.OrganisationId);
|
||||
|
||||
// Item filter.
|
||||
SaxArticle.Params prmArticle = new SaxArticle.Params();
|
||||
prmArticle.UserAccountIdsAuthorIncluded.Add(sessionData.User.UserAccountId);
|
||||
if (SysId.IsValid(organisationIdFilter))
|
||||
prmArticle.OrganisationIdsIncluded.Add(organisationIdFilter);
|
||||
prmArticle.ArticleFilter = model.Filter.Article;
|
||||
prmArticle.StatusCat = SaxArticle.StatusCat.NotDeleted;
|
||||
model.Paging.ItemTotal = (ulong)ActivityMgr.GetArticleCount(prmArticle);
|
||||
model.PopulatePagingTo(prmArticle.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Id);
|
||||
ColumnDfn colOrganisationId = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.OrganisationId);
|
||||
ColumnDfn colHeadline = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Headline);
|
||||
ColumnDfn colSummary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Summary);
|
||||
ColumnDfn colRegionIdPrimary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.RegionIdPrimary);
|
||||
ColumnDfn colSportIdPrimary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.SportIdPrimary);
|
||||
ColumnDfn colPublishedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.PublishedAt_Date);
|
||||
ColumnDfn colStatus = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Status);
|
||||
ColumnDfn colCreatedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.CreateOn_Date);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colOrganisationId, colHeadline, colSummary,
|
||||
colRegionIdPrimary, colSportIdPrimary, colPublishedOn,
|
||||
colStatus, colCreatedOn
|
||||
};
|
||||
|
||||
// Sort columns.
|
||||
colCreatedOn.SortAscending = false;
|
||||
prmArticle.SortColumns.Add(colCreatedOn);
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = ActivityMgr.ExecuteArticleQuery(columns, prmArticle))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
ArticleData_List articleData = new ArticleData_List()
|
||||
if (responseData.Organisations == null) responseData.Organisations = new List<OrganisationData>();
|
||||
OrganisationData organisationData = new OrganisationData()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
OrganisationId = values.GetString(colOrganisationId.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))
|
||||
Id = model.EncryptId(articleOrganisation.Id),
|
||||
Name = articleOrganisation.Name
|
||||
};
|
||||
responseData.Articles.Add(articleData);
|
||||
responseData.Organisations.Add(organisationData);
|
||||
}
|
||||
|
||||
// User must either be a journalist or allowed to author organisation articles.
|
||||
if (!UserIsJournalist && responseData.Organisations == null) return GetAjaxResult_GoHome(responseData);
|
||||
if (UserIsJournalist && responseData.Organisations != null)
|
||||
{
|
||||
OrganisationData organisationData = new OrganisationData()
|
||||
{
|
||||
Id = "",
|
||||
Name = "No Organisation - Journalist Articles"
|
||||
};
|
||||
responseData.Organisations.Insert(0, organisationData);
|
||||
}
|
||||
|
||||
// Filter organisation.
|
||||
SysId organisationIdFilter = model.ExtractSysId(model.Filter.OrganisationId);
|
||||
SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationIdFilter);
|
||||
disposableItems.Add(organisation);
|
||||
|
||||
// Default Sport - defined by organisation if selected.
|
||||
SysId defaultSportId = organisation?.SportIdPrimary ?? null;
|
||||
if (SysId.IsValid(defaultSportId))
|
||||
{
|
||||
responseData.defaultSport = new AjaxResponse_Data.ItemIdName()
|
||||
{
|
||||
Id = model.GetEncryptedSportId(defaultSportId),
|
||||
Name = model.GetSportCaption(defaultSportId)
|
||||
};
|
||||
}
|
||||
|
||||
// Default region - defined by organisation (if selected) otherwise user themselves.
|
||||
SysId defaultRegionId = organisation?.RegionIdPrimary ?? userAccount?.RegionIdCountry ?? null;
|
||||
if (SysId.IsValid(defaultRegionId))
|
||||
{
|
||||
responseData.defaultRegion = new AjaxResponse_Data.ItemIdName()
|
||||
{
|
||||
Id = model.GetEncryptedRegionId(defaultRegionId),
|
||||
Name = model.GetRegionCaption(defaultRegionId)
|
||||
};
|
||||
}
|
||||
|
||||
// Item filter.
|
||||
SaxArticle.Params prmArticle = new SaxArticle.Params();
|
||||
prmArticle.UserAccountIdsAuthorIncluded.Add(sessionData.User.UserAccountId);
|
||||
if (SysId.IsValid(organisationIdFilter))
|
||||
prmArticle.OrganisationIdsIncluded.Add(organisationIdFilter);
|
||||
prmArticle.ArticleFilter = model.Filter.Article;
|
||||
prmArticle.StatusCat = SaxArticle.StatusCat.NotDeleted;
|
||||
model.Paging.ItemTotal = (ulong)ActivityMgr.GetArticleCount(prmArticle);
|
||||
model.PopulatePagingTo(prmArticle.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Id);
|
||||
ColumnDfn colOrganisationId = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.OrganisationId);
|
||||
ColumnDfn colHeadline = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Headline);
|
||||
ColumnDfn colSummary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Summary);
|
||||
ColumnDfn colRegionIdPrimary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.RegionIdPrimary);
|
||||
ColumnDfn colSportIdPrimary = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.SportIdPrimary);
|
||||
ColumnDfn colPublishedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.PublishedAt_Date);
|
||||
ColumnDfn colStatus = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Status);
|
||||
ColumnDfn colCreatedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.CreateOn_Date);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colOrganisationId, colHeadline, colSummary,
|
||||
colRegionIdPrimary, colSportIdPrimary, colPublishedOn,
|
||||
colStatus, colCreatedOn
|
||||
};
|
||||
|
||||
// Sort columns.
|
||||
colCreatedOn.SortAscending = false;
|
||||
prmArticle.SortColumns.Add(colCreatedOn);
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = ActivityMgr.ExecuteArticleQuery(columns, prmArticle))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
ArticleData_List articleData = new ArticleData_List()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
OrganisationId = values.GetString(colOrganisationId.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);
|
||||
}
|
||||
}
|
||||
if (model.Paging.IsPaged)
|
||||
model.Paging.ItemCount = (ushort)responseData.Articles.Count;
|
||||
}
|
||||
if (model.Paging.IsPaged)
|
||||
model.Paging.ItemCount = (ushort)responseData.Articles.Count;
|
||||
|
||||
// Complete response.
|
||||
responseData.SetPaging(model);
|
||||
@@ -260,39 +296,46 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
SysId userAccountId = UserAccountId;
|
||||
RefreshModel(model);
|
||||
|
||||
// Identify item.
|
||||
SysId articleId = model.ExtractSysId(model.ArticleId);
|
||||
if (!SysId.IsValid(articleId))
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
||||
|
||||
// Retrieve item.
|
||||
SaxArticle article = ActivityMgr.GetArticleById(articleId);
|
||||
if (article == null)
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to retrieve Article for Id: '" + model.ArticleId + "'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
if (!article.UserAccountIdAuthor.Equals(userAccountId))
|
||||
{
|
||||
SaLogger.Warn(fn + " Inconsistent Article Author. Expected: " + userAccountId + ". Found: " + article.UserAccountIdAuthor);
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Delete upload images.
|
||||
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
|
||||
prmItemImage.ItemIdsIncluded.Add(new ItemId((short)Sax.DataItemType.Article, articleId));
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
|
||||
prmItemImage.StatusCat = SaxItemImage.StatusCat.NotDeleted;
|
||||
foreach (SaxItemImage itemImage in ItemDataMgr.GetItemImageList(prmItemImage))
|
||||
{
|
||||
itemImage.SessionUid = 0;
|
||||
itemImage.ImageUid = 0;
|
||||
itemImage.Status = SaStatus.Deleted;
|
||||
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
|
||||
}
|
||||
// Identify item.
|
||||
SysId articleId = model.ExtractSysId(model.ArticleId);
|
||||
if (!SysId.IsValid(articleId))
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
||||
|
||||
// Construct response.
|
||||
PopulateArticleResponseData(model, article, responseData.Article);
|
||||
// Retrieve item.
|
||||
SaxArticle article = ActivityMgr.GetArticleById(articleId);
|
||||
disposableItems.Add(article);
|
||||
if (article == null)
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to retrieve Article for Id: '" + model.ArticleId + "'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
if (!article.UserAccountIdAuthor.Equals(userAccountId))
|
||||
{
|
||||
SaLogger.Warn(fn + " Inconsistent Article Author. Expected: " + userAccountId + ". Found: " + article.UserAccountIdAuthor);
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Delete upload images.
|
||||
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
|
||||
prmItemImage.ItemIdsIncluded.Add(new ItemId((short)Sax.DataItemType.Article, articleId));
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
|
||||
prmItemImage.StatusCat = SaxItemImage.StatusCat.NotDeleted;
|
||||
foreach (SaxItemImage itemImage in ItemDataMgr.GetItemImageList(prmItemImage))
|
||||
{
|
||||
disposableItems.Add(itemImage);
|
||||
itemImage.SessionUid = 0;
|
||||
itemImage.ImageUid = 0;
|
||||
itemImage.Status = SaStatus.Deleted;
|
||||
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
|
||||
}
|
||||
|
||||
// Construct response.
|
||||
PopulateArticleResponseData(model, article, responseData.Article);
|
||||
}
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
@@ -311,9 +354,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Article/Ajax/UploadImage")]
|
||||
public IActionResult UploadArticleImage(Model_Article model)
|
||||
public IActionResult Ajax_UploadArticleImage(Model_Article model)
|
||||
{
|
||||
String fn = GetType().Name + ".UploadArticleImage";
|
||||
String fn = GetType().Name + ".Ajax_UploadArticleImage";
|
||||
AjaxResponse_UploadArticleImage responseData = new AjaxResponse_UploadArticleImage(model);
|
||||
String messageTitle = Localiser["article.caption.article"];
|
||||
|
||||
@@ -323,85 +366,91 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
SaxSessionData_Online sessionData = SessionData_Online;
|
||||
RefreshModel(model);
|
||||
|
||||
// Validate number of images.
|
||||
if (model.ArticleImage.IsEmpty())
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
SaLogger.Warn(fn + " No image file supplied for upload");
|
||||
return Json(responseData);
|
||||
}
|
||||
if (model.ArticleImage.Count != 1)
|
||||
{
|
||||
SaLogger.Warn(fn + " Invalid number of image files uploaded: " + model.ArticleImage.Count);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.single"]));
|
||||
}
|
||||
IFormFile file = model.ArticleImage[0];
|
||||
|
||||
// Image properties.
|
||||
byte[] imageData = null;
|
||||
using (MemoryStream fileStream = new MemoryStream())
|
||||
{
|
||||
file.CopyTo(fileStream);
|
||||
imageData = fileStream.ToArray();
|
||||
}
|
||||
|
||||
// Validate the image.
|
||||
ImageUtils.ImageConfig imageConfig = ImageUtils.VerifyImageData(imageData);
|
||||
if (!imageConfig.ValidImage)
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.invalid"]));
|
||||
|
||||
// Image belongs to the article.
|
||||
// If the article doesn't yet exist, it will need to be uploaded to the user first and later transferred.
|
||||
SysId articleId = model.ExtractSysId(model.ArticleId);
|
||||
ItemId articleItemId = new ItemId((short)Sax.DataItemType.Article, articleId);
|
||||
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, sessionData.User.UserAccountId);
|
||||
ItemId imageItemId = SysId.IsValid(articleId) ? articleItemId : userItemId;
|
||||
|
||||
// Store uploaded image as 'Upload' - awaiting confirmation that the article details are to be saved.
|
||||
// NB Reuse any existing deleted article upload image to avoid creating new images unless necessary.
|
||||
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
|
||||
prmItemImage.ItemIdsIncluded.Add(imageItemId);
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.Article);
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
|
||||
prmItemImage.StatusCat = SaxItemImage.StatusCat.DeletedOnly;
|
||||
prmItemImage.ResultsPaging.PageLength = 1;
|
||||
prmItemImage.ResultsPaging.PageNo = 1;
|
||||
List<SaxItemImage> itemImages = ItemDataMgr.GetItemImageList(prmItemImage);
|
||||
SaxItemImage itemImage = !itemImages.IsEmpty() ? itemImages[0] : null;
|
||||
if (itemImage == null)
|
||||
itemImage = ItemDataMgr.CreateItemImage(imageItemId, Sax.ImageType.ArticleUpload);
|
||||
itemImage.ImageType = Sax.ImageType.ArticleUpload;
|
||||
itemImage.Filename = file.FileName;
|
||||
itemImage.Mime = SacsContentTypeHelper.GetMimeTypeFromContentType(file.ContentType).ToString().ToLower();
|
||||
itemImage.ContentType = file.ContentType;
|
||||
itemImage.Width = imageConfig.Width;
|
||||
itemImage.Height = imageConfig.Height;
|
||||
itemImage.ImageData = imageData;
|
||||
itemImage.SessionUid = sessionData.SessionIdx;
|
||||
itemImage.ImageUid = sessionData.NextItemIdx;
|
||||
itemImage.Status = SaxItemImage.DefaultStatus;
|
||||
|
||||
if (!SysId.IsValid(itemImage.Id))
|
||||
{
|
||||
if (!ItemDataMgr.InsertItemImage(itemImage, DbUpdateInfo))
|
||||
// Validate number of images.
|
||||
if (model.ArticleImage.IsEmpty())
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to insert uploaded image - " + ItemDataMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
|
||||
SaLogger.Warn(fn + " No image file supplied for upload");
|
||||
return Json(responseData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo))
|
||||
if (model.ArticleImage.Count != 1)
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to update uploaded image - " + ItemDataMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
|
||||
SaLogger.Warn(fn + " Invalid number of image files uploaded: " + model.ArticleImage.Count);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.single"]));
|
||||
}
|
||||
}
|
||||
IFormFile file = model.ArticleImage[0];
|
||||
|
||||
// Segment image info.
|
||||
responseData.Segment = new ArticleContentSegmentData();
|
||||
responseData.Segment.Image = new ArticleContentSegmentImageData();
|
||||
responseData.Segment.Image.ImageLink = GetArticleImageLink(itemImage.Id);
|
||||
responseData.Segment.Image.ImageIdx = itemImage.ImageUid;
|
||||
// Image properties.
|
||||
byte[] imageData = null;
|
||||
using (MemoryStream fileStream = new MemoryStream())
|
||||
{
|
||||
file.CopyTo(fileStream);
|
||||
imageData = fileStream.ToArray();
|
||||
}
|
||||
|
||||
// Validate the image.
|
||||
ImageUtils.ImageConfig imageConfig = ImageUtils.VerifyImageData(imageData);
|
||||
if (!imageConfig.ValidImage)
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.invalid"]));
|
||||
|
||||
// Image belongs to the article.
|
||||
// If the article doesn't yet exist, it will need to be uploaded to the user first and later transferred.
|
||||
SysId articleId = model.ExtractSysId(model.ArticleId);
|
||||
ItemId articleItemId = new ItemId((short)Sax.DataItemType.Article, articleId);
|
||||
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, sessionData.User.UserAccountId);
|
||||
ItemId imageItemId = SysId.IsValid(articleId) ? articleItemId : userItemId;
|
||||
|
||||
// Store uploaded image as 'Upload' - awaiting confirmation that the article details are to be saved.
|
||||
// NB Reuse any existing deleted article upload image to avoid creating new images unless necessary.
|
||||
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
|
||||
prmItemImage.ItemIdsIncluded.Add(imageItemId);
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.Article);
|
||||
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
|
||||
prmItemImage.StatusCat = SaxItemImage.StatusCat.DeletedOnly;
|
||||
prmItemImage.ResultsPaging.PageLength = 1;
|
||||
prmItemImage.ResultsPaging.PageNo = 1;
|
||||
List<SaxItemImage> itemImages = ItemDataMgr.GetItemImageList(prmItemImage);
|
||||
SaxItemImage itemImage = !itemImages.IsEmpty() ? itemImages[0] : null;
|
||||
if (itemImage == null)
|
||||
itemImage = ItemDataMgr.CreateItemImage(imageItemId, Sax.ImageType.ArticleUpload);
|
||||
disposableItems.Add(itemImage);
|
||||
itemImage.ImageType = Sax.ImageType.ArticleUpload;
|
||||
itemImage.Filename = file.FileName;
|
||||
itemImage.Mime = SacsContentTypeHelper.GetMimeTypeFromContentType(file.ContentType).ToString().ToLower();
|
||||
itemImage.ContentType = file.ContentType;
|
||||
itemImage.Width = imageConfig.Width;
|
||||
itemImage.Height = imageConfig.Height;
|
||||
itemImage.ImageData = imageData;
|
||||
itemImage.SessionUid = sessionData.SessionIdx;
|
||||
itemImage.ImageUid = sessionData.NextItemIdx;
|
||||
itemImage.Status = SaxItemImage.DefaultStatus;
|
||||
|
||||
if (!SysId.IsValid(itemImage.Id))
|
||||
{
|
||||
if (!ItemDataMgr.InsertItemImage(itemImage, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to insert uploaded image - " + ItemDataMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to update uploaded image - " + ItemDataMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
|
||||
}
|
||||
}
|
||||
|
||||
// Segment image info.
|
||||
responseData.Segment = new ArticleContentSegmentData();
|
||||
responseData.Segment.Image = new ArticleContentSegmentImageData();
|
||||
responseData.Segment.Image.ImageLink = GetArticleImageLink(itemImage.Id);
|
||||
responseData.Segment.Image.ImageIdx = itemImage.ImageUid;
|
||||
}
|
||||
|
||||
// Complete response.
|
||||
//responseData.SetNotification(messageTitle, "Image uploaded.");
|
||||
@@ -450,7 +499,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
if (SysId.IsValid(organisationId))
|
||||
{
|
||||
// Organisation specified - User must have Article Admin role.
|
||||
if (!AccountMgr.UserHasAnyOrganisationRole(userAccountId, organisationId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }))
|
||||
if (!AccountMgr.UserHasAnyOrganisationRole(userAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }))
|
||||
{
|
||||
SaLogger.Warn(fn + " User does not have Article Admin role for organisation." + GetLogSuffix());
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
@@ -515,8 +564,13 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
article.Headline = model.ArticleHeadline;
|
||||
if (model.ArticleSummary != null)
|
||||
article.Summary = model.ArticleSummary;
|
||||
if (model.ArticlePublish)
|
||||
article.PublishedAt = model.GetArticlePublishOn();
|
||||
if (!model.ArticlePublished.ToBool())
|
||||
{
|
||||
if (model.ArticlePublish)
|
||||
article.PublishedAt = model.GetArticlePublishOn();
|
||||
else
|
||||
article.PublishedAt = DateTime.MinValue;
|
||||
}
|
||||
if (model.ArticleStatusCode != null)
|
||||
article.Status = model.ArticleStatus;
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ namespace Saxonite.Net.Core.Web.Online.Models
|
||||
// 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()
|
||||
@@ -123,7 +124,8 @@ namespace Saxonite.Net.Core.Web.Online.Models
|
||||
}
|
||||
|
||||
// Article publication.
|
||||
if (ArticlePublish)
|
||||
// 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();
|
||||
|
||||
Reference in New Issue
Block a user