GritsenkoSerge / hammer_systems_task

Hummer Systems test task

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Реферальная система (тестовое задание для Python-разработчика)

Техническое задание

Запуск проекта

Запуск проекта в режиме разработчика

Прод:

swagger

redoc

схема

панель администратор

Описание функционала

Регистрация пользователя /api/v1/auth/signup/

На вход передается номер телефона в произвольном формате (примеры: '+7 913 674 00 00', '8 913-674-0000', '(913) 674-0000') При вызове данной ручки происходит следующее:

  • производится поиск телефона в БД. при отсутствии создается
  • вместе с пользователем создается профиль, для которого создается 6-значный уникальный реферальный код состоящий из цифр и латинских букв, за исключением похожих символов
  • задается пароль* (4 случайные цифры)
  • отправляется SMS с паролем (на данный момент пишется в консоль и добавляется в поле "demo_message" ответа)
  • в случае успеха возвращается телефон и demo_message со сгенерированным цифровым паролем

*если введен телефон администратора, то новый пароль не задается

Аутентификация пользователя /api/v1/auth/login/

На вход подается номер телефона и цифровой код из SMS. При вызове данной ручки происходит следующее:

  • при совпадении кредов создается токен аутентификации
  • задается новый пароль* (таким способом обеспечивается одноразовость кода)
  • в случае успеха возвращается auth_token, который необходимо передавать в остальные ручки в заголовке Authorization (например, Authorization: 'Token 95003ded5b0fef7701b64a8ae968cd652b811b2b')

*если введен телефон администратора, то новый пароль не задается

Выход пользователя (отзыв токена) /api/v1/auth/logout/

  • для вызова требуется авторизация (заголовок Authorization)
  • при успешном выполнении удаляется ранее выданный auth_token

Получение информации о профиле [get] /api/v1/profiles/me/

Для вызова требуется авторизация (заголовок Authorization).

  • возвращает информацию о текущем (авторизованном) профиле.
  • в поле referrals содержится список телефонов пользователей, у которых в профиле указан реферальный код данного профиля.

Пример ответа:

{
    "first_name": "Сергей",
    "last_name": "Гриценко",
    "email": "gritsenko.serge.2013@yandex.ru",
    "referral_code": "KvHTLD",
    "affiliate_code": "",
    "referrals": [
        "+79136745204",
        "+79136745203",
        "+79136745202"
    ]
}

Изменение информации о профиле [patch] /api/v1/profiles/me/

Для вызова требуется авторизация (заголовок Authorization).

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

*здесь и в коде использовал термин 'affiliate', так как более привычный 'referrer', как мне кажется, мог внести путаницу ввиду похожего с 'referral' написания.

TODO

  • на уровне БД запретить задавать affiliate_code значением отсутствующим в referral_code (актуально только для сырых запросов)
  • настроить CI/CD
  • рассмотреть вариант с реферальным кодом в виде отдельной сущности (предварительно: упростится работа через ORM за счет наличия ForeignKey, повысится консистентность)
  • написать unit-тесты

About

Hummer Systems test task

License:MIT License


Languages

Language:Python 96.9%Language:Dockerfile 1.8%Language:Makefile 0.9%Language:Shell 0.4%