Beispiel #1
0
        public async Task <ActionResult> ReJudge(int id)
        {
            using (var tran = TransactionInRequest.BeginTransaction())
            {
                var creator = await _db.Questions
                              .Where(x => x.Id == id)
                              .Select(x => x.CreateUserId)
                              .FirstAsync();

                if (!User.IsUserOrRole(creator, SystemRoles.QuestionAdmin))
                {
                    return(RedirectToAction("Details", new { id = id })
                           .WithError("只有创建者才能重新评测该题目。"));
                }

                await _db.Solutions
                .Where(x => x.QuestionId == id)
                .Select(x => x.Id)
                .ForEachAsync(x => SolutionHub.PushChange(x, SolutionState.Queuing, 0, 0.0f));

                await _db.Solutions
                .Where(x => x.QuestionId == id)
                .UpdateAsync(x => new Solution {
                    State = SolutionState.Queuing
                });

                await _db.SolutionLocks
                .Where(x => x.Solution.QuestionId == id)
                .DeleteAsync();

                var solutions = _db.Solutions
                                .Where(x => x.QuestionId == id)
                                .ProjectTo <SolutionPushModel>();

                await solutions.ForEachAsync(JudgeHub.Judge);

                tran.Complete();
            }

            return(RedirectToAction("Details", new { id = id })
                   .WithSuccess("该题目重新评测已经开始。"));
        }
Beispiel #2
0
        public async Task <ActionResult> ReJudge(int id)
        {
            // check access.
            var acl = await _db.Solutions
                      .Where(x => x.Id == id)
                      .Select(x => new
            {
                AuthorId          = x.CreateUserId,
                QuestionCreatorId = x.Question.CreateUserId
            })
                      .FirstAsync();

            if (!User.IsUserOrRole(acl.QuestionCreatorId, SystemRoles.QuestionAdmin))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            // act.
            await _db.Solutions
            .Where(x => x.Id == id)
            .UpdateAsync(s => new Solution {
                State = SolutionState.Queuing
            });

            await _db.SolutionLocks
            .Where(x => x.SolutionId == id)
            .DeleteAsync();

            var judgeModel = await _db.Solutions
                             .ProjectTo <SolutionPushModel>()
                             .FirstOrDefaultAsync(x => x.Id == id);

            SolutionHub.PushChange(judgeModel.Id, SolutionState.Queuing, 0, 0.0f);
            JudgeHub.Judge(judgeModel);

            return(new EmptyResult());
        }