using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; using System.Collections.Generic; using Timeline.Controllers; using Timeline.Services; namespace Timeline.Models.Http { /// /// Info of a user. /// public class HttpUser { /// /// Unique id. /// public string UniqueId { get; set; } = default!; /// /// Username. /// public string Username { get; set; } = default!; /// /// Nickname. /// public string Nickname { get; set; } = default!; #pragma warning disable CA2227 // Collection properties should be read only /// /// The permissions of the user. /// public List Permissions { get; set; } = default!; #pragma warning restore CA2227 // Collection properties should be read only #pragma warning disable CA1707 // Identifiers should not contain underscores /// /// Related links. /// public HttpUserLinks _links { get; set; } = default!; #pragma warning restore CA1707 // Identifiers should not contain underscores } /// /// Related links for user. /// public class HttpUserLinks { /// /// Self. /// public string Self { get; set; } = default!; /// /// Avatar url. /// public string Avatar { get; set; } = default!; /// /// Personal timeline url. /// public string Timeline { get; set; } = default!; } public class HttpUserPermissionsValueConverter : ITypeConverter> { public List Convert(UserPermissions source, List destination, ResolutionContext context) { return source.ToStringList(); } } public class HttpUserLinksValueResolver : IValueResolver { private readonly IActionContextAccessor _actionContextAccessor; private readonly IUrlHelperFactory _urlHelperFactory; public HttpUserLinksValueResolver(IActionContextAccessor actionContextAccessor, IUrlHelperFactory urlHelperFactory) { _actionContextAccessor = actionContextAccessor; _urlHelperFactory = urlHelperFactory; } public HttpUserLinks Resolve(UserInfo source, HttpUser destination, HttpUserLinks destMember, ResolutionContext context) { var actionContext = _actionContextAccessor.AssertActionContextForUrlFill(); var urlHelper = _urlHelperFactory.GetUrlHelper(actionContext); var result = new HttpUserLinks { Self = urlHelper.ActionLink(nameof(UserController.Get), nameof(UserController)[0..^nameof(Controller).Length], new { destination.Username }), Avatar = urlHelper.ActionLink(nameof(UserAvatarController.Get), nameof(UserAvatarController)[0..^nameof(Controller).Length], new { destination.Username }), Timeline = urlHelper.ActionLink(nameof(TimelineController.TimelineGet), nameof(TimelineController)[0..^nameof(Controller).Length], new { Name = "@" + destination.Username }) }; return result; } } public class HttpUserAutoMapperProfile : Profile { public HttpUserAutoMapperProfile() { CreateMap>() .ConvertUsing(); CreateMap() .ForMember(u => u._links, opt => opt.MapFrom()); } } }