feat: add Status API

This commit is contained in:
Paul Pan 2024-03-16 19:02:39 +08:00
parent 8b2e0ad894
commit 5a85de3268

View File

@ -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<SubmissionWithPoint>;
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<Wrap<QueryResponse>, QueryRequest>({
query: (data: QueryRequest) => ({
url: "/status/query",
method: "POST",
body: data,
}),
providesTags: [{ type: "Status", id: "Search" }],
}),
detail: builder.query<Wrap<StatusInfo>, 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;