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. --- .../Mapper/MapperServiceCollectionExtensions.cs | 13 +++++ BackEnd/Timeline/Models/Mapper/TimelineMapper.cs | 55 +++++++++++++++++----- BackEnd/Timeline/Models/Mapper/UserMapper.cs | 31 +++++++----- BackEnd/Timeline/Models/Timeline.cs | 5 +- 4 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 BackEnd/Timeline/Models/Mapper/MapperServiceCollectionExtensions.cs (limited to 'BackEnd/Timeline/Models') diff --git a/BackEnd/Timeline/Models/Mapper/MapperServiceCollectionExtensions.cs b/BackEnd/Timeline/Models/Mapper/MapperServiceCollectionExtensions.cs new file mode 100644 index 00000000..c87586d2 --- /dev/null +++ b/BackEnd/Timeline/Models/Mapper/MapperServiceCollectionExtensions.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Timeline.Models.Mapper +{ + public static class MapperServiceCollectionExtensions + { + public static void AddMappers(this IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + } + } +} 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; } } } diff --git a/BackEnd/Timeline/Models/Mapper/UserMapper.cs b/BackEnd/Timeline/Models/Mapper/UserMapper.cs index 3255dca9..e6db4225 100644 --- a/BackEnd/Timeline/Models/Mapper/UserMapper.cs +++ b/BackEnd/Timeline/Models/Mapper/UserMapper.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; -using System.Linq; +using System.Threading.Tasks; using Timeline.Controllers; using Timeline.Entities; using Timeline.Models.Http; @@ -8,15 +8,24 @@ using Timeline.Services; namespace Timeline.Models.Mapper { - public static class UserMapper + public class UserMapper { - public static HttpUser MapToHttp(this UserEntity entity, IUrlHelper urlHelper) + private readonly DatabaseContext _database; + private readonly IUserPermissionService _userPermissionService; + + public UserMapper(DatabaseContext database, IUserPermissionService userPermissionService) + { + _database = database; + _userPermissionService = userPermissionService; + } + + public async Task MapToHttp(UserEntity entity, IUrlHelper urlHelper) { return new HttpUser( uniqueId: entity.UniqueId, username: entity.Username, nickname: string.IsNullOrEmpty(entity.Nickname) ? entity.Username : entity.Nickname, - permissions: MapPermission(entity), + permissions: (await _userPermissionService.GetPermissionsOfUserAsync(entity.Id, false)).ToStringList(), links: new HttpUserLinks( self: urlHelper.ActionLink(nameof(UserController.Get), nameof(UserController)[0..^nameof(Controller).Length], new { entity.Username }), avatar: urlHelper.ActionLink(nameof(UserAvatarController.Get), nameof(UserAvatarController)[0..^nameof(Controller).Length], new { entity.Username }), @@ -25,14 +34,14 @@ namespace Timeline.Models.Mapper ); } - public static List MapToHttp(this List entities, IUrlHelper urlHelper) - { - return entities.Select(e => e.MapToHttp(urlHelper)).ToList(); - } - - private static List MapPermission(UserEntity entity) + public async Task> MapToHttp(List entities, IUrlHelper urlHelper) { - return entity.Permissions.Select(p => p.Permission).ToList(); + var result = new List(); + foreach (var entity in entities) + { + result.Add(await MapToHttp(entity, urlHelper)); + } + return result; } } } diff --git a/BackEnd/Timeline/Models/Timeline.cs b/BackEnd/Timeline/Models/Timeline.cs index fa3c0eb3..9f3eabdf 100644 --- a/BackEnd/Timeline/Models/Timeline.cs +++ b/BackEnd/Timeline/Models/Timeline.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Timeline.Models +namespace Timeline.Models { public enum TimelineVisibility { -- cgit v1.2.3