From 4ea535d93753826ec900879560d876cec4d58c38 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 10 Feb 2021 02:03:06 +0800 Subject: ... --- BackEnd/Timeline/Models/Http/HttpTimelinePost.cs | 11 ++++--- .../Models/Http/HttpTimelinePostContent.cs | 35 ---------------------- .../Models/Http/HttpTimelinePostCreateRequest.cs | 22 ++++++++++++-- .../Http/HttpTimelinePostCreateRequestContent.cs | 26 ---------------- .../Models/Http/HttpTimelinePostDataDigest.cs | 23 ++++++++++++++ BackEnd/Timeline/Models/Mapper/TimelineMapper.cs | 33 ++++---------------- .../Timeline/Models/TimelinePostContentTypes.cs | 7 ++--- .../Validation/TimelinePostContentTypeValidator.cs | 9 +++--- 8 files changed, 61 insertions(+), 105 deletions(-) delete mode 100644 BackEnd/Timeline/Models/Http/HttpTimelinePostContent.cs delete mode 100644 BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequestContent.cs create mode 100644 BackEnd/Timeline/Models/Http/HttpTimelinePostDataDigest.cs (limited to 'BackEnd/Timeline/Models') diff --git a/BackEnd/Timeline/Models/Http/HttpTimelinePost.cs b/BackEnd/Timeline/Models/Http/HttpTimelinePost.cs index 5981d7a4..165c92da 100644 --- a/BackEnd/Timeline/Models/Http/HttpTimelinePost.cs +++ b/BackEnd/Timeline/Models/Http/HttpTimelinePost.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; namespace Timeline.Models.Http { + /// /// Info of a post. /// @@ -9,10 +11,10 @@ namespace Timeline.Models.Http { public HttpTimelinePost() { } - public HttpTimelinePost(long id, HttpTimelinePostContent? content, bool deleted, DateTime time, HttpUser? author, string? color, DateTime lastUpdated) + public HttpTimelinePost(long id, List dataList, bool deleted, DateTime time, HttpUser? author, string? color, DateTime lastUpdated) { Id = id; - Content = content; + DataList = dataList; Deleted = deleted; Time = time; Author = author; @@ -24,10 +26,7 @@ namespace Timeline.Models.Http /// Post id. /// public long Id { get; set; } - /// - /// Content of the post. May be null if post is deleted. - /// - public HttpTimelinePostContent? Content { get; set; } + public List DataList { get; set; } = default!; /// /// True if post is deleted. /// diff --git a/BackEnd/Timeline/Models/Http/HttpTimelinePostContent.cs b/BackEnd/Timeline/Models/Http/HttpTimelinePostContent.cs deleted file mode 100644 index 55ff1ac2..00000000 --- a/BackEnd/Timeline/Models/Http/HttpTimelinePostContent.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace Timeline.Models.Http -{ - /// - /// Info of post content. - /// - public class HttpTimelinePostContent - { - public HttpTimelinePostContent() { } - - public HttpTimelinePostContent(string type, string? text, string? url, string? eTag) - { - Type = type; - Text = text; - Url = url; - ETag = eTag; - } - - /// - /// Type of the post content. - /// - public string Type { get; set; } = default!; - /// - /// If post is of text type. This is the text. - /// - public string? Text { get; set; } - /// - /// If post is of image type. This is the image url. - /// - public string? Url { get; set; } - /// - /// If post has data (currently it means it's a image post), this is the data etag. - /// - public string? ETag { get; set; } - } -} diff --git a/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequest.cs b/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequest.cs index b25adf36..20d1a25b 100644 --- a/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequest.cs +++ b/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequest.cs @@ -1,16 +1,34 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Timeline.Models.Validation; namespace Timeline.Models.Http { + public class HttpTimelinePostCreateRequestData + { + /// + /// Kind of the data. + /// + [Required] + [TimelinePostDataKind] + public string Kind { get; set; } = default!; + + /// + /// The true data. If kind is text or markdown, this is a string. If kind is image, this is base64 of data. + /// + [Required] + public string Data { get; set; } = default!; + } + public class HttpTimelinePostCreateRequest { /// - /// Content of the new post. + /// Data list of the new content. /// [Required] - public HttpTimelinePostCreateRequestContent Content { get; set; } = default!; + [MinLength(1)] + public List DataList { get; set; } = default!; /// /// Time of the post. If not set, current time will be used. diff --git a/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequestContent.cs b/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequestContent.cs deleted file mode 100644 index 12ab407f..00000000 --- a/BackEnd/Timeline/Models/Http/HttpTimelinePostCreateRequestContent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Timeline.Models.Validation; - -namespace Timeline.Models.Http -{ - /// - /// Content of post create request. - /// - public class HttpTimelinePostCreateRequestContent - { - /// - /// Type of post content. - /// - [Required] - [TimelinePostContentType] - public string Type { get; set; } = default!; - /// - /// If post is of text type, this is the text. - /// - public string? Text { get; set; } - /// - /// If post is of image type, this is base64 of image data. - /// - public string? Data { get; set; } - } -} diff --git a/BackEnd/Timeline/Models/Http/HttpTimelinePostDataDigest.cs b/BackEnd/Timeline/Models/Http/HttpTimelinePostDataDigest.cs new file mode 100644 index 00000000..61d35e15 --- /dev/null +++ b/BackEnd/Timeline/Models/Http/HttpTimelinePostDataDigest.cs @@ -0,0 +1,23 @@ +using System; + +namespace Timeline.Models.Http +{ + public class HttpTimelinePostDataDigest + { + public HttpTimelinePostDataDigest() + { + + } + + public HttpTimelinePostDataDigest(string kind, string eTag, DateTime lastUpdated) + { + Kind = kind; + ETag = eTag; + LastUpdated = lastUpdated; + } + + public string Kind { get; set; } = default!; + public string ETag { get; set; } = default!; + public DateTime LastUpdated { get; set; } + } +} diff --git a/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs b/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs index 88c96d8a..33ee9593 100644 --- a/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs +++ b/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs @@ -1,7 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Threading.Tasks; using Timeline.Controllers; @@ -67,34 +66,12 @@ namespace Timeline.Models.Mapper public async Task MapToHttp(TimelinePostEntity entity, string timelineName, IUrlHelper urlHelper) { - HttpTimelinePostContent? content = null; - - if (entity.Content != null) - { - content = entity.ContentType switch - { - TimelinePostContentTypes.Text => new HttpTimelinePostContent - ( - type: TimelinePostContentTypes.Text, - text: entity.Content, - url: null, - eTag: null - ), - TimelinePostContentTypes.Image => new HttpTimelinePostContent - ( - type: TimelinePostContentTypes.Image, - text: null, - url: urlHelper.ActionLink(nameof(TimelinePostController.DataGet), nameof(TimelinePostController)[0..^nameof(Controller).Length], new { timeline = timelineName, post = entity.LocalId }), - eTag: $"\"{entity.Content}\"" - ), - _ => throw new DatabaseCorruptedException(string.Format(CultureInfo.InvariantCulture, "Unknown timeline post type {0}.", entity.ContentType)) - }; - } - + await _database.Entry(entity).Collection(p => p.DataList).LoadAsync(); await _database.Entry(entity).Reference(e => e.Author).LoadAsync(); - HttpUser? author = null; + List dataDigestList = entity.DataList.OrderBy(d => d.Index).Select(d => new HttpTimelinePostDataDigest(d.Kind, d.DataTag, d.LastUpdated)).ToList(); + HttpUser? author = null; if (entity.Author is not null) { author = await _userMapper.MapToHttp(entity.Author, urlHelper); @@ -102,11 +79,11 @@ namespace Timeline.Models.Mapper return new HttpTimelinePost( id: entity.LocalId, - content: content, - deleted: content is null, + dataList: dataDigestList, time: entity.Time, author: author, color: entity.Color, + deleted: entity.Deleted, lastUpdated: entity.LastUpdated ); } diff --git a/BackEnd/Timeline/Models/TimelinePostContentTypes.cs b/BackEnd/Timeline/Models/TimelinePostContentTypes.cs index ca5e79e1..d432e03c 100644 --- a/BackEnd/Timeline/Models/TimelinePostContentTypes.cs +++ b/BackEnd/Timeline/Models/TimelinePostContentTypes.cs @@ -2,13 +2,12 @@ namespace Timeline.Models { - public static class TimelinePostContentTypes + public static class TimelinePostDataKind { -#pragma warning disable CA1819 // Properties should not return arrays - public static string[] AllTypes { get; } = new string[] { Text, Image }; -#pragma warning restore CA1819 // Properties should not return arrays + public static IReadOnlyList AllTypes { get; } = new List { Text, Image, Markdown }; public const string Text = "text"; public const string Image = "image"; + public const string Markdown = "markdown"; } } diff --git a/BackEnd/Timeline/Models/Validation/TimelinePostContentTypeValidator.cs b/BackEnd/Timeline/Models/Validation/TimelinePostContentTypeValidator.cs index 483cce06..b65c846c 100644 --- a/BackEnd/Timeline/Models/Validation/TimelinePostContentTypeValidator.cs +++ b/BackEnd/Timeline/Models/Validation/TimelinePostContentTypeValidator.cs @@ -1,16 +1,17 @@ using System; +using System.Linq; namespace Timeline.Models.Validation { - public class TimelinePostContentTypeValidator : StringSetValidator + public class TimelinePostDataKindValidator : StringSetValidator { - public TimelinePostContentTypeValidator() : base(TimelinePostContentTypes.AllTypes) { } + public TimelinePostDataKindValidator() : base(TimelinePostDataKind.AllTypes.ToArray()) { } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] - public class TimelinePostContentTypeAttribute : ValidateWithAttribute + public class TimelinePostDataKindAttribute : ValidateWithAttribute { - public TimelinePostContentTypeAttribute() : base(typeof(TimelinePostContentTypeValidator)) + public TimelinePostDataKindAttribute() : base(typeof(TimelinePostDataKindValidator)) { } -- cgit v1.2.3