namespace Yes.Application.Blogs { public record GetPageViewQuery(NameValueCollection NameValueCollection) : IRequest; public record PageViewModel( MetaModel Meta, BlogModel Blog, List Categories, List Tags, List Archives, List SinglePages, SinglePageModel SinglePage, PagedList Comments ); public class GetPageViewQueryHandler( IBlogService blogService, IOptionsMonitor options, IMapper mapper, IHttpContextAccessor httpContextAccessor) : IRequestHandler { private readonly IBlogService _blogService = blogService; private readonly BlogSettings _settings = options.CurrentValue; private readonly IMapper _mapper = mapper; private readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor; public async Task Handle(GetPageViewQuery request, CancellationToken cancellationToken) { var articleId = request.NameValueCollection.QueryInt(BlogRouteConst.PageId); var slug = request.NameValueCollection.QueryString(BlogRouteConst.PageSlug); var pageIndex = request.NameValueCollection.QueryInt(BlogRouteConst.PageIndex, 1); var blogModel = _mapper.Map(_settings); var categories = await _blogService.GetAllCategories(); var pages = await _blogService.GetSinglePages(); var tags = await _blogService.GetTags(); var archives = await _blogService.GetArchives(); var page = pages.FirstOrDefault(x => x.Id == articleId || x.Slug == slug); if (page == null) { throw new PageNotFoundException(); } var ip = _httpContextAccessor?.HttpContext?.GetIpAddress() ?? ""; var comments = await _blogService.GetArticleComments(page.Id, ip, pageIndex); var meta = GetMeta(_settings, page); return new PageViewModel(meta , blogModel, categories, tags, archives, pages, page, comments); } private MetaModel GetMeta(BlogSettings blogSettings, SinglePageModel singlePageModel) { return new MetaModel { Description = singlePageModel.Summary, Keywords = $"{singlePageModel.Tag},{singlePageModel.Slug}", Title = $"{singlePageModel.Title} - {blogSettings.Name}", }; } } }