public void ArchiveAudit(Blog b, string auditor, BlogAudit.Action action, bool amend, string reason = "") { _taskQueue.QueueBackgroundWorkItem(Job.CreateJob(new ArchiveAuditArgs { Action = action, Auditor = auditor, BlogId = b.BlogID, IsAmend = amend, Reason = reason })); }
public async Task <JsonResult> Vote(int id, BlogAudit.Action auditAction, string reason) { if (!new[] { BlogAudit.Action.VoteApprove, BlogAudit.Action.VoteDeny, BlogAudit.Action.None }.Contains(auditAction)) { return(Json(new { success = false })); } var blog = _db.Blogs.Include("blogAudits").SingleOrDefault(b => b.BlogID == id); var user = _udb.Users.Include("auditor").Where(u => u.UserName == User.Identity.Name).Single(); if (blog == null || blog.isApproved != null) { return(Json(new { success = false, blogGone = true })); } if (user.auditor == null) { user.auditor = new Auditor(); await _udb.SaveChangesAsync(); } var version = blog.blogAudits.Where(ba => ba.AuditAction == BlogAudit.Action.Approve || ba.AuditAction == BlogAudit.Action.Deny) .DefaultIfEmpty().Max(bm => bm == null ? 0 : bm.BlogVersion) + 1; var audit = _db.BlogAudits.Find(id, User.Identity.Name, version) ?? _db.BlogAudits.Add(new BlogAudit { Auditor = User.Identity.Name, BlogID = id, BlogVersion = version }); if (audit.AuditAction == auditAction) { return(Json(new { success = true })); } audit.AuditAction = auditAction; audit.AuditDate = DateTime.Now; audit.Reason = reason; await _db.SaveChangesAsync(); // Calculate votes var setting = _dataSettings; var latestAudits = blog.blogAudits.Where(b => b.BlogVersion == version).ToList(); var latestAuditAuthors = latestAudits.Select(ba => ba.Auditor); var auditors = _udb.Auditors.Include(a => a.User).Where(a => latestAuditAuthors.Contains(a.User.UserName)).ToDictionary(a => a.User.UserName.ToLower()); bool needRefresh = false; float denyScore = latestAudits.Where(b => b.AuditAction == BlogAudit.Action.VoteDeny).Aggregate(0F, (score, ba) => score + auditors[ba.Auditor.ToLower()].Accuracy); if (denyScore >= setting.BlogDenyThreshold && setting.BlogDenyThreshold > 0) { DenyBlog(blog, "admin", true, latestAudits.Aggregate(new StringBuilder("投稿未通过审核。审核组给出的原因:<br>"), (sb, ba) => sb.AppendFormat("{0}:{1}<br>", ba.Auditor, string.IsNullOrEmpty(ba.Reason) ? "不通过" : ba.Reason)).ToString()); needRefresh = true; } else { float approveScore = latestAudits.Where(b => b.AuditAction == BlogAudit.Action.VoteApprove).Aggregate(0F, (score, ba) => score + auditors[ba.Auditor.ToLower()].Accuracy); if (approveScore >= setting.BlogApproveThreshold && setting.BlogApproveThreshold > 0) { ApproveBlog(blog, "admin", blog.Rating == 0); needRefresh = true; } } await _db.SaveChangesAsync(); return(Json(new { success = true, needRefresh = needRefresh })); }