using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; using Timeline.Controllers; namespace Timeline.Models.Http { /// /// Info of a user. /// public class UserInfo { /// /// Unique id. /// public string UniqueId { get; set; } = default!; /// /// Username. /// public string Username { get; set; } = default!; /// /// Nickname. /// public string Nickname { get; set; } = default!; /// /// True if the user is a administrator. /// public bool? Administrator { get; set; } = default!; #pragma warning disable CA1707 // Identifiers should not contain underscores /// /// Related links. /// public UserInfoLinks _links { get; set; } = default!; #pragma warning restore CA1707 // Identifiers should not contain underscores } /// /// Related links for user. /// public class UserInfoLinks { /// /// 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 UserInfoLinksValueResolver : IValueResolver { private readonly IActionContextAccessor _actionContextAccessor; private readonly IUrlHelperFactory _urlHelperFactory; public UserInfoLinksValueResolver(IActionContextAccessor actionContextAccessor, IUrlHelperFactory urlHelperFactory) { _actionContextAccessor = actionContextAccessor; _urlHelperFactory = urlHelperFactory; } public UserInfoLinks Resolve(User source, UserInfo destination, UserInfoLinks destMember, ResolutionContext context) { var actionContext = _actionContextAccessor.AssertActionContextForUrlFill(); var urlHelper = _urlHelperFactory.GetUrlHelper(actionContext); var result = new UserInfoLinks { 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 UserInfoAutoMapperProfile : Profile { public UserInfoAutoMapperProfile() { CreateMap().ForMember(u => u._links, opt => opt.MapFrom()); } } }