示例#1
0
        public static Submission GetSticky(string subverse)
        {
            //Heads up: Right now the cache is set to ignore nulls, so we create an empty list to use if a sub has no stickies
            //will refactor this in the future when we modify the cachehandler to support null caching per call
            List <Submission> stickies = CacheHandler.Instance.Register(CachingKey.StickySubmission(subverse), new Func <List <Submission> >(() =>
            {
                using (var db = new voatEntities())
                {
                    var x = db.StickiedSubmissions.FirstOrDefault(s => s.Subverse == subverse);
                    if (x != null)
                    {
                        return(new List <Submission>()
                        {
                            DataCache.Submission.Retrieve(x.SubmissionID)
                        });
                    }
                    return(new List <Submission>());
                }
            }), TimeSpan.FromSeconds(600));

            if (stickies != null && stickies.Any())
            {
                return(stickies.First());
            }
            else
            {
                return(null);
            }
        }
示例#2
0
 public override void ClassInitialize()
 {
     using (var db = new VoatDataContext())
     {
         //1
         db.Filter.Add(new Filter()
         {
             Pattern      = ".",
             IsActive     = false,
             Name         = "Match Anything",
             CreationDate = DateTime.UtcNow.AddDays(-10)
         });
         //2
         db.Filter.Add(new Filter()
         {
             Pattern      = @"evildomain\.evil",
             IsActive     = true,
             Name         = "Evil Domain is Banned",
             CreationDate = DateTime.UtcNow.AddDays(-10)
         });
         //3
         db.Filter.Add(new Filter()
         {
             Pattern      = @"google\.com/url",
             IsActive     = true,
             Name         = "Google redirect ban",
             CreationDate = DateTime.UtcNow.AddDays(-10)
         });
         db.SaveChanges();
     }
     //Remove Filters that may be in cache
     CacheHandler.Instance.Remove(CachingKey.Filters());
 }
示例#3
0
        private void ClearUserCache(string userName = null)
        {
            userName = String.IsNullOrEmpty(userName) ? User.Identity.Name : userName;

            CacheHandler.Instance.Remove(CachingKey.UserPreferences(userName));
            CacheHandler.Instance.Remove(CachingKey.UserInformation(userName));
        }
 protected override void UpdateCache(CommandResponse <Vote> result)
 {
     if (result.Success)
     {
         CacheHandler.Instance.Remove(CachingKey.Vote(result.Response.ID));
     }
 }
示例#5
0
        public async Task <IActionResult> ApproveOrReject(int replyId, [FromBody] dynamic model)
        {
            var operation = (string)model.Operation;

            if (string.IsNullOrEmpty(operation))
            {
                throw new ServiceException(HttpStatusCode.BadRequest, Reason.InvalidArgument, "回复审批操作方式未指定,请指定Approve或者Reject操作。");
            }

            if (operation.ToUpper() != "APPROVE" &&
                operation.ToUpper() != "REJECT")
            {
                throw new ServiceException(HttpStatusCode.MethodNotAllowed, Reason.InvalidArgument, "指定的审批操作方式不可用,请指定Approve或者Reject操作。");
            }

            var blogPostId   = -1;
            var affectedRows = await this.storage.ExecuteAsync(async (connection, transaction, cancellationToken) =>
            {
                var reply = (await this.replyStore.SelectAsync(connection,
                                                               r => r.Id == replyId,
                                                               transaction: transaction,
                                                               cancellationToken: cancellationToken)).FirstOrDefault();
                if (reply == null)
                {
                    throw new ServiceException(HttpStatusCode.NotFound, Reason.EntityNotFound, $"ID为{replyId}的用户回复内容不存在。");
                }
                blogPostId       = reply.BlogPostId;
                var updateFields = new List <Expression <Func <Reply, object> > >();
                switch (operation.ToUpper())
                {
                case "APPROVE":
                    reply.Status = ReplyStatus.Approved;
                    break;

                case "REJECT":
                    reply.Status = ReplyStatus.Rejected;
                    break;
                }

                return(await this.replyStore.UpdateAsync(reply,
                                                         connection,
                                                         r => r.Id == replyId,
                                                         new Expression <Func <Reply, object> >[] { r => r.Status },
                                                         transaction,
                                                         cancellationToken));
            });

            if (affectedRows > 0)
            {
                if (blogPostId >= 0)
                {
                    var key = new CachingKey(CachingKeys.BLOGPOSTS_POST_KEY, blogPostId);
                    this.cachingService.Delete(key);
                }

                return(Ok(affectedRows));
            }

            throw new ServiceException(Reason.UpdateFailed, "用户回复审批失败。");
        }
 protected override void UpdateCache(CommandResponse result)
 {
     if (result.Success)
     {
         CacheHandler.Instance.Remove(CachingKey.UserSubscriptions(UserName));
     }
 }
示例#7
0
 protected override void UpdateCache(ApiClient result)
 {
     if (result != null)
     {
         CacheHandler.Instance.Remove(CachingKey.ApiClient(result.PublicKey));
     }
 }
        public async Task <ActionResult> ResignAsModeratorPost(string subverse)
        {
            // get moderator name for selected subverse
            var subModerator = _db.SubverseModerator.FirstOrDefault(s => s.Subverse == subverse && s.UserName == User.Identity.Name);

            if (subModerator == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var subverseObject = DataCache.Subverse.Retrieve(subModerator.Subverse);

            if (subverseObject == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // execute removal
            _db.SubverseModerator.Remove(subModerator);
            await _db.SaveChangesAsync();

            //clear mod cache
            CacheHandler.Instance.Remove(CachingKey.SubverseModerators(subverseObject.Name));

            return(RedirectToRoute(Models.ROUTE_NAMES.SUBVERSE_INDEX, new { subverse = subverse }));
        }
        protected override async Task <CommandResponse <VoteTracker> > ExecuteStage(CommandStage stage, CommandResponse <VoteTracker> previous)
        {
            switch (stage)
            {
            case CommandStage.OnExecuting:

                var q    = new QueryVote(_voteID);
                var vote = await q.ExecuteAsync();

                var notPassed = vote.Restrictions.FirstOrDefault(x => {
                    var e = x.Evaluate(User);
                    return(!e.Success);
                });

                _restrictionsPassed = notPassed == null;

                break;

            case CommandStage.OnExecuted:

                if (previous.Success)
                {
                    CacheHandler.Instance.Remove(CachingKey.VoteStatistics(_voteID));
                }

                break;
            }
            return(await base.ExecuteStage(stage, previous));
        }
        public async Task <ActionResult> RemoveLinkFlair(int id)
        {
            // get link flair for selected subverse
            var linkFlairToRemove = await _db.SubverseFlair.FindAsync(id);

            if (linkFlairToRemove == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var subverse = DataCache.Subverse.Retrieve(linkFlairToRemove.Subverse);

            if (subverse == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // check if caller has clearance to remove a link flair
            if (!ModeratorPermission.HasPermission(User, subverse.Name, Domain.Models.ModeratorAction.ModifyFlair))
            {
                return(RedirectToAction("Index", "Home"));
            }

            // execute removal
            var subverseFlairSetting = await _db.SubverseFlair.FindAsync(id);

            _db.SubverseFlair.Remove(subverseFlairSetting);
            await _db.SaveChangesAsync();

            //clear cache
            CacheHandler.Instance.Remove(CachingKey.SubverseFlair(subverse.Name));

            return(RedirectToAction("SubverseFlairSettings"));
        }
示例#11
0
 protected override void UpdateCache(CommandResponse <RemoveModeratorResponse> result)
 {
     if (result.Success)
     {
         CacheHandler.Instance.Remove(CachingKey.SubverseModerators(result.Response.Subverse));
     }
 }
示例#12
0
        protected override void UpdateCache(Data.Models.Submission result)
        {
            CacheHandler.Instance.Remove(CachingKey.Submission(result.ID));

            //Legacy item removal
            CacheHandler.Instance.Remove(DataCache.Keys.Submission(result.ID));
        }
        public async Task <ActionResult> SubverseStylesheetEditor(SubverseStylesheetViewModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    SetNavigationViewModel(model.Name);
                    return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml"));
                }
                var existingSubverse = _db.Subverse.FirstOrDefault(x => x.Name.ToUpper() == model.Name.ToUpper());

                // check if subverse exists before attempting to edit it
                if (existingSubverse != null)
                {
                    SetNavigationViewModel(model.Name);
                    // check if user requesting edit is authorized to do so for current subverse
                    // check that the user requesting to edit subverse settings is subverse owner!
                    if (!ModeratorPermission.HasPermission(User, existingSubverse.Name, Domain.Models.ModeratorAction.ModifyCSS))
                    {
                        return(new EmptyResult());
                    }

                    if (!String.IsNullOrEmpty(model.Stylesheet))
                    {
                        if (model.Stylesheet.Length < 50001)
                        {
                            existingSubverse.Stylesheet = model.Stylesheet;
                        }
                        else
                        {
                            ModelState.AddModelError(string.Empty, "Sorry, custom CSS limit is set to 50000 characters.");
                            return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml"));
                        }
                    }
                    else
                    {
                        existingSubverse.Stylesheet = model.Stylesheet;
                    }

                    await _db.SaveChangesAsync();

                    //purge new minified CSS
                    CacheHandler.Instance.Remove(CachingKey.SubverseStylesheet(existingSubverse.Name));
                    CacheHandler.Instance.Remove(CachingKey.Subverse(existingSubverse.Name));

                    // go back to this subverse
                    return(RedirectToRoute(Models.ROUTE_NAMES.SUBVERSE_INDEX, new { subverse = model.Name }));
                }

                ModelState.AddModelError(string.Empty, "Sorry, The subverse you are trying to edit does not exist.");
                return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml", model));
            }
            catch (Exception ex)
            {
                EventLogger.Instance.Log(ex);
                ModelState.AddModelError(string.Empty, "Something bad happened.");
                return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml", model));
            }
        }
 protected override void UpdateCache(CommandResponse <bool?> result)
 {
     if (result.Success)
     {
         //purge subscriptions from cache because they just changed
         CacheHandler.Instance.Remove(CachingKey.UserSubscriptions(UserName));
     }
 }
 protected override void UpdateCache(CommandResponse <Domain.Models.Set> result)
 {
     if (result.Success)
     {
         CacheHandler.Instance.Remove(CachingKey.UserSubscriptions(UserName));
         CacheHandler.Instance.Remove(CachingKey.Set(this._set.Name, this._set.UserName));
     }
 }
示例#16
0
        public async Task <ActionResult> Index(int?page, string domainname, string sortingmode)
        {
            const int pageSize   = 25;
            int       pageNumber = (page ?? 0);

            if (pageNumber < 0 || String.IsNullOrWhiteSpace(domainname) || pageNumber > 9)
            {
                return(NotFoundErrorView());
            }
            if (domainname.Length < 4)
            {
                return(RedirectToAction("UnAuthorized", "Error"));
            }

            sortingmode = (sortingmode == "new" ? "new" : "hot");

            ViewBag.SelectedSubverse = "domains";
            ViewBag.SelectedDomain   = domainname;
            domainname = domainname.Trim().ToLower();

            //TODO: This needs to moved to Query/Repository
            var results = CacheHandler.Instance.Register(CachingKey.DomainSearch(domainname, pageNumber, sortingmode), () => {
                using (var db = new voatEntities())
                {
                    db.EnableCacheableOutput();

                    //restrict disabled subs from result list
                    IQueryable <Submission> q = (from m in db.Submissions
                                                 join s in db.Subverses on m.Subverse equals s.Name
                                                 where
                                                 !s.IsAdminDisabled.Value &&
                                                 !m.IsDeleted &&
                                                 m.Type == 2 &&
                                                 m.Url.ToLower().Contains(domainname)
                                                 select m);

                    if (sortingmode == "new")
                    {
                        ViewBag.SortingMode = sortingmode;
                        q = q.OrderByDescending(x => x.CreationDate);
                    }
                    else
                    {
                        ViewBag.SortingMode = "hot";
                        q = q.OrderByDescending(x => x.Rank).ThenByDescending(x => x.CreationDate);
                    }

                    var result = q.Skip(pageNumber * pageSize).Take(pageSize).ToList();

                    return(result);
                }
            }, TimeSpan.FromMinutes(60));

            var paginatedSubmissions = new PaginatedList <Submission>(results, page ?? 0, pageSize);

            ViewBag.Title = "Showing all submissions which link to " + domainname;
            return(View("Index", paginatedSubmissions));
        }
        public async Task <IActionResult> Update(int id, [FromBody] dynamic model)
        {
            var title         = (string)model.Title;
            var content       = (string)model.Content;
            var datePublished = (DateTime?)model.DatePublished;
            var visits        = (int?)model.Visits;

            var result = await this.storage.ExecuteAsync(async (connection, transaction, cancellationToken) =>
            {
                var blogPost = (await this.blogPostStore.SelectAsync(connection,
                                                                     bp => bp.Id == id,
                                                                     transaction: transaction,
                                                                     cancellationToken: cancellationToken)).FirstOrDefault();
                if (blogPost == null)
                {
                    throw new ServiceException(HttpStatusCode.NotFound, Reason.EntityNotFound, $"Id为{id}的博客日志不存在。");
                }

                var listUpdateFields = new List <Expression <Func <BlogPost, object> > >();
                if (!string.IsNullOrEmpty(title))
                {
                    blogPost.Title = title;
                    listUpdateFields.Add(x => x.Title);
                }

                if (!string.IsNullOrEmpty(content))
                {
                    blogPost.Content = content;
                    listUpdateFields.Add(x => x.Content);
                }

                if (datePublished != null && datePublished.HasValue && datePublished != DateTime.MinValue)
                {
                    blogPost.DatePublished = datePublished.Value;
                    listUpdateFields.Add(x => x.DatePublished);
                }

                if (visits != null && visits.HasValue && visits != int.MinValue)
                {
                    blogPost.Visits = visits.Value;
                    listUpdateFields.Add(x => x.Visits);
                }

                return(await this.blogPostStore.UpdateAsync(blogPost, connection,
                                                            x => x.Id == id,
                                                            listUpdateFields, transaction, cancellationToken));
            });

            if (result > 0)
            {
                // Removes the specific post from the cache
                var cachingKey = new CachingKey(CachingKeys.BLOGPOSTS_POST_KEY, id);
                this.cachingService.Delete(cachingKey);

                return(Ok());
            }
            throw new ServiceException(Reason.UpdateFailed, "更新博客日志失败。");
        }
        protected override void UpdateCache(CommandResponse <Data.Models.Submission> result)
        {
            if (result.Success)
            {
                CacheHandler.Instance.Remove(CachingKey.Submission(result.Response.ID));
            }

            //Legacy item removal
            //CacheHandler.Instance.Remove(DataCache.Keys.Submission(result.ID));
        }
示例#19
0
        public object Get(CachingKey key)
        {
            object ret = null;

            if (cache.TryGetValue(key, out ret))
            {
                return(ret);
            }
            return(null);
        }
示例#20
0
        public static double?GetSubverseHighestRanking(string subverse)
        {
            var highestRank = CacheHandler.Instance.Register(CachingKey.SubverseHighestRank(subverse), new Func <double?>(() =>
            {
                using (var repo = new Repository())
                {
                    return(repo.HighestRankInSubverse(subverse));
                }
            }), TimeSpan.FromMinutes(30));

            return(highestRank);
        }
示例#21
0
        public static void UpdateSubverseHighestRanking(string subverse, double newRank)
        {
            var highestRankCacheEntry = GetSubverseHighestRanking(subverse);

            if (highestRankCacheEntry != null)
            {
                if (highestRankCacheEntry < newRank)
                {
                    CacheHandler.Instance.Replace <double?>(CachingKey.SubverseHighestRank(subverse), highestRankCacheEntry, TimeSpan.FromMinutes(30));
                }
            }
        }
        public static int CommentCount(int submissionID)
        {
            string cacheKey = CachingKey.CommentCount(submissionID);
            var    data     = CacheHandler.Instance.Register(cacheKey, new Func <int?>(() =>
            {
                using (var repo = new Repository())
                {
                    return(repo.GetCommentCount(submissionID));
                }
            }), _cacheTime, 3);

            return(data.Value);
        }
 protected override void UpdateCache(CommandResponse <bool?> result)
 {
     if (result.Success)
     {
         if (_setRef.Name.IsEqual(SetType.Front.ToString()))
         {
             CacheHandler.Instance.Remove(CachingKey.UserSubscriptions(UserName));
         }
         else if (_setRef.Name.IsEqual(SetType.Blocked.ToString()))
         {
             CacheHandler.Instance.Remove(CachingKey.UserBlocks(UserName));
         }
     }
 }
示例#24
0
        protected override async Task <IEnumerable <Vote> > GetData()
        {
            using (var repo = new Repository(User))
            {
                var result = await repo.GetVotes(_subverse, _options);

                //Add to cache
                if (result != null && result.Any())
                {
                    result.ForEach(x => CacheHandler.Replace(CachingKey.Vote(x.ID), x, TimeSpan.FromMinutes(30)));
                }

                return(result);
            }
        }
示例#25
0
        public ICsvRowActivatorFactory <T> Create(IConverterProvider converterProvider, IColumnNameMapper columnNameMapper)
        {
            CachingKey key = new CachingKey(converterProvider, columnNameMapper);

            if (!cache.Keys.Contains(key))
            {
                var newFactory = factoryFactory.Create(converterProvider, columnNameMapper);
                cache.Add(key, newFactory);
                return(newFactory);
            }
            else
            {
                return(cache[key]);
            }
        }
示例#26
0
        public string Get()
        {
            var cachingKey = new CachingKey(CachingKeys.VERSION_NUMBER_KEY);
            var version    = cachingService.Get(cachingKey);

            if (version != null)
            {
                return(version.ToString());
            }

            var result = System.IO.File.ReadAllText(Path.Combine(this.hostingEnvironment.WebRootPath, "version.txt"));

            cachingService.Put(cachingKey, result);

            return(result);
        }
 protected override void UpdateCache(CommandResponse result)
 {
     if (result.Success)
     {
         //Cleare user cache
         CacheHandler.Instance.Remove(CachingKey.UserBlocks(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserInformation(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserOverview(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserPreferences(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserSubscriptions(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserData(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserBlocks(_options.UserName));
         CacheHandler.Instance.Remove(CachingKey.UserRecord(_options.UserName));
         //CacheHandler.Instance.Remove(CachingKey.UserSavedItems(_options.UserName));
     }
 }
 protected override void UpdateCache(CommandResponse result)
 {
     if (result.Success)
     {
         var hasDomain = _banList.Any(x => x.Type == BanType.Domain);
         var hasUser   = _banList.Any(x => x.Type == BanType.User);
         if (hasDomain)
         {
             CacheHandler.Instance.Remove(CachingKey.BannedDomains());
         }
         if (hasUser)
         {
             CacheHandler.Instance.Remove(CachingKey.BannedUsers());
         }
     }
 }
        public ActionResult AddLinkFlair(SubverseFlairInput subverseFlairSetting)
        {
            if (!ModelState.IsValid)
            {
                return(View("~/Views/Subverses/Admin/Flair/AddLinkFlair.cshtml", subverseFlairSetting));
            }

            //check perms
            if (!ModeratorPermission.HasPermission(User, subverseFlairSetting.Subverse, Domain.Models.ModeratorAction.ModifyFlair))
            {
                return(RedirectToAction("Index", "Home"));
            }

            // get model for selected subverse
            var subverse = DataCache.Subverse.Retrieve(subverseFlairSetting.Subverse);

            if (subverse == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }
            var count = _db.SubverseFlair.Count(x => x.Subverse == subverseFlairSetting.Subverse);

            if (count >= 20)
            {
                ViewBag.SubverseModel    = subverse;
                ViewBag.SubverseName     = subverse.Name;
                ViewBag.SelectedSubverse = string.Empty;
                SetNavigationViewModel(subverse.Name);
                ModelState.AddModelError("", "Subverses are limited to 20 flairs");
                return(View("~/Views/Subverses/Admin/Flair/AddLinkFlair.cshtml", subverseFlairSetting));
            }

            subverseFlairSetting.Subverse = subverse.Name;
            _db.SubverseFlair.Add(new SubverseFlair()
            {
                Label    = subverseFlairSetting.Label,
                CssClass = subverseFlairSetting.CssClass,
                Subverse = subverseFlairSetting.Subverse
            });
            _db.SaveChanges();

            //clear cache
            CacheHandler.Instance.Remove(CachingKey.SubverseFlair(subverse.Name));

            return(RedirectToAction("SubverseFlairSettings"));
        }
示例#30
0
 protected override void UpdateCache(CommandResponse <bool?> result)
 {
     if (result.Success)
     {
         string key = CachingKey.UserSavedItems(_type, UserName);
         if (result.Response.HasValue && CacheHandler.Instance.Exists(key))
         {
             if (result.Response.Value)
             {
                 CacheHandler.Instance.SetAdd(key, _id);
             }
             else
             {
                 CacheHandler.Instance.SetRemove(key, _id);
             }
         }
     }
 }