Проект представляет собой API для управления клиентами, их регистрацией и авторизацией, а также предоставлением функций, связанных с геолокацией. Сервис позволяет пользователям регистрироваться, входить в систему, управлять токенами доступа, получать информацию о других клиентах поблизости и рассчитывать расстояние между двумя заданными точками. Структура API
API включает следующие основные эндпоинты:
/clients/create
Описание: Регистрация нового клиента.
Метод: POST
Тело запроса: Данные клиента, такие как имя, фамилия, электронная почта, пароль, пол, координаты и аватар.
Ответы:
201: Успешная регистрация.
400, 422, 500: Ошибки валидации или другие ошибки на сервере.
/clients/{id}/match
Описание: Создание связи между пользователем и целевым пользователем с заданным ID.
Метод: POST
Параметры: ID пользователя.
Ответы:
201: Связь успешно создана.
401, 422, 429, 500: Ошибки аутентификации, валидации или серверные ошибки.
/auth/login
Описание: Вход пользователя в систему. Устанавливает refresh_token в cookies.
Метод: POST
Тело запроса: Данные пользователя (имя и пароль).
Ответы:
200: Успешный вход, выдаются токены доступа.
401, 422, 500: Ошибки аутентификации или серверные ошибки.
/auth/token
Описание: Обновление токенов доступа с использованием refresh_token.
Метод: PATCH
Требования: Наличие cookie refresh_token.
Ответы:
201: Токены успешно обновлены.
401, 500: Ошибки аутентификации или серверные ошибки.
/auth/logout
Описание: Выход из системы, удаление токена пользователя.
Метод: DELETE
Требования: Cookie refresh_token и авторизация Bearer.
Ответы:
200: Успешный выход.
500: Ошибки на сервере.
/list
Описание: Получение списка клиентов, находящихся поблизости от аутентифицированного пользователя.
Метод: POST
Параметры: Радиус поиска, точность расчета расстояний, сортировка.
Ответы:
200: Успешный ответ с коллекцией пользователей.
401, 500, 404, 304: Ошибки аутентификации, валидации или серверные ошибки.
/distance
Описание: Расчет расстояния между двумя точками.
Метод: POST
Тело запроса: Координаты двух точек (location_a и location_b).
Ответы:
200: Успешный расчет расстояния.
500, 422: Ошибки сервера или валидации.
Основные модели:
Body_create_client_clients_create_post
: Модель данных для создания нового клиента.Body_login_form_auth_login_post
: Модель данных для входа пользователя.DistanceRequest
: Модель данных для расчета расстояния между двумя точками.DistanceResponse
: Результат расчета расстояния в километрах.Status
: Модель успешного ответа.TokenAuth
: Модель токенов авторизации и обновления.User
иUsersCollection
: Модели данных для отображения информации о клиентах, включая данные о расстоянии.
Для обеспечения безопасности используются следующие схемы аутентификации:
OAuth2PasswordBearer: Для управления аутентификацией через пароль.
APIKeyCookie: Используется для хранения и обновления токена в cookies.
HTTPBearer: Используется для передачи Bearer токена.
Установка и запуск проекта
git clone https://github.com/Miron-Anosov/MeetUpAPI.git
openssl genrsa -out jwt-private.pem 2048
openssl rsa -in src/certs/jwt-private.pem -outform PEM -pubout -out jwt-public.pem
- Создаем
.env
- Вписываем чувствительные данные в
.env
по шаблону.env.template
- В том числе сгенерированные ключи в соответсвующее поля.
cd ./.;
docker compose up -d
Примеры запросов
Регистрация пользователя:
POST /clients/create
Content-Type: multipart/form-data
Body:
{
"first_name": "Имя",
"last_name": "Фамилия",
"email": "[email protected]",
"password": "password",
"password_control": "password",
"sex": "M"
}
Получение списка пользователей поблизости:
POST /list?radius=5000
Authorization: Bearer <token>
Примечания
- Все запросы к защищенным эндпоинтам требуют аутентификации.
- При необходимости можно управлять уровнями разрешения доступа и токенами, настраивая их под задачи приложения.
- Регистрация нового участника с асинхронной обработкой аватарки и наложением водяного знака.
- Оценка участников с возможностью взаимной симпатию и отправкой email уведомлений.
- Фильтрация списка участников по полу, имени, фамилии и сортировка по дате регистрации.
- Расчет дистанции между участниками с использованием координат (широта/долгота), фильтрация по дистанции
- Кэширование для улучшения производительности при повторных запросах.