frontPanel/src/api/quiz.ts

139 lines
3.5 KiB
TypeScript
Raw Normal View History

2023-11-02 16:45:28 +00:00
import { makeRequest } from "@frontend/kitui";
import { CopyQuizRequest, CopyQuizResponse } from "model/quiz/copy";
import { CreateQuizRequest } from "model/quiz/create";
import { DeleteQuizRequest, DeleteQuizResponse } from "model/quiz/delete";
import { EditQuizRequest, EditQuizResponse } from "model/quiz/edit";
import { GetQuizRequest, GetQuizResponse } from "model/quiz/get";
import { GetQuizListRequest, GetQuizListResponse } from "model/quiz/getList";
2023-11-13 18:04:51 +00:00
import { RawQuiz } from "model/quiz/quiz";
2023-11-02 16:45:28 +00:00
const baseUrl = process.env.NODE_ENV === "production" ? "/squiz" : "https://squiz.pena.digital/squiz";
2023-11-13 18:04:51 +00:00
function createQuiz(body?: Partial<CreateQuizRequest>) {
return makeRequest<CreateQuizRequest, RawQuiz>({
2023-11-02 16:45:28 +00:00
url: `${baseUrl}/quiz/create`,
2023-11-13 18:04:51 +00:00
body: { ...defaultCreateQuizBody, ...body },
2023-11-02 16:45:28 +00:00
method: "POST",
});
}
2023-11-13 18:04:51 +00:00
async function getQuizList(body?: Partial<GetQuizListRequest>) {
const response = await makeRequest<GetQuizListRequest, GetQuizListResponse>({
2023-11-02 16:45:28 +00:00
url: `${baseUrl}/quiz/getList`,
2023-11-13 18:04:51 +00:00
body: { ...defaultGetQuizListBody, ...body },
method: "POST",
2023-11-02 16:45:28 +00:00
});
2023-11-13 18:04:51 +00:00
return response.items;
2023-11-02 16:45:28 +00:00
}
2023-11-13 18:04:51 +00:00
function getQuiz(body?: Partial<GetQuizRequest>) {
2023-11-02 16:45:28 +00:00
return makeRequest<GetQuizRequest, GetQuizResponse>({
url: `${baseUrl}/quiz/get`,
2023-11-13 18:04:51 +00:00
body: { ...defaultGetQuizBody, ...body },
2023-11-02 16:45:28 +00:00
method: "GET",
});
}
2023-11-13 18:04:51 +00:00
async function editQuiz(body: EditQuizRequest, signal?: AbortSignal) {
// await new Promise((resolve) => setTimeout(resolve, 1000));
2023-11-02 16:45:28 +00:00
return makeRequest<EditQuizRequest, EditQuizResponse>({
url: `${baseUrl}/quiz/edit`,
body,
method: "PATCH",
2023-11-13 18:04:51 +00:00
signal,
2023-11-02 16:45:28 +00:00
});
}
function copyQuiz(id: number) {
return makeRequest<CopyQuizRequest, CopyQuizResponse>({
url: `${baseUrl}/quiz/copy`,
body: { id },
method: "POST",
});
}
function deleteQuiz(id: number) {
return makeRequest<DeleteQuizRequest, DeleteQuizResponse>({
url: `${baseUrl}/quiz/delete`,
body: { id },
method: "DELETE",
});
}
function addQuizImages(quizId: number, image: Blob) {
const formData = new FormData();
formData.append("quiz", quizId.toString());
formData.append("image", image);
return makeRequest<FormData, never>({
url: `${baseUrl}/quiz/putImages`,
body: formData,
method: "POST",
});
}
export const quizApi = {
create: createQuiz,
getList: getQuizList,
get: getQuiz,
edit: editQuiz,
copy: copyQuiz,
delete: deleteQuiz,
addImages: addQuizImages,
};
const defaultCreateQuizBody: CreateQuizRequest = {
"fingerprinting": true,
"repeatable": true,
"note_prevented": true,
2023-11-13 18:04:51 +00:00
"mail_notifications": false,
2023-11-02 16:45:28 +00:00
"unique_answers": true,
"name": "string",
"description": "string",
"config": "string",
2023-11-13 18:04:51 +00:00
"status": "stop",
2023-11-02 16:45:28 +00:00
"limit": 0,
"due_to": 0,
"time_of_passing": 0,
2023-11-13 18:04:51 +00:00
"pausable": false,
2023-11-02 16:45:28 +00:00
"question_cnt": 0,
2023-11-13 18:04:51 +00:00
"super": false,
2023-11-02 16:45:28 +00:00
"group_id": 0,
};
const defaultEditQuizBody: EditQuizRequest = {
"id": 0,
"fp": true,
"rep": true,
"note_prevented": true,
"mailing": true,
"uniq": true,
"name": "string",
"desc": "string",
"conf": "string",
"status": "string",
"limit": 0,
"due_to": 0,
"time_of_passing": 0,
"pausable": true,
"question_cnt": 0,
"super": true,
"group_id": 0,
};
const defaultGetQuizBody: GetQuizRequest = {
"quiz_id": "string",
"limit": 0,
"page": 0,
"need_config": true,
};
const defaultGetQuizListBody: GetQuizListRequest = {
2023-11-13 18:04:51 +00:00
"limit": 100,
2023-11-02 16:45:28 +00:00
"offset": 0,
};