v1.3.0 Restructure Saxonite workspace and upgrade to .NET 10 (#1)
Move Saxonite’s projects into a dedicated `Workspace` folder and align the solution with .NET 10 and the current Common workspace. Update encryption integration, test project structure and coverage, and repository guidance and upgrade notes. - Relocate application and library projects while retaining Git rename history. - Split tests into Admin, Online, and Shared projects; add representative behavioral and serialization tests. - Update Common integration, application version, and repository documentation. Application version: 1.3.0 Reviewed-on: #1 Co-authored-by: andy <andy@sarand.com>
This commit was merged in pull request #1.
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
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.Net.Standard.Base.App;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Saxonite.Net.Standard.Base.Bus
|
||||
{
|
||||
//=======================================================================
|
||||
// Article - Content data.
|
||||
//=======================================================================
|
||||
partial class SaxArticle
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Definitions.
|
||||
private static readonly String ElementName_Content = "content";
|
||||
private static readonly String ElementName_Segments = "segments";
|
||||
private static readonly String ElementName_Segment = "segment";
|
||||
private static readonly String ElementName_Body = "body";
|
||||
private static readonly String ElementName_Html = "html";
|
||||
private static readonly String ElementName_Image = "image";
|
||||
private static readonly String ElementName_ImageId = "imageId";
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>Article content.</summary>
|
||||
public class ContentData
|
||||
{
|
||||
/// <summary>
|
||||
/// Article Content Segment - either body content or image.
|
||||
/// </summary>
|
||||
public class SegmentData
|
||||
{
|
||||
// Segment body.
|
||||
public class BodyData
|
||||
{
|
||||
public bool IsValid()
|
||||
{
|
||||
if (!StringUtil.IsEmpty(Html)) return true;
|
||||
return false;
|
||||
}
|
||||
public String Html { get; set; } = String.Empty;
|
||||
}
|
||||
public BodyData Body { get; } = new BodyData();
|
||||
// Segment image.
|
||||
public class ImageData
|
||||
{
|
||||
public bool IsValid()
|
||||
{
|
||||
if (SysId.IsValid(ItemImageId)) return true;
|
||||
return false;
|
||||
}
|
||||
public SysId ItemImageId { get; set; }
|
||||
}
|
||||
public ImageData Image { get; } = new ImageData();
|
||||
// Validate.
|
||||
public bool IsValid()
|
||||
{
|
||||
if (Body.IsValid()) return true;
|
||||
if (Image.IsValid()) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public List<SegmentData> Segments { get; } = new List<SegmentData>();
|
||||
// Add segment.
|
||||
public SegmentData AddSegment()
|
||||
{
|
||||
SegmentData segment = new SegmentData();
|
||||
Segments.Add(segment);
|
||||
return segment;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Convert serialised data from database to Content.
|
||||
/// </summary>
|
||||
public static ContentData ExtractContent(String contentData)
|
||||
{
|
||||
ContentData content = new ContentData();
|
||||
if (StringUtil.IsEmpty(contentData)) return content;
|
||||
|
||||
try
|
||||
{
|
||||
// Load XML data.
|
||||
XDocument doc = XDocument.Parse(contentData);
|
||||
XElement rootElement = doc.Root;
|
||||
foreach (XElement rootChildElement in rootElement.GetChildElements())
|
||||
{
|
||||
String rootChildElementName = rootChildElement.GetLocalName();
|
||||
if (rootChildElementName.EqualsCI(ElementName_Segments))
|
||||
{
|
||||
// Content segments.
|
||||
XElement segmentsElement = rootChildElement;
|
||||
foreach (XElement segmentsChildElement in segmentsElement.GetChildElements())
|
||||
{
|
||||
String segmentsChildElementName = segmentsChildElement.GetLocalName();
|
||||
if (segmentsChildElementName.EqualsCI(ElementName_Segment))
|
||||
{
|
||||
// Content segment.
|
||||
ContentData.SegmentData segment = new ContentData.SegmentData();
|
||||
XElement segmentElement = segmentsChildElement;
|
||||
foreach (XElement segmentChildElement in segmentElement.GetChildElements())
|
||||
{
|
||||
String segmentChildElementName = segmentChildElement.GetLocalName();
|
||||
if (segmentChildElementName.EqualsCI(ElementName_Body))
|
||||
{
|
||||
// Content segment body.
|
||||
XElement bodyElement = segmentChildElement;
|
||||
foreach (XElement bodyChildElement in bodyElement.GetChildElements())
|
||||
{
|
||||
String bodyChildElementName = bodyChildElement.GetLocalName();
|
||||
if (bodyChildElementName.EqualsCI(ElementName_Html))
|
||||
{
|
||||
// Content segment body HTML.
|
||||
XElement htmlElement = bodyChildElement;
|
||||
segment.Body.Html = htmlElement.Value;
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segment' child element: " + segmentChildElementName);
|
||||
}
|
||||
}
|
||||
else if (segmentChildElementName.EqualsCI(ElementName_Image))
|
||||
{
|
||||
// Content segment image.
|
||||
XElement imageElement = segmentChildElement;
|
||||
foreach (XElement imageChildElement in imageElement.GetChildElements())
|
||||
{
|
||||
String imageChildElementName = imageChildElement.GetLocalName();
|
||||
if (imageChildElementName.EqualsCI(ElementName_ImageId))
|
||||
{
|
||||
// Content segment image Id.
|
||||
XElement imageIdElement = imageChildElement;
|
||||
segment.Image.ItemImageId = SysId.ToSysId(imageIdElement.Value);
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segment' child element: " + segmentChildElementName);
|
||||
}
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segment' child element: " + segmentChildElementName);
|
||||
}
|
||||
// Add this segment to the list.
|
||||
if (segment.IsValid())
|
||||
content.Segments.Add(segment);
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Segments' child element: " + segmentsChildElementName);
|
||||
}
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unexpected 'Root' child element: " + rootChildElementName);
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} " + ExceptionUtil.GetLogMessage(exc));
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Convert Content to serialised data to store on database.
|
||||
/// </summary>
|
||||
public static String GetContentData(ContentData content)
|
||||
{
|
||||
try
|
||||
{
|
||||
XDocument doc = new XDocument();
|
||||
XElement contentElement = doc.AppendElement(ElementName_Content);
|
||||
XElement segmentsElement = contentElement.AppendElement(ElementName_Segments);
|
||||
foreach (ContentData.SegmentData segment in content.Segments)
|
||||
{
|
||||
if (!segment.IsValid()) continue;
|
||||
XElement segmentElement = segmentsElement.AppendElement(ElementName_Segment);
|
||||
if (segment.Body.IsValid())
|
||||
{
|
||||
// Segment Body.
|
||||
XElement bodyElement = segmentElement.AppendElement(ElementName_Body);
|
||||
if (!StringUtil.IsEmpty(segment.Body.Html))
|
||||
bodyElement.AppendElement(ElementName_Html, segment.Body.Html);
|
||||
}
|
||||
else if (segment.Image.IsValid())
|
||||
{
|
||||
// Segment Image.
|
||||
XElement imageElement = segmentElement.AppendElement(ElementName_Image);
|
||||
if (SysId.IsValid(segment.Image.ItemImageId))
|
||||
imageElement.AppendElement(ElementName_ImageId, SysId.ToString(segment.Image.ItemImageId));
|
||||
}
|
||||
}
|
||||
return doc.GetXml();
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} " + ExceptionUtil.GetLogMessage(exc));
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
Reference in New Issue
Block a user