Exemple #1
0
        public async Task <IActionResult> GetById([FromRoute] GetMaterialDetailQuery.Request request)
        {
            if (User != null)
            {
                if (User.IsInRole(nameof(RolesEnum.NewsStart)) ||
                    User.IsInRole(nameof(RolesEnum.BlogStart)))
                {
                    request.IncludePending = true;
                }
            }

            var model = await _cacheManager.GetOrCreateAsync(CacheKeysConstants.Material + request.Id,
                                                             async() => await Mediator.Send(request));

            return(Ok(model));
        }
        public async Task <IActionResult> Detail(GetMaterialDetailQuery.Request request)
        {
            request.IncludePending = User != null && (User.IsInRole(nameof(RolesEnum.NewsStart)) || User.IsInRole(nameof(RolesEnum.BlogStart)));

            var model = await Mediator.Send(request);

            if (model == null)
            {
                return(RedirectToAction("Index", "Blogs"));
            }
            if (model.Pending)
            {
                if ((model.Type == MaterialType.News || User.GetUserId() != model.UserId) &&
                    (User == null || !User.IsInRole(nameof(RolesEnum.NewsStart))))
                {
                    return(BadRequest());
                }
            }
            var label = CacheKeysConstants.Material + request.Id;

            if (string.IsNullOrWhiteSpace(Request.Cookies[label]))
            {
                var options = new CookieOptions {
                    Expires = DateTime.Now.AddMonths(1)
                };
                Response.Cookies.Append(label, "1", options);
                model.Reads++;
                await Mediator.Send(new AddMaterialReadCommand.Request {
                    Id = request.Id
                });

                UpdateMaterialCacheAddViewAsync(request.Id);
            }

            return(View("../Materials/Detail", model));
        }