From e961d53d6cff94ef43c932c20c2a6d4ae4a27eeb Mon Sep 17 00:00:00 2001 From: Tatiana Nikolaeva Date: Sun, 25 May 2025 00:08:36 +0500 Subject: [PATCH] query functions for response options --- SurveyFrontend/src/api/AnswerApi.ts | 85 +++++++++++++++++++ SurveyFrontend/src/api/AuthApi.ts | 10 +-- SurveyFrontend/src/api/BaseApi.ts | 10 ++- SurveyFrontend/src/api/QuestionApi.ts | 12 +-- .../QuestionsList/QuestionsList.tsx | 6 +- 5 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 SurveyFrontend/src/api/AnswerApi.ts diff --git a/SurveyFrontend/src/api/AnswerApi.ts b/SurveyFrontend/src/api/AnswerApi.ts new file mode 100644 index 0000000..59ad95e --- /dev/null +++ b/SurveyFrontend/src/api/AnswerApi.ts @@ -0,0 +1,85 @@ +import {BASE_URL, createRequestConfig, handleResponse} from "./BaseApi.ts"; + +export const getAnswerVariants = async (surveyId: number, questionId: number) => { + try{ + const response = await fetch(`${BASE_URL}/surveys/${surveyId}/questions/${questionId}/answerVariants`, { + ...createRequestConfig('GET') + }) + return await handleResponse(response) + }catch(err){ + console.error(`Error receiving response options: ${err}`); + throw err; + } +} + +export const addNewAnswerVariant = async (surveyId: number, questionId: number) => { + const token = localStorage.getItem("token"); + if (!token) { + throw new Error("Токен отсутствует"); + } + + try{ + const response = await fetch(`${BASE_URL}/surveys/${surveyId}/questions/${questionId}/answerVariants`, { + ...createRequestConfig('POST'), + body: JSON.stringify({ + surveyId: surveyId, + questionId: questionId, + }), + }) + + if (!response.ok) { + throw new Error(`Ошибка: ${response.status}`); + } + return await handleResponse(response) + } + catch(err){ + console.error(`Error adding a new response option: ${err}`); + throw err; + } +} + +export const updateAnswerVariant = async (surveyId: number, questionId: number, id: number) => { + const token = localStorage.getItem("token"); + if (!token) { + throw new Error("Токен отсутствует"); + } + + try{ + const response = await fetch(`${BASE_URL}/surveys/${surveyId}/questions/${questionId}/answerVariants/${id}`, { + ...createRequestConfig('PUT'), + body: JSON.stringify({ + surveyId: surveyId, + questionId: questionId, + id: id + }) + }) + if (!response.ok) { + throw new Error(`Ошибка: ${response.status}`); + } + return await handleResponse(response) + } + catch(err){ + console.error(`Error updating the response option: ${err}`); + } +} + +export const deleteAnswerVariant = async (surveyId: number, questionId: number, id: number) => { + const token = localStorage.getItem("token"); + if (!token) { + throw new Error('Токен отсутствует'); + } + try{ + const response = await fetch(`${BASE_URL}/surveys/${surveyId}/questions/${questionId}/answerVariants/${id}`, { + ...createRequestConfig('DELETE'), + }) + const responseData = await handleResponse(response); + if (response.ok && !responseData){ + return {success: true}; + } + return responseData; + } + catch(err){ + console.error(`Error deleting a answer: ${err}`); + throw err; + } +} \ No newline at end of file diff --git a/SurveyFrontend/src/api/AuthApi.ts b/SurveyFrontend/src/api/AuthApi.ts index 4b0b45b..26e2821 100644 --- a/SurveyFrontend/src/api/AuthApi.ts +++ b/SurveyFrontend/src/api/AuthApi.ts @@ -10,16 +10,10 @@ interface IRegistrationData extends IAuthData{ firstName: string; lastName: string; } -// -// interface IUserData{ -// username: string; -// firstName: string; -// lastName: string; -// email: string; -// } export const getCurrentUser = async (): Promise => { const token = localStorage.getItem("token"); + if (!token) { throw new Error("Токен отсутствует"); } @@ -32,6 +26,8 @@ export const getCurrentUser = async (): Promise => { } }); + console.log(response); + if (response.status === 401) { localStorage.removeItem("token"); throw new Error("Сессия истекла. Пожалуйста, войдите снова."); diff --git a/SurveyFrontend/src/api/BaseApi.ts b/SurveyFrontend/src/api/BaseApi.ts index 2041e4f..6a85675 100644 --- a/SurveyFrontend/src/api/BaseApi.ts +++ b/SurveyFrontend/src/api/BaseApi.ts @@ -20,12 +20,10 @@ const createRequestConfig = (method: string, isFormData: boolean = false): Reque headers: {}, }; - // Добавляем заголовок авторизации, если есть токен if (token) { config.headers.Authorization = `Bearer ${token}`; } - // Добавляем Content-Type, если это не FormData if (!isFormData) { config.headers["Content-Type"] = "application/json"; } @@ -39,12 +37,16 @@ const createRequestConfig = (method: string, isFormData: boolean = false): Reque * @returns Распарсенные данные или ошибку */ const handleResponse = async (response: Response) => { - // Проверяем, есть ли контент в ответе const responseText = await response.text(); if (!responseText) { + if (response.status === 401) { + window.location.href = '/auth/login'; + throw new Error('Требуется авторизация'); + } + if (response.ok) { - return null; // Если ответ пустой, но статус 200, возвращаем null + return null; } throw new Error(`HTTP ${response.status}: ${response.statusText}`); } diff --git a/SurveyFrontend/src/api/QuestionApi.ts b/SurveyFrontend/src/api/QuestionApi.ts index 0d80838..d42fc17 100644 --- a/SurveyFrontend/src/api/QuestionApi.ts +++ b/SurveyFrontend/src/api/QuestionApi.ts @@ -5,14 +5,16 @@ export interface INewQuestion{ questionType: string; } +export interface IAnswerVariant{ + id: number; + questionId: number; + text: string; +} + export interface IQuestion extends INewQuestion { id: number; surveyId: number; - answerVariants: Array<{ - id: number; - questionId: number; - text: string; - }> + answerVariants: IAnswerVariant[]; } export const addNewQuestion = async (surveyId: number, question: INewQuestion) => { diff --git a/SurveyFrontend/src/components/QuestionsList/QuestionsList.tsx b/SurveyFrontend/src/components/QuestionsList/QuestionsList.tsx index 9cf1fed..3162a33 100644 --- a/SurveyFrontend/src/components/QuestionsList/QuestionsList.tsx +++ b/SurveyFrontend/src/components/QuestionsList/QuestionsList.tsx @@ -13,12 +13,16 @@ export interface Question { id: number; text: string; questionType: 'singleanswerquestion' | 'multipleanswerquestion'; + answerVariants?: { + id?: number; + text: string; + }[]; } const QuestionsList: React.FC = ({questions, setQuestions, surveyId}) => { const [selectedType, setSelectedType] = useState<'single' | 'multiply'>('single'); - const [localQuestionId, setLocalQuestionId] = useState(1001); // Начинаем с 2, так как первый вопрос имеет ID=1 + const [localQuestionId, setLocalQuestionId] = useState(2); const handleAddQuestion = () => { const newQuestion: Question = {