Необходимо разработать API для блога на Node.js
Приложение представляет собой страницу, на которой могут делать записи любые авторизованные пользователи.
-
Необходимо реализовать регистрацию и авторизацию пользователя, а также проверку JWT-токена при внесении записей на страницу
-
Запись блога содержит:
-
Дата записи
-
Сообщение: может содержать как текст, так и медиа
-
Автор сообщения
-
-
На странице с записями должна быть реализована пагинация, на каждой странице (пагинации) должно отображаться по 20 записей
-
Автор записи может редактировать или удалять запись
-
Базу данных необходимо заполнить стартовыми записями
-
Необходимо выполнить деплой сервера для публичного доступа
-
Необходимо написать документацию к эндпоинтам (вручную или сгенерировать из кода)
- База данных может быть PostgreSQL или MongoDB
- Возможность express
- Библиотеки для работы с ORM
- TypeScript (будет плюсом)
- Nuxt.js / Next.js
Приложение представляет собой API-сервис для создания блога. В нём реализованы функции регистрации и авторизации пользователя, создания постов, которые могут включать текст и медиафайлы (изображения, аудио, видео). Информация по работе с запросами приведена ниже.
Используемые технологии: Node.js, Express.js, PostgreSQL
Сервер запущен на http://80.78.240.158
/*REQUEST*/
{
url: 'auth/registr'
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
},
body: {
email: string,
password: string,
firstName: string,
lastName: string,
}
}
/*RESPONSE*/
{
id: number,
email: string,
firstName: string,
lastName: string,
token: string,
}
/*REQUEST*/
{
url: 'auth/login'
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
},
body: {
email: string,
password: string,
},
}
/*RESPONSE*/
{
id: number,
email: string,
firstName: string,
lastName: string,
token: string,
}
/*REQUEST*/
{
url: 'auth/logout'
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'access-token': string,
},
}
/*RESPONSE*/
User logout
Пост можно создать как с прикреплённым файлом, так и без него.
Если создавать пост с файлом, то сначала нужно загрузить файл на сервер как описано в разделе "Загрузка файла", а потом полученный ID файла указать в поле fileId
.
/*REQUEST*/
{
url: 'post/create'
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'access-token: string,
},
body: {
message: string,
fileId: number (not required),
},
}
/*RESPONSE*/
{
id: number,
message: string,
UserId: number,
updatedAt: string,
createdAt: string,
}
Если в посте нужно изменить прикреплённый файл, то необходимо в теле запроса передать ID удаляемого и загружаемого файлов (prevFileId
и newFileId
соответственно).
/*REQUEST*/
{
url: 'post/update'
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'access-token: string,
},
body: {
postId: number,
message: string,
prevFileId: number,
newFileId: number,
},
}
/*RESPONSE*/
{
id: number,
message: string,
UserId: number,
updatedAt: string,
createdAt: string,
}
Список постов выводится с пагинацией (20 постов в одном запросе). Необходимо передать аргумент page
- номер страницы.
/*REQUEST*/
{
url: 'post/list?page={number}'
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
}
/*RESPONSE*/
{
count: number,
rows: [
{
id: 5,
message: string,
createdAt: string,
updatedAt: string,
"UserId": number,
"Files": [
{
id: number,
name: string,
path: string,
createdAt: string,
updatedAt: string,
PostId: number,
}
]
}
...
]
}
/*REQUEST*/
{
url: 'post/delete'
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'access-token: string,
},
body: {
postId: number,
}
}
/*RESPONSE*/
Removed
Поддерживаемые типы файлов:
- Изображения (jpg, jpeg, png)
- Видео (mp4)
- Аудио (mp3)
/*REQUEST*/
{
url: 'file/upload'
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
'Access-Control-Allow-Origin': '*',
'access-token': string,
},
body: {
file: FileInput,
}
}
/*RESPONSE*/
{
id: number,
name: string,
path: string,
PostId: null
}