API - TheRecoveryTeam/TheQuests GitHub Wiki
- Условности
- User
- Quest
- Card
- Scoreboard
- Все пути начинаются с перфикса
/api/
Как осуществляется регистрация пользователя
Первым запросом идет /user.create
c нижеописанными данными, в ответ возвращается id пользователя. Поскольку nickname
осуствует, нужно его задать, отправив запрос /user.edit
, задав nickname
;
interface UserCreateRequest {
email: string;
password: string;
nickname: string;
}
interface UserCreateResponseSuccess {
id: string;
token: string;
}
// Интерфейс ошибок
// Если ошибки в данном поле нет, то это значит, что оно было заполнено корректно
// Если какая-то неизвестная ошибка, то отдается пустой объект ошибки, а на фронте что-то отобразиться логичное должно
interface UserCreateResponse400 {
// если на бэк отпралены пустые поля, то достаточно вернуть INCORRECT код
emailError?: 'INCORRECT' | 'ALREADY_TAKEN';
nickname?: 'INCORRECT' | 'ALREADY_TAKEN';
passwordError?: 'INCORRECT';
}
query params
interface Request {
email: string;
}
- В случае, если такой email занят, возвращается 201 🍏
- Если такой email отсутствует в базе, возвращается 404 🍎
query params
interface Request {
nickname: string;
}
- В случае, если такой nickname занят, возвращается 201 🍏
- Если такой nickname отсутствует в базе, возвращается 404 🍎
interface UserLoginRequest {
email: string;
password: string;
}
interface UserLoginReponseSuccess {
id: string;
email: string;
nickname: string;
token: string;
avatarPath?: string;
}
// Интерфейс ошибок
interface UserLoginResponse400 {
// Если неверный логин или пароль
passwordError?: 'INCRORRECT_CREDENTIALS';
}
// Изначально то, что приходит после редиректа
interface Request {
code: string;
}
interface Response {
id: string;
nickname: string;
token: string;
avatarPath?: string;
}
interface UserEditRequest {
nickanme: string;
}
// Поскольку фронт знает, какие данные отправлял, то в ответ достаточно отправить пустое тело ответа с кодом 201, это будет означать, что заданный nickname успешно записан
interface UserEditResponseSuccess {
// empty
}
interface UserEditResponseError400 {
nicknameError?: 'INCORRECT' | 'ALREADY_TAKEN'
}
{
"password": "example123",
"newPassword": "example321New"
}
{
"token": "example123token"
}
multipart/form-data
interface Request {
title: string;
description: string;
image: File;
resources: Array<string>;
}
interface ResponseOK {
id: string;
title: string;
description: string;
imagePath: string;
resources: array<string>;
firstCardId: string | null;
authorNickname: string;
playerCount: number;
}
interface ResponceError {
code: string;
message: string;
}
interface Request {
id: string;
}
interface ResponceOK {}
interface ResponceError {
code: string;
message: string;
}
interface Request {
id: string;
title: string; // new title
description: string; // new description
}
interface ResponseOK {}
multipart/form-data
interface Request {
id: string;
image: File;
}
interface ResponseOK {
imagePath: string;
}
query params
interface Request {
id: string;
}
interface ResponseOK {
id: string;
title: string;
description: string;
imagePath: string;
currCardId: string | null; // Если квест завершен, то Id первой карточки
authorNickname: string | null;
playerCount: number;
stage?: 'progress' | 'end';
}
query params
interface Request {
id: string;
}
interface ResourceItem {
name: string;
}
// Возвращает ресурсы текущего пользователя по данному квесту. Если квест еще не начат, то начальные ресурсы.
interface ResponseOK {
resources: Array<ResourceItem>
}
query params
interface Request {
page: number;
limit: number; // Max - 20
authorId?: string;
asc?: boolean; // Если true, то от старых к новым
stage?: 'progress' | 'end'; // Если не указано, то данный фильтр не применяется
}
interface QuestShort {
id: string;
title: string;
description: string;
authorNickname: string;
playerCount: number;
imagePath?: string;
}
interface ResponseOK {
quests: Array<QuestShort>;
hasMore: boolean;
}
// TODO
// TODO: или Upsert?
interface Request {
// null if create new card
id: string | null;
questId: string;
title: string;
description?: string;
type: 'choose' | 'input' | 'finish';
}
interface ResponseOK {
id: string;
}
// TODO
// TODO
query params
interface Request {
id: string;
}
interface ResponseOK {
id: string;
questId: string;
title: string;
imagePath?: string;
description?: string;
links?: Array<string>; // массив ответов
type: 'choose' | 'input' | 'finish';
}
interface Request {
id: string;
answer: string;
}
interface ResponseOK {
nextCardId: string | null;
resources: Array<{
answer: string;
value: number;
}>;
}
query params
interface Request {
questId: string;
}
interface CardShort {
id: stirng;
title: string;
description?: string;
imagePath?: string;
}
interface ResponseOK {
cards: Array<CardShort>;
}
// TODO