feat: add api wrapper
This commit is contained in:
parent
e964fc8fff
commit
a4b0d0308c
3
src/api/api.ts
Normal file
3
src/api/api.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export { send } from "./base";
|
||||||
|
|
||||||
|
export { UserApi } from "./user.ts";
|
35
src/api/base.ts
Normal file
35
src/api/base.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
axios.defaults.baseURL =
|
||||||
|
process.env.NODE_ENV === "production"
|
||||||
|
? "/api/v1"
|
||||||
|
: "http://127.0.0.1:8000/api/v1";
|
||||||
|
|
||||||
|
export interface ResponseWrap<T> {
|
||||||
|
code: number;
|
||||||
|
msg: string;
|
||||||
|
body: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Meta {
|
||||||
|
ID: number;
|
||||||
|
CreatedAt: number;
|
||||||
|
UpdatedAt: number;
|
||||||
|
DeletedAt: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function send<D, T>(
|
||||||
|
api: string,
|
||||||
|
data?: D,
|
||||||
|
token?: string,
|
||||||
|
): Promise<T> {
|
||||||
|
try {
|
||||||
|
const resp = await axios.post<ResponseWrap<T>>(api, data, {
|
||||||
|
headers: { token: token },
|
||||||
|
});
|
||||||
|
if (resp.data.code !== 0) return Promise.reject(resp.data.msg);
|
||||||
|
return resp.data.body;
|
||||||
|
} catch (err) {
|
||||||
|
return Promise.reject(err);
|
||||||
|
}
|
||||||
|
}
|
72
src/api/problem.ts
Normal file
72
src/api/problem.ts
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import { Meta, send } from "./base.ts";
|
||||||
|
import { UserProfile } from "./user.ts";
|
||||||
|
|
||||||
|
export interface TaskInfo {
|
||||||
|
Languages: { Lang: string }[];
|
||||||
|
Runtime: {
|
||||||
|
MemoryLimit: number;
|
||||||
|
NProcLimit: number;
|
||||||
|
TimeLimit: number;
|
||||||
|
};
|
||||||
|
Tasks: { Id: number; Points: number }[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProblemInfo {
|
||||||
|
meta: Meta;
|
||||||
|
title: string;
|
||||||
|
statement: string;
|
||||||
|
provider: UserProfile;
|
||||||
|
is_enabled: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateVersionReq {
|
||||||
|
pid: number;
|
||||||
|
storage_key: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DetailsReq {
|
||||||
|
pid: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DetailsResp {
|
||||||
|
context: TaskInfo;
|
||||||
|
problem: ProblemInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SearchReq {
|
||||||
|
search: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UpdateReq {
|
||||||
|
pid: number;
|
||||||
|
title: string;
|
||||||
|
statement: string;
|
||||||
|
is_enabled: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UploadResp {
|
||||||
|
key: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ProblemApi {
|
||||||
|
async CreateVersion(data: CreateVersionReq, token: string): Promise<void> {
|
||||||
|
return send("/problem/create_version", data, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Details(data: DetailsReq): Promise<DetailsResp> {
|
||||||
|
return send("/problem/details", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Search(data: SearchReq): Promise<ProblemInfo[]> {
|
||||||
|
return send("/problem/search", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Update(data: UpdateReq, token: string): Promise<ProblemInfo> {
|
||||||
|
return send("/problem/update", data, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Upload(token: string): Promise<UploadResp> {
|
||||||
|
return send("/problem/upload", null, token);
|
||||||
|
}
|
||||||
|
}
|
61
src/api/status.ts
Normal file
61
src/api/status.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import { Meta, send } from "./base.ts";
|
||||||
|
import { SubmissionInfo } from "./submission.ts";
|
||||||
|
|
||||||
|
export enum Verdict {
|
||||||
|
Accepted,
|
||||||
|
WrongAnswer,
|
||||||
|
JuryFailed,
|
||||||
|
PartialCorrect,
|
||||||
|
TimeLimitExceeded,
|
||||||
|
MemoryLimitExceeded,
|
||||||
|
RuntimeError,
|
||||||
|
CompileError,
|
||||||
|
SystemError,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TaskResultInfo {
|
||||||
|
id: number;
|
||||||
|
points: number;
|
||||||
|
real_time: number;
|
||||||
|
cpu_time: number;
|
||||||
|
memory: number;
|
||||||
|
verdict: Verdict;
|
||||||
|
message: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ContextInfo {
|
||||||
|
message: string;
|
||||||
|
tasks: TaskResultInfo[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueryReq {
|
||||||
|
sid: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueryByVersionReq {
|
||||||
|
pvid: number;
|
||||||
|
offset?: number;
|
||||||
|
limit: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueryResp {
|
||||||
|
meta: Meta;
|
||||||
|
submission: SubmissionInfo;
|
||||||
|
problem_version_id: number;
|
||||||
|
context: ContextInfo;
|
||||||
|
point: number;
|
||||||
|
is_enabled: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StatusApi {
|
||||||
|
async Query(data: QueryReq): Promise<QueryResp> {
|
||||||
|
return send("/status/query", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async QueryByVersion(
|
||||||
|
data: QueryByVersionReq,
|
||||||
|
token: string,
|
||||||
|
): Promise<QueryResp[]> {
|
||||||
|
return send("/status/problem_version", data, token);
|
||||||
|
}
|
||||||
|
}
|
49
src/api/submission.ts
Normal file
49
src/api/submission.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { Meta, send } from "./base.ts";
|
||||||
|
import { UserProfile } from "./user.ts";
|
||||||
|
|
||||||
|
export interface SubmissionInfo {
|
||||||
|
meta: Meta;
|
||||||
|
problem_id: number;
|
||||||
|
user: UserProfile;
|
||||||
|
language: string;
|
||||||
|
code: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SubmitReq {
|
||||||
|
pid: number;
|
||||||
|
language: string;
|
||||||
|
code: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueryReq {
|
||||||
|
pid?: number;
|
||||||
|
uid?: number;
|
||||||
|
offset?: number;
|
||||||
|
limit: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueryResp {
|
||||||
|
submission: SubmissionInfo;
|
||||||
|
point: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ReJudgeReq {
|
||||||
|
sid: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SubmissionApi {
|
||||||
|
async Create(data: SubmitReq, token: string): Promise<void> {
|
||||||
|
return send("/submission/create", data, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Query(data: QueryReq, token: string): Promise<QueryResp[]> {
|
||||||
|
if (!data.pid && !data.uid) {
|
||||||
|
throw new Error("Missing required fields");
|
||||||
|
}
|
||||||
|
return send("/submission/query", data, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async ReJudge(data: ReJudgeReq, token: string): Promise<void> {
|
||||||
|
return send("/submission/rejudge", data, token);
|
||||||
|
}
|
||||||
|
}
|
40
src/api/user.ts
Normal file
40
src/api/user.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { Meta, send } from "./base.ts";
|
||||||
|
|
||||||
|
export interface UserReq {
|
||||||
|
username?: string;
|
||||||
|
password?: string;
|
||||||
|
nickname?: string;
|
||||||
|
uid?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UserProfile {
|
||||||
|
meta: Meta;
|
||||||
|
user_name: string;
|
||||||
|
nick_name: string;
|
||||||
|
role: number;
|
||||||
|
is_enabled: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UserApi {
|
||||||
|
async Create(data: UserReq): Promise<string> {
|
||||||
|
if (!data.username || !data.password || !data.nickname) {
|
||||||
|
throw new Error("Missing required fields");
|
||||||
|
}
|
||||||
|
return send("/user/create", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Login(data: UserReq): Promise<string> {
|
||||||
|
if (!data.username || !data.password) {
|
||||||
|
throw new Error("Missing required fields");
|
||||||
|
}
|
||||||
|
return send("/user/login", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Logout(token: string): Promise<void> {
|
||||||
|
return send("/user/logout", null, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Profile(data: UserReq, token: string): Promise<UserProfile> {
|
||||||
|
return send("/user/profile", data, token);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user