API - TheRecoveryTeam/TheQuests GitHub Wiki

Содержание

Условности

  • Все пути начинаются с перфикса /api/

User

POST /user.create

Как осуществляется регистрация пользователя

Первым запросом идет /user.create c нижеописанными данными, в ответ возвращается id пользователя. Поскольку nickname осуствует, нужно его задать, отправив запрос /user.edit, задав nickname;

Request
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';
}

GET /user.find_email

query params

interface Request {
	email: string;
}
  • В случае, если такой email занят, возвращается 201 🍏
  • Если такой email отсутствует в базе, возвращается 404 🍎

GET /user.find_nickname

query params

interface Request {
	nickname: string;
}
  • В случае, если такой nickname занят, возвращается 201 🍏
  • Если такой nickname отсутствует в базе, возвращается 404 🍎

POST /user.login

interface UserLoginRequest {
	email: string;
	password: string;
}

interface UserLoginReponseSuccess {
	id: string;
	email: string;
	nickname: string;
	token: string;
	avatarPath?: string;
}

// Интерфейс ошибок
interface UserLoginResponse400 {
	// Если неверный логин или пароль
	passwordError?: 'INCRORRECT_CREDENTIALS';
}

GET /user.login_oauth2

// Изначально то, что приходит после редиректа
interface Request {
	code: string;
}

interface Response {
	id: string;
	nickname: string;
	token: string;
	avatarPath?: string;
}

POST /user.logout

Requst Empty
Response OK 🍏

POST /user.edit

Request
interface UserEditRequest {
	nickanme: string;
}

// Поскольку фронт знает, какие данные отправлял, то в ответ достаточно отправить пустое тело ответа с кодом 201, это будет означать, что заданный nickname успешно записан
interface UserEditResponseSuccess {
	// empty	
}

interface UserEditResponseError400 {
	nicknameError?: 'INCORRECT' | 'ALREADY_TAKEN'
}

POST /user.password_edit

Request
{
	"password": "example123",
	"newPassword": "example321New"
}
Response OK 🍏
{
	"token": "example123token"
}

Quest

POST /quest.create

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;
}

POST /quest.destroy

interface Request {
	id: string;
}
interface ResponceOK {}
interface ResponceError {
	code: string;
	message: string;
}

POST /quest.edit

interface Request {
	id: string;
	title: string; // new title
	description: string; // new description
}
interface ResponseOK {}

POST /quest.edit_image

multipart/form-data

interface Request {
	id: string;
	image: File;
}
interface ResponseOK {
	imagePath: string;
}

GET /quest.detail

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';
}

GET /quest.resources

query params

interface Request {
	id: string;
}

interface ResourceItem {
	name: string;
}

// Возвращает ресурсы текущего пользователя по данному квесту. Если квест еще не начат, то начальные ресурсы.
interface ResponseOK {
	resources: Array<ResourceItem>
}

GET /quest.list

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;
}

Card

POST /card.add

// TODO

POST /card.edit

// 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

POST /card.remove

// TODO

GET /card.get

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';
}

POST /card.do_answer

interface Request {
	id: string;
	answer: string;
}

interface ResponseOK {
	nextCardId: string | null;
	resources: Array<{
		answer: string;
		value: number;
	}>;
}

GET /card.list

query params

interface Request {
	questId: string;
}

interface CardShort {
	id: stirng;
	title: string;
	description?: string;
	imagePath?: string;
}

interface ResponseOK {
	cards: Array<CardShort>;
}

POST /card.links_upsert

// TODO

⚠️ **GitHub.com Fallback** ⚠️