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