/// <summary> /// 回退提问 /// </summary> /// <param name="reason"></param> /// <param name="isClearReport">是否清除举报记录</param> /// <returns></returns> internal async Task <bool> BackQuestionAsync(string reason, bool isClearReport = false) { await using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.FirstOrDefaultAsync(q => q.Id == Id); if (question is null) { return(false); } if (question.State == (int)QuestionState.Back) { return(false); } question.State = (int)QuestionState.Back; DB.Tables.QuestionBackRecord record = new DB.Tables.QuestionBackRecord { QuestionId = Id, Description = reason }; db.QuestionBackRecords.Add(record); int shouldChangeCount = 2; if (isClearReport) { var qrList = await db.QuestionReportRecords.AsNoTracking().Where(qr => qr.QuestionId == Id && !qr.IsHandled).ToListAsync(); db.QuestionReportRecords.RemoveRange(qrList); shouldChangeCount += qrList.Count; } int changeCount = await db.SaveChangesAsync(); return(changeCount == shouldChangeCount); }
/// <summary> /// 提交审核 /// </summary> public async Task <Resp> ToAudit(string description) { if (string.IsNullOrWhiteSpace(description)) { return(Resp.Fault(Resp.NONE, "提问内容不能为空")); } using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.FirstOrDefaultAsync(q => q.Id == Id); if (question is null) { return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST)); } if (question.Description == description) { return(Resp.Fault(Resp.NONE, "提问内容未修改")); } question.State = (int)QuestionState.ToAudit; question.Description = description; if (await db.SaveChangesAsync() == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "提交失败")); }
public async Task <Resp> EnabledAsync() { int enabledValue = (int)QuestionState.Enabled; string enabledDescription = QuestionState.Enabled.GetDescription(); using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.FirstOrDefaultAsync(q => q.Id == Id); if (question is null) { return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST)); } if (question.State == enabledValue) { return(Resp.Fault(Resp.NONE, $"已经是{enabledDescription}的状态,不能再次{enabledDescription}")); } question.State = enabledValue; int changeCount = await db.SaveChangesAsync(); if (changeCount == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "修改失败")); }
/// <summary> /// 提一个问题,会返回新提问的 ID /// </summary> public async Task <Resp> AskQuestion(Models.PostQuestion questionParams) { (bool isValid, string msg) = questionParams.IsValid(); if (!isValid) { return(Resp.Fault(Resp.NONE, msg)); } DB.Tables.Question question = new DB.Tables.Question { Title = questionParams.Title, Description = questionParams.Description, Tags = string.Join(',', questionParams.Tags), State = (int)Question.QuestionState.Enabled, AskerId = questionParams.UserId }; if (questionParams.Tags.Length >= 0) { await new Tags.Hub().AddTagsAsync(questionParams.Tags); } await using YGBContext db = new YGBContext(); db.Add(question); if (await db.SaveChangesAsync() != 0) { return(Resp.Success(question.Id, "")); } return(Resp.Fault(Resp.NONE, "提交失败")); }
/// <summary> /// 获取用户编辑的提问信息 /// </summary> /// <param name="questionId"></param> /// <returns></returns> public async Task <Results.QuestionEditInfo> GetEditInfoAsync(int questionId) { await using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.AsNoTracking().FirstOrDefaultAsync(q => q.Id == questionId); if (question is null) { return(default);
/// <summary> /// 获取标题 /// </summary> /// <returns></returns> public string GetTitle() { CheckEmpty(); string key = $"c0396d57-7c18-47d5-957c-d135f57882aa_{Id}"; string name = Cache.Get <string>(key); if (name is null) { using var db = new YGBContext(); DB.Tables.Question question = db.Questions.AsNoTracking().FirstOrDefault(a => a.Id == Id); name = question?.Title ?? ""; Cache.Set(key, name); } return(name); }
public async Task <Resp> GetDetailAsync(int questionId, Paginator page) { using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.Include(q => q.Asker) .ThenInclude(asker => asker.Avatar) .Include(q => q.QuestionComments) .FirstOrDefaultAsync(q => q.Id == questionId); if (question is null) { return(Resp.Fault(Resp.NONE, Question.QUESTION_NO_EXIST)); } Answers.Hub answerHub = new Answers.Hub(); // 获取第一页的答案分页 // 获取提问下的答案分页 Answers.List.AnswerList answers = answerHub.GetAnswers(Answers.Hub.AnswerSource.Question); (page.List, page.TotalRows) = await answers.GetAnswersAsync(questionId, page.Index, page.Size, Answers.Answer.AnswerState.NoSelected); Results.QuestionDetailForAdmin detail = new Results.QuestionDetailForAdmin { Id = question.Id, Title = question.Title, Description = question.Description, Tags = question.Tags.Split(','), Votes = question.Votes, Views = question.Views, Actived = question.Actived.ToStandardString(), CreateDate = question.CreateDate.ToStandardString(), State = KeyValue <int, string> .Create(question.State, question.State.GetDescription <Question.QuestionState>()), Comments = question.QuestionComments.Select(q => KeyValue <int, string> .Create(q.Id, q.Content)).ToArray(), User = new Clients.Results.UserIntro { Id = question.Asker.Id, Account = question.Asker.Name, Avatar = question.Asker.Avatar.Thumbnail }, Page = page }; await db.SaveChangesAsync(); return(Resp.Success(detail, "")); }
/// <summary> /// 获取举报的提问详情 /// </summary> /// <param name="questionId"></param> /// <param name="index"></param> /// <param name="size"></param> /// <returns></returns> public async Task <Resp> GetDetailAsync(int questionId, Paginator page) { await using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.AsNoTracking() .FirstOrDefaultAsync(q => q.Id == questionId); if (question is null) { return(Resp.Fault(Resp.NONE, "该提问不存在")); } Results.ReportQuestionDetail detail = new Results.ReportQuestionDetail { Title = question.Title, Content = question.Description, State = Share.KeyValue <int, string> .Create(question.State, question.State.GetDescription <Question.QuestionState>()) }; return(Resp.Success(detail)); }
/// <summary> /// 举报这个提问 /// </summary> /// <returns></returns> public async Task <Resp> ReportAsync(string content, string description, int reporterId) { /* * 举报这个提问 * 添加一条提问举报记录 */ if (string.IsNullOrWhiteSpace(content)) { return(Resp.Fault(Resp.NONE, "请填写举报原因")); } CheckEmpty(); using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); if (question is null) { return(Resp.Fault(Resp.NONE, QUESTION_NO_EXIST)); } DB.Tables.QuestionReportRecord record = new DB.Tables.QuestionReportRecord { QuestionId = Id, Content = content, Description = description ?? "", CreatorId = reporterId }; db.QuestionReportRecords.Add(record); if (await db.SaveChangesAsync() == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "操作失败")); }
public async Task <Resp> GetDetailAsync(int questionId, Paginator page) { if (!int.TryParse(page["currentUserId"], out int currentUserId)) { currentUserId = 0; } await using var db = new YGBContext(); DB.Tables.Question question = await db.Questions.Include(q => q.Asker) .ThenInclude(asker => asker.Avatar) .Include(q => q.QuestionComments) .FirstOrDefaultAsync(q => q.Id == questionId); if (question is null) { return(Resp.Fault(Resp.NONE, Question.QUESTION_NO_EXIST)); } // 被删除的答案无法查看 if (question.State == (int)Question.QuestionState.Delete) { return(Resp.Fault(Resp.NONE, "该提问暂时无法查看")); } // 如果不是本人,则不能看启用之外的提问 if (currentUserId != question.Asker.Id) { if (question.State != (int)Question.QuestionState.Enabled) { return(Resp.Fault(Resp.NONE, "该提问暂时无法查看")); } } Answers.Hub answerHub = new Answers.Hub(); // 获取第一页的答案分页 Answers.List.AnswerList answers = answerHub.GetAnswers(Answers.Hub.AnswerSource.Question); (page.List, page.TotalRows) = await answers.GetAnswersAsync(questionId, page.Index, page.Size, Answers.Answer.AnswerState.Enabled); Results.QuestionDetailForClient detail = new Results.QuestionDetailForClient { Id = question.Id, Title = question.Title, Description = question.Description, Tags = question.Tags.Split(',', ','), Votes = question.Votes, Views = question.Views, Actived = question.Actived.ToStandardString(), CreateDate = question.CreateDate.ToStandardString(), State = Share.KeyValue <int, string> .Create(question.State, question.State.GetDescription <Question.QuestionState>()), User = new Clients.Results.UserIntro { Id = question.Asker.Id, Account = question.Asker.Name, Avatar = question.Asker.Avatar.Thumbnail }, Page = page, Comments = question.QuestionComments.Take(5).Select(c => c.Content).ToArray(), IsSelf = question.AskerId == currentUserId }; question.Views++; question.Actived = DateTimeOffset.Now; await db.SaveChangesAsync(); return(Resp.Success(detail, "")); }