From 97e6ac51ac4df58cd1229e7974d2b846b192558a Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 7 Jan 2021 20:12:00 +0800 Subject: refactor: Make mapper a service. Fix #202. --- BackEnd/Timeline/Models/Mapper/TimelineMapper.cs | 55 ++++++++++++++++++------ 1 file changed, 43 insertions(+), 12 deletions(-) (limited to 'BackEnd/Timeline/Models/Mapper/TimelineMapper.cs') diff --git a/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs b/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs index 89a5c0c8..14ca8fe9 100644 --- a/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs +++ b/BackEnd/Timeline/Models/Mapper/TimelineMapper.cs @@ -1,5 +1,5 @@ -using AutoMapper; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -11,10 +11,22 @@ using Timeline.Services; namespace Timeline.Models.Mapper { - public static class TimelineMapper + public class TimelineMapper { - public static HttpTimeline MapToHttp(this TimelineEntity entity, IUrlHelper urlHelper) + private readonly DatabaseContext _database; + private readonly UserMapper _userMapper; + + public TimelineMapper(DatabaseContext database, UserMapper userMapper) + { + _database = database; + _userMapper = userMapper; + } + + public async Task MapToHttp(TimelineEntity entity, IUrlHelper urlHelper) { + await _database.Entry(entity).Reference(e => e.Owner).LoadAsync(); + await _database.Entry(entity).Collection(e => e.Members).Query().Include(m => m.User).LoadAsync(); + var timelineName = entity.Name is null ? "@" + entity.Owner.Username : entity.Name; return new HttpTimeline( @@ -23,9 +35,9 @@ namespace Timeline.Models.Mapper name: timelineName, nameLastModifed: entity.NameLastModified, description: entity.Description ?? "", - owner: entity.Owner.MapToHttp(urlHelper), + owner: await _userMapper.MapToHttp(entity.Owner, urlHelper), visibility: entity.Visibility, - members: entity.Members.Select(m => m.User.MapToHttp(urlHelper)).ToList(), + members: await _userMapper.MapToHttp(entity.Members.Select(m => m.User).ToList(), urlHelper), createTime: entity.CreateTime, lastModified: entity.LastModified, links: new HttpTimelineLinks( @@ -35,13 +47,18 @@ namespace Timeline.Models.Mapper ); } - public static List MapToHttp(this List entites, IUrlHelper urlHelper) + public async Task> MapToHttp(List entities, IUrlHelper urlHelper) { - return entites.Select(e => e.MapToHttp(urlHelper)).ToList(); + var result = new List(); + foreach (var entity in entities) + { + result.Add(await MapToHttp(entity, urlHelper)); + } + return result; } - public static HttpTimelinePost MapToHttp(this TimelinePostEntity entity, string timelineName, IUrlHelper urlHelper) + public async Task MapToHttp(TimelinePostEntity entity, string timelineName, IUrlHelper urlHelper) { HttpTimelinePostContent? content = null; @@ -67,19 +84,33 @@ namespace Timeline.Models.Mapper }; } + await _database.Entry(entity).Reference(e => e.Author).LoadAsync(); + + HttpUser? author = null; + + if (entity.Author is not null) + { + author = await _userMapper.MapToHttp(entity.Author, urlHelper); + } + return new HttpTimelinePost( id: entity.LocalId, content: content, deleted: content is null, time: entity.Time, - author: entity.Author?.MapToHttp(urlHelper), + author: author, lastUpdated: entity.LastUpdated ); } - public static List MapToHttp(this List entities, string timelineName, IUrlHelper urlHelper) + public async Task> MapToHttp(List entities, string timelineName, IUrlHelper urlHelper) { - return entities.Select(e => e.MapToHttp(timelineName, urlHelper)).ToList(); + var result = new List(); + foreach (var entity in entities) + { + result.Add(await MapToHttp(entity, timelineName, urlHelper)); + } + return result; } } } -- cgit v1.2.3