public async Task <ActionResult <int> > InternalError( [FromForm] InternalErrorModel model, [FromServices] SubmissionManager submissionManager) { if (!ModelState.IsValid) { return(BadRequest()); } var toDisable = JObject.Parse(model.disabled); var kind = toDisable["kind"].Value <string>(); if (kind == "language") { var langid = toDisable["langid"].Value <string>(); var lang = await DbContext.Languages .Where(l => l.ExternalId == langid) .SingleAsync(); lang.AllowJudge = false; DbContext.Languages.Update(lang); DbContext.AuditLogs.Add(new AuditLog { ContestId = model.cid ?? 0, EntityId = lang.LangId, Comment = "internal error created", Resolved = true, Time = DateTimeOffset.Now, Type = AuditLog.TargetType.Contest, UserName = "******", }); Telemetry.TrackDependency( dependencyTypeName: "Language", dependencyName: langid, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else if (kind == "judgehost") { var hostname = toDisable["hostname"].Value <string>(); var host = await DbContext.JudgeHosts .Where(h => h.ServerName == hostname) .SingleAsync(); host.Active = false; DbContext.JudgeHosts.Update(host); DbContext.AuditLogs.Add(new AuditLog { ContestId = model.cid ?? 0, EntityId = host.ServerId, Comment = "internal error created", Resolved = true, Time = DateTimeOffset.Now, Type = AuditLog.TargetType.Contest, UserName = host.ServerName, }); Telemetry.TrackDependency( dependencyTypeName: "JudgeHost", dependencyName: host.ServerName, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else if (kind == "problem") { var probid = toDisable["probid"].Value <int>(); var prob = await DbContext.Problems .Where(p => p.ProblemId == probid) .SingleAsync(); prob.AllowJudge = false; DbContext.Problems.Update(prob); DbContext.AuditLogs.Add(new AuditLog { ContestId = model.cid ?? 0, EntityId = probid, Comment = "internal error created", Resolved = true, Time = DateTimeOffset.Now, Type = AuditLog.TargetType.Problem, UserName = "******", }); Telemetry.TrackDependency( dependencyTypeName: "Problem", dependencyName: $"p{probid} - {prob.Title}", data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else { Telemetry.TrackDependency( dependencyTypeName: "Unresolved", dependencyName: kind, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } var ie = new InternalError { JudgehostLog = model.judgehostlog, JudgingId = model.judgingid, ContestId = model.cid, Description = model.description, Disabled = model.disabled, Status = InternalErrorStatus.Open, Time = DateTimeOffset.Now, }; if (model.judgingid.HasValue) { await submissionManager.RejudgeForErrorAsync(model.judgingid.Value); } DbContext.InternalErrors.Add(ie); await DbContext.SaveChangesAsync(); return(ie.ErrorId); }
public async Task <ActionResult <int> > InternalError( [FromForm] InternalErrorModel model, [FromServices] IInternalErrorStore store, [FromServices] ILanguageStore langs, [FromServices] IProblemStore probs) { if (!ModelState.IsValid) { return(BadRequest()); } var toDisable = model.disabled.AsJson <InternalErrorDisable>(); var kind = toDisable.kind; var ie = await store.CreateAsync( new InternalError { JudgehostLog = model.judgehostlog, JudgingId = model.judgingid, ContestId = model.cid, Description = model.description, Disabled = model.disabled, Status = InternalErrorStatus.Open, Time = DateTimeOffset.Now, }); if (kind == "language") { var langid = toDisable.langid; await langs.ToggleJudgeAsync(langid, false); Telemetry.TrackDependency( dependencyTypeName: "Language", dependencyName: langid, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else if (kind == "judgehost") { var hostname = toDisable.hostname; await Judgehosts.ToggleAsync(hostname, false); Telemetry.TrackDependency( dependencyTypeName: "JudgeHost", dependencyName: hostname, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else if (kind == "problem") { var probid = toDisable.probid.Value; await probs.ToggleJudgeAsync(probid, false); Telemetry.TrackDependency( dependencyTypeName: "Problem", dependencyName: $"p{probid}", data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } else { Telemetry.TrackDependency( dependencyTypeName: "Unresolved", dependencyName: kind, data: model.description, startTime: DateTimeOffset.Now, duration: TimeSpan.Zero, success: false); } if (model.judgingid.HasValue) { var(j, pid, cid, uid, time) = await Judgings.FindAsync(model.judgingid.Value); await ReturnToQueue(j, cid, pid, uid, time); } await HttpContext.AuditAsync("added", $"{ie.ErrorId}", $"for {kind}"); return(ie.ErrorId); }