コード例 #1
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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);
        }
コード例 #2
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "提交失败"));
        }
コード例 #3
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        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, "修改失败"));
        }
コード例 #4
0
        /// <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, "提交失败"));
        }
コード例 #5
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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);
コード例 #6
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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);
        }
コード例 #7
0
        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, ""));
        }
コード例 #8
0
        /// <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));
        }
コード例 #9
0
ファイル: Question.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "操作失败"));
        }
コード例 #10
0
        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, ""));
        }