divan/RMuseum/Models/Artifact/RArtifactMasterRecord.cs
2025-02-07 10:59:12 +03:30

250 lines
9.6 KiB
C#

using RMuseum.Models.Artifact.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
namespace RMuseum.Models.Artifact
{
/// <summary>
/// Museum Master Item
/// </summary>
public class RArtifactMasterRecord
{
public RArtifactMasterRecord() { }
public RArtifactMasterRecord(string name, string description)
{
Name = NameInEnglish = name;
Description = DescriptionInEnglish = description;
}
/// <summary>
/// Id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Friendly Url
/// </summary>
public string FriendlyUrl { get; set; }
/// <summary>
/// Publish Status
/// </summary>
public PublishStatus Status { get; set; }
/// <summary>
/// Name
/// </summary>
public string Name { get; set; }
/// <summary>
/// Name In English
/// </summary>
public string NameInEnglish { get; set; }
/// <summary>
/// Description
/// </summary>
public string Description { get; set; }
/// <summary>
/// Description In English
/// </summary>
public string DescriptionInEnglish { get; set; }
/// <summary>
/// Date/Time
/// </summary>
public DateTime DateTime { get; set; }
/// <summary>
/// Last Modified for caching purposes
/// </summary>
public DateTime LastModified { get; set; }
/// <summary>
/// Cover Item Index
/// </summary>
public int CoverItemIndex { get; set; }
/// <summary>
/// Cover Image
/// </summary>
public RPictureFile CoverImage { get; set; }
/// <summary>
/// Cover Image Id
/// </summary>
public Guid CoverImageId { get; set; }
/// <summary>
/// Parts of this item
/// </summary>
public ICollection<RArtifactItemRecord> Items { get; set; }
/// <summary>
/// Item Count (for lists and queries)
/// </summary>
public int ItemCount { get; set; }
/// <summary>
/// Attributes
/// </summary>
public ICollection<RTagValue> Tags { get; set; }
/// <summary>
/// to view model
/// </summary>
/// <param name="src"></param>
/// <returns></returns>
public static RArtifactMasterRecordViewModel ToViewModel(RArtifactMasterRecord src)
{
RArtifactMasterRecordViewModel res = new RArtifactMasterRecordViewModel()
{
Id = src.Id,
FriendlyUrl = src.FriendlyUrl,
Status = src.Status,
Name = src.Name,
NameInEnglish = src.NameInEnglish,
Description = src.Description,
DescriptionInEnglish = src.DescriptionInEnglish,
DateTime = src.DateTime,
LastModified = src.LastModified,
CoverItemIndex = src.CoverItemIndex,
CoverImage = src.CoverImage,
CoverImageId = src.CoverImageId,
ItemCount = src.ItemCount,
Tags = null
};
List<RArtifactItemRecord> items = new List<RArtifactItemRecord>();
List<RTagSum> sums = new List<RTagSum>();
List<RTitleInContents> contents = new List<RTitleInContents>();
int orderOfContents = 0;
if (src.Items != null)
foreach (RArtifactItemRecord item in src.Items)
{
if (item.Tags != null)
{
var OrderedTags = item.Tags.OrderBy(t => t.RTag.Order).ThenBy(t => t.Order);
foreach (RTagValue value in OrderedTags)
{
if (value.RTag != null)
{
switch (value.RTag.TagType)
{
case RTagType.LinkInMaster:
{
if (src.Tags == null)
{
src.Tags = new List<RTagValue>();
}
src.Tags.Add(new RTagValue()
{
RTag = value.RTag,
RTagId = value.RTagId,
FriendlyUrl = $"{src.FriendlyUrl}/{item.FriendlyUrl}",
Order = value.Order,
Status = value.Status,
Value = value.Value,
ValueInEnglish = value.ValueInEnglish,
ValueSupplement = value.ValueSupplement,
});
}
break;
case RTagType.Binary:
{
RTagSum sum = sums.Where(s => s.TagFriendlyUrl == value.RTag.FriendlyUrl).SingleOrDefault();
if (sum != null)
{
sum.ItemCount++;
}
else
{
sums.Add(new RTagSum()
{
TagName = value.RTag.Name,
TagFriendlyUrl = value.RTag.FriendlyUrl,
ItemCount = 1
});
}
}
break;
case RTagType.TitleInContents:
{
if (!int.TryParse(value.ValueSupplement, out int level))
{
level = 1;
}
if (contents.Where(c => c.Title == value.Value).SingleOrDefault() == null)
{
contents.Add
(
new RTitleInContents()
{
Title = value.Value,
Order = ++orderOfContents,
Level = level,
ItemFriendlyUrl = item.FriendlyUrl
}
);
}
}
break;
}
}
}
}
item.Tags = null;
items.Add(item);
}
res.Items = items;
res.RTagSums = sums;
res.Contents = contents;
List<RArtifactTagViewModel> rArtifactTags = new List<RArtifactTagViewModel>();
if (src.Tags != null)
{
foreach (RTagValue tag in src.Tags)
{
RArtifactTagViewModel related = rArtifactTags.Where(t => t.Id == tag.RTagId).SingleOrDefault();
List<RTagValue> values = (related == null) ? new List<RTagValue>() : new List<RTagValue>(related.Values);
if (related == null)
{
related =
new RArtifactTagViewModel()
{
Id = tag.RTag.Id,
Order = tag.RTag.Order,
TagType = tag.RTag.TagType,
FriendlyUrl = tag.RTag.FriendlyUrl,
Status = tag.RTag.Status,
Name = tag.RTag.Name,
NameInEnglish = tag.RTag.NameInEnglish,
GlobalValue = tag.RTag.GlobalValue,
PluralName = tag.RTag.PluralName,
PluralNameInEnglish = tag.RTag.PluralNameInEnglish
};
rArtifactTags.Add(related);
}
values.Add(tag);
values.Sort((a, b) => a.Order - b.Order);
related.Values = values;
}
rArtifactTags.Sort((a, b) => a.Order - b.Order);
}
res.ArtifactTags = rArtifactTags;
return res;
}
}
}