aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs
blob: 89a5c0c8a83379c87ed11f54ca552584b2fe1fde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Timeline.Controllers;
using Timeline.Entities;
using Timeline.Models.Http;
using Timeline.Services;

namespace Timeline.Models.Mapper
{
    public static class TimelineMapper
    {
        public static HttpTimeline MapToHttp(this TimelineEntity entity, IUrlHelper urlHelper)
        {
            var timelineName = entity.Name is null ? "@" + entity.Owner.Username : entity.Name;

            return new HttpTimeline(
                uniqueId: entity.UniqueId,
                title: string.IsNullOrEmpty(entity.Title) ? timelineName : entity.Title,
                name: timelineName,
                nameLastModifed: entity.NameLastModified,
                description: entity.Description ?? "",
                owner: entity.Owner.MapToHttp(urlHelper),
                visibility: entity.Visibility,
                members: entity.Members.Select(m => m.User.MapToHttp(urlHelper)).ToList(),
                createTime: entity.CreateTime,
                lastModified: entity.LastModified,
                links: new HttpTimelineLinks(
                    self: urlHelper.ActionLink(nameof(TimelineController.TimelineGet), nameof(TimelineController)[0..^nameof(Controller).Length], new { timeline = timelineName }),
                    posts: urlHelper.ActionLink(nameof(TimelineController.PostListGet), nameof(TimelineController)[0..^nameof(Controller).Length], new { timeline = timelineName })
                )
            );
        }

        public static List<HttpTimeline> MapToHttp(this List<TimelineEntity> entites, IUrlHelper urlHelper)
        {
            return entites.Select(e => e.MapToHttp(urlHelper)).ToList();
        }


        public static HttpTimelinePost MapToHttp(this 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(TimelineController.PostDataGet), nameof(TimelineController)[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))
                };
            }

            return new HttpTimelinePost(
                    id: entity.LocalId,
                    content: content,
                    deleted: content is null,
                    time: entity.Time,
                    author: entity.Author?.MapToHttp(urlHelper),
                    lastUpdated: entity.LastUpdated
                );
        }

        public static List<HttpTimelinePost> MapToHttp(this List<TimelinePostEntity> entities, string timelineName, IUrlHelper urlHelper)
        {
            return entities.Select(e => e.MapToHttp(timelineName, urlHelper)).ToList();
        }
    }
}