Все эндпоинты начинаются с префикса /api
Реализуется возврат успешного ответа (с кодом 200
) на запрос GET /api/ping
. Содержимое тела ответа при этом не валидируется, возвращается "ok"
.
Есть собственный словарь стран, который используется при регистрации пользователей и может учитываться рекомендательными системами и системой локализации контента.
Про каждую страну известны следующие данные:
{
"name": "полное название",
"alpha2": "двухбуквенный код страны (в верхнем регистре)",
"alpha3": "трехбуквенный код страны",
"region": "географический регион"
}
Реализованы следующие эндпоинты:
-
GET /countries
— получить список доступных стран, доступна фильтрация по регионам. -
GET /countries/{alpha2}
— получить страну по её уникальному двухбуквенному коду.
Данные находятся в таблице countries
, которая имеет следующее определение:
CREATE TABLE countries (
id SERIAL PRIMARY KEY,
name TEXT,
alpha2 TEXT,
alpha3 TEXT,
region TEXT
);
INSERT INTO countries (name, alpha2, alpha3, region) VALUES
('Åland Islands','AX','ALA','Europe'),
('Albania','AL','ALB','Europe'),
...;
Эндпоинт /auth/register
используется для первичной регистрации пользователей.
Сервер поддерживает базу данных пользователей, валидирует запросы и не допускает наличия пользователей с эквивалентными регистрационными данными.
Эндпоинт /auth/sign-in
предназначен для аутентификации пользователя по логину и паролю и генерации сессионного токена,
который в дальнейшем будет использоваться для генерации запросов.
Генерируется JWT токен, который в дальнейшем передается пользователем в заголовке Authorization: Bearer {token}
и приложение понимает, какой пользователь хочет сделать запрос. Время действия токена 12 часов.
Эндпоинт /me/profile
используется для получения и редактирования параметров собственного профиля пользователя. Действие зависит от указанного метода (GET
и PATCH
).
Сервер идентифицирует пользователя по переданному токену. Значение токена подставляется в заголовок Authorization
в формате Bearer {token}
. Например, Authorization: Bearer $deddz$@pp...
.
В запросе на редактирование профиля передаются значения только тех полей, которые необходимо обновить.
Эндпоинт /profiles/{login}
позволяет получить профиль другого пользователя по логину.
Профиль можно получить только если данный пользователь имеет публичный профиль (параметр isPublic
), либо находится у вас в друзьях.
С помощью /me/updatePassword
у пользователя появляется возможность изменить пароль от своего аккаунта.
После изменения пароля:
-
Аутентификация со старым паролем становится невозможной.
-
Все ранее выпущенные токены должны быть отозваны. Использование старых токенов становится равнозначным использованию некорректных токенов.
После успешной смены пароля при попытке получить свой профиль со старым токеном пользователь получает ошибку.
В приложении есть возможность добавлять и удалять других пользователей из списка своих друзей. И конечно же можно посмотреть список своих друзей.
Свойство быть другом — одностороннее. Если Петя добавит Машу в друзья, то профиль Пети становится доступным для Маши, даже если у Пети закрытый профиль.
Чтобы не нагружать сервера и клиенты слишком сильно, в запросах на получение списка друзей используется пагинация.
С помощью параметров offset
и limit
можно "постранично" получить весь список друзей, запрашивая данные порционно.
Запоминается дата и время последнего добавления в друзья для корректной сортировки и пагинации.
Возможность создавать публикации со стороны пользователей. Затрагиваемые эндпоинты:
/posts/new
/posts/{postId}
Сервер должен генерировать уникальные идентификаторы и запоминать время создания публикаций.
У пользователя есть доступ к своим постам, постам пользователей с публичным профилем и постам других пользователей, которые добавили данного пользователя в друзья.
Новостная лента своих или чужих постов.
Есть запросы на /posts/feed/my
и /posts/feed/{login}
(значение my
не может являться логином).
Пользователи могут поставить лайк и дизлайк публикации, к которой у них есть доступ.
Всегда запоминается последняя реакция пользователя. Если пользователь поставил лайк два раза подряд, эффект лайка остается. Если пользователь поставил лайк, а потом дизлайк, остается реакция дизлайка.
В полях likesCount
и dislikesCount
необходимо отражается число лайков и дизлайков публикации, при этом от каждого пользователя учитывается только его самая последняя реакция.
Предоставляет возможность поиска постов по префиксу и тегам. Поиск осуществляется только по тем постам, к которым есть доступ.
cd solution/cmd
systemctl start docker
sudo docker run --name=video-db -e POSTGRES_PASSWORD='qwerty' -p 1337:5432 -d --rm postgres
migrate -path ../migration -database 'postgres://postgres:qwerty@localhost:1337/postgres?sslmode=disable' up
go run main.go server.go