Skip to content

nonwander/manydates-api

Repository files navigation

Dating-Site-API

API-сервис для сайта знакомств.
Хост развернутого проекта: http://2.57.187.13/



Концепция

  1. Пользователи регистрируются и проходят авторизацию по логину и паролю.
  2. Модели пользователей имеют обязательные поля:
    аватар | пол | имя и фамилия | электронная почта | долгота и широта
    *на картинку аватара при регистрации накладывается водяной знак.
  3. Авторизованные пользователь должны иметь возможность:
    1) отмечать понравившихся пользователей. Если возникает взаимная
    симпатия, то на емеил обоих отправляется уведомление об этом.
    2) выводить и фильтровать список всех пользователей по полу, имени,
    фамилии, а также выводить пользователей в пределах заданной дистанции.
  4. Запросы к БД должны быть оптимизированы.

Краткое описание проекта

Особенности

  • Полная интеграция с Docker Compose для продакшн и локальной разработки.
  • HTTP-сервер Docker на базе Nginx.
  • WSGI-сервер Gunicorn.
  • Django REST API backend.
  • Кэширование в контейнере Docker с Redis.
  • Автоматическая интерактивная документация Swagger, совместимая открытыми стандартами для API: Open API и JSON Schema.
  • Автоматическая генерация DJANGO SECRET KEY при развертывании проекта.
  • Безопасное хэширование паролей по умолчанию.
  • Расширения PostGIS для базы данных сразу встроены в docker-образ.
  • Включен CORS.
  • Интеграция с Sentry.
  • GitHub CI/CD (непрерывная интеграция и развертывание).
  • Сервис использует SMPT-сервер mail.ru
  • Заполнение базы данных фиктивными данными одной командой.

    Перспективные доработки проекта

  • Настроить оптимальное логгирование.
  • Поставить проект при развертывании на "колёса" - python wheels.
  • Перенести и спрятать админку.
  • Улучшить web-безопасность сервиса.
  • Добавить интеграцию frontend.
  • Добавить балансировку нагрузки между интерфейсом и бэкендом с помощью Traefik.
  • Создать demo-фронтенд в отдельном контейнере.

    Технологии

    Django 4.0.2
    Django REST framework 3.13.1
    Python 3.10.5
    Redis 4.2.2
    

    Запуск и работа с проектом

    Разворачиваем проект

    1. На GitHub делаем себе fork и клонируем репозиторий через протокол HTTPS или SSH (не забываем создать виртуальное окружение), например:
    git clone https://github.com/<your-github-profile>/dating-site
    1. Создаём файлы с секретами .env.db, .env.local и .env.prod из копий .env.example и .env.db.example в папке проекта ./.envs/
    2. Собраем контейнеры локально:
    docker-compose -f docker-compose.local.yaml up -d --build

    Или на хосте:

    docker-compose -f docker-compose.prod.yaml up -d --build

    При успешном создании контейнеров в терминале должен быть статус в терминале:

        Successfully tagged dating-site_nginx:latest
        Creating dating-site_db_1    ... done
        Creating dating-site_redis_1 ... done
        Creating dating-site_web_1   ... done
        Creating dating-site_nginx_1 ... done
        Attaching to dating-site_db_1, dating-site_redis_1, dating-site_web_1, dating-site_nginx_1
    

    Тестирование API

    Можно использовать встроенный Swagger или направить HTTP-запросы в соответствии с правами доступа и эндпоинтам через любой инструмент тестирования.
    Для созданя фиктивных данных исользуйте команду управления manage.py:

    python manage.py dummy_data_maker

    Ресурсы сервиса

    На сервисе доступны эндпоинты:

    1. Регистрация нового клиента: /api/clients/create/

    2. Оценивание участником другого участника: /api/clients/{client_id}/match/

    3. Просмотр списка участников: /api/list/

    Фильтрация списка

    Фильтрацию списка можно произвести по полу, имени, фамилии,
    а также фильтровать участников в пределах заданной дистанции
    относительно авторизованного пользователя.

    Для фильтрации списка участников используйте ключи в соотвествии с таблицей:

    Фильтр Ключ
    по полу: /?gender=
    по имени: /?first_name=
    по фамилии: /?last_name=
    по дистанции, км: /?get_in_distance_km=

    Права доступа к ресурсам сервиса

    В проекте использована базовая авторизация: по логину и паролю.

    Неавторизованные участники могут:

    - создать аккаунт
    

    Авторизованные участники могут:

    - входить в систему под своим логином и паролем;
    - оценивать других участников;
    - просматривать и фильтровть список участников.
    

    Примеры запросов к API

    Запросы к API начинаются с «/api/»

    1. Регистрация участника:
      POST-запрос:
      /clients/create/


    Request sample:

    {
        "email": "man0@fake.ru",
        "username": "man0",
        "password": "pass_man",
        "first_name": "name0",
        "last_name": "surname0",
        "avatar": "avatar.jpg",
        "gender": "М",
        "longitude": 36.57912284676751,
        "latitude": 50.61301720349709
    }

    Response sample (201):

    {
        "id": 2,
        "username": "man0",
        "email": "man0@fake.ru",
        "first_name": "man0",
        "last_name": "man0",
        "avatar": "https://manydates.ml/media/clients/avatar.jpg",
        "gender": "М",
        "is_match": false,
        "longitude": 36.57912284676751,
        "latitude": 50.61301720349709
    }

    Response sample (400):

    {
        "email": [
            "пользователь с таким e-mail уже существует."
        ],
        "username": [
            "Обязательное поле."
        ]
    }
    1. Создание отметки у участника:
      GET-запрос:
      /clients/2/match/


    Response sample: (200)

    {
        "follower": 1,
        "person": 2
    }
    1. Удаление отметки у участника:
      DELETE-запрос:
      /clients/2/match/


    Response sample: (204)

    <no content>
    1. Фильтр по списку участников:
      GET-запрос:
      /list/?gender=М&first_name=man0&last_name=man0


    Response sample: (200)

    [
        {
            "id": 2,
            "username": "man0",
            "email": "man0@fake.ru",
            "first_name": "man0",
            "last_name": "man0",
            "avatar": "https://manydates.ml/media/clients/man_symbol.jpg",
            "gender": "М",
            "is_match": false,
            "longitude": 36.57912284676751,
            "latitude": 50.61301720349709
        }
    ]


    Автор проекта


    Немыкин Евгений
    nonwander@gmail.com
    Telegram: @nonwander


  • About

    API for Dating Site

    Topics

    Resources

    License

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

    No packages published