From 5a85de32680b4967ba2d43bf9b69e0ca0452c69f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sat, 16 Mar 2024 19:02:39 +0800 Subject: [PATCH] feat: add Status API --- src/app/services/status.ts | 96 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/app/services/status.ts diff --git a/src/app/services/status.ts b/src/app/services/status.ts new file mode 100644 index 0000000..5f974c1 --- /dev/null +++ b/src/app/services/status.ts @@ -0,0 +1,96 @@ +import type { Meta, WithCount, Wrap } from "./base"; +import type { SubmissionInfo } from "./submission"; +import { api } from "./api"; + +export enum Verdict { + Accepted, + WrongAnswer, + JuryFailed, + PartialCorrect, + TimeLimitExceeded, + MemoryLimitExceeded, + RuntimeError, + CompileError, + SystemError, +} + +export interface TaskResultInfo { + id: number; + message: string; + points: number; + runtime: { + real_time: number; + cpu_time: number; + memory: number; + }; + verdict: Verdict; +} + +export interface ContextInfo { + message: string; + compile_message: string; + tasks: TaskResultInfo[]; +} + +export interface StatusInfo { + meta: Meta; + submission: SubmissionInfo; + problem_version_id: number; + context: ContextInfo; + point: number; + is_enabled: boolean; +} + +export interface SubmissionWithPoint { + submission: SubmissionInfo; + point: number; +} + +export interface QueryRequest { + pid?: number; + uid?: number; + offset?: number; + limit: number; +} + +export type QueryResponse = WithCount; + +export interface QueryBySubmissionRequest { + sid: number; +} + +export interface QueryByVersionRequest { + pvid: number; + offset?: number; + limit: number; +} + +export interface QueryByVersionResponse { + count: number; + status: StatusInfo[]; +} + +export const statusApi = api.injectEndpoints({ + endpoints: (builder) => ({ + search: builder.query, QueryRequest>({ + query: (data: QueryRequest) => ({ + url: "/status/query", + method: "POST", + body: data, + }), + providesTags: [{ type: "Status", id: "Search" }], + }), + detail: builder.query, QueryBySubmissionRequest>({ + query: (data: QueryBySubmissionRequest) => ({ + url: "/status/query/submission", + method: "POST", + body: data, + }), + // NOTE: we're tracing submission ID here, when rejudge is fired, clear it + providesTags: (result) => (result ? [{ type: "Status", id: result.body.submission.meta.ID }] : []), + }), + // TODO: admin endpoints: detailByVersion + }), +}); + +export const { useSearchQuery, useDetailQuery } = statusApi;