{"id":25545170,"url":"https://github.com/belyashnikovatn/avito-shop","last_synced_at":"2026-04-20T10:03:38.786Z","repository":{"id":277792379,"uuid":"930827186","full_name":"belyashnikovatn/Avito-shop","owner":"belyashnikovatn","description":"Сервис \"Магазин мерча\": тестовое задание для Авито. ","archived":false,"fork":false,"pushed_at":"2025-02-16T05:59:27.000Z","size":403,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-16T06:28:26.781Z","etag":null,"topics":["django-rest-framework","docker","docker-compose","jwt-authentication","nginx","restful-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/belyashnikovatn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-11T09:26:10.000Z","updated_at":"2025-02-16T05:59:30.000Z","dependencies_parsed_at":"2025-02-16T06:38:31.175Z","dependency_job_id":null,"html_url":"https://github.com/belyashnikovatn/Avito-shop","commit_stats":null,"previous_names":["belyashnikovatn/avito-shop"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2FAvito-shop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2FAvito-shop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2FAvito-shop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2FAvito-shop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/belyashnikovatn","download_url":"https://codeload.github.com/belyashnikovatn/Avito-shop/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239800429,"owners_count":19699128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django-rest-framework","docker","docker-compose","jwt-authentication","nginx","restful-api"],"created_at":"2025-02-20T08:18:07.230Z","updated_at":"2026-02-09T03:30:19.484Z","avatar_url":"https://github.com/belyashnikovatn.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Avito-shop\nСервис для магазина мерча, где сотрудники могут приобретать товары за монеты. Каждому новому сотруднику выделяется 1000 монет, которые можно использовать для покупки товаров. Кроме того, монеты можно передавать другим сотрудникам в знак благодарности или как подарок. Подробное ТЗ находится [здесь](https://github.com/avito-tech/tech-internship/blob/main/Tech%20Internships/Backend/Backend-trainee-assignment-winter-2025/Backend-trainee-assignment-winter-2025.md)\n\n## Важное перед проверкой проекта\n- В задании указано реализовать эндпоинт `/api/buy/{item}` через метод `get`. Но мною было принято решение использовать `post` метод. Это не влияет на логику сервиса, но, на мой взгляд, больше соответствует принципам REST. \n- Для проекта используются переменные окружения. Обычно предоставляют файл `.env_example` в качестве примера для заполнения файла `.env`. Но поскольку проект реализован в качестве тестового задания, `.env` лежит в открытом доступе в целях быстрого запуска. \n- Для настройки линтера используется конфигурационный файл `setup.cfg`\n\n[Сразу перейти к запуску через докер](#запуск-проекта-в-контейнерах)  \n[Глянуть на реализацию тестирования](#тестирование)  \n[Посмотреть на примеры работы сервиса](#примеры-работы-сервиса)\n\n## Содержание\n- [Технологии](#технологии)\n- [Задачи](#задачи)\n- [Функционал](#функционал)\n- [Проектирование](#проектирование)\n- [Уровень моделей](#уровень-моделей)\n- [Уровень сериализаторов](#уровень-сериализаторов)\n- [Уровень представлений](#уровень-представлений)\n- [Тестирование](#тестирование)\n- [Настройка деплоя](#настройка-деплоя)\n- [Запуск проекта в режиме разработки](#запуск-проекта-в-режиме-разработки)\n- [Запуск проекта в контейнерах](#запуск-проекта-в-контейнерах)\n- [Примеры работы сервиса](#примеры-работы-сервиса)\n- [Дополнительно](#дополнительно)\n\n## Технологии\nPython 3.9, Django, DRF, SQLite (на время разработки)  \nDocker, Gunicorn, nginx, Postgres (для продакшена)  \nБиблиотека pytest для тестирования  \nБиблиотека python-dotenv для загрузки переменных окружения   \nВсе требования к установке описаны в `avito_shop/requirements.txt` \n\n## Задачи\n- [x] Спроектировать модель данных \n- [x] Создать проект, приложение, настроить среду\n- [x] Выбрать модель для профиля (переписать User)\n- [x] Продумать эндпоинты\n- [x] Создать модели\n- [x] Продумать уровень валидации\n- [x] Продумать уровень логики\n- [x] Разделить настройки на тест и прод среды\n- [x] Настроить контейнеризацию \n- [x] Тестирование\n- [x] Документирование \n\n## Функционал\n### Для пользователя \"Сотрудник\"\n- авторизация\n- просмотр профиля\n- подарить монеты\n- купить мерч\n- просмотреть список мерча\n\n### Для пользователя \"Администратор\"\n- автоматическая загрузка данных\n- панель доступа ко всем данным (при запуске в контейнерах автоматически создаётся админ и загружаются данные в мерч) \n- логирование\n\n## Проектирование\n- Модель данных ERD\n\u003cimg src=\"screens/erdiagram.png\" alt=\"Модель данных ERD\" width=\"600\"\u003e\n\n- Эндпоинты\n\n| url       | method       | что делает      | кто может      |\n|:----------|:----------|:---------:|----------:|\n| `/api/info`   | `get`   | Получить информацию о монетах, инвентаре и истории транзакций.   | Авторизованный свои данные   |\n| `/api/sendCoin` | `post`  | Отправить монеты другому пользователю.  | Авторизованный юзер  |\n| `/api/buy/{item}`  | `post`| Купить предмет за монеты.  |Авторизованный юзер  |\n| `/api/auth`  | `post` | Аутентификация и получение JWT-токена. При первой аутентификации пользователь создается автоматически.  | Любой юзер |\n| `/api/merch`  | `get` | Просмотр всего списка мерча.  |Любой юзер |\n\n\n## Уровень моделей\nСтруктура данных и связи между ними представлены на уровне моделей `avito_shop/api/models.py`. Модели настроены так, чтобы в админке с ними было удобно работать (`verbose_name` и `def __str__`). Краткое описание моделей:  \n- Profile: username, coins(default=1000)\n- Merch: name, price\n- Gift: sender, reciever, amount, datetime\n- Buy: user, merch, datetime \n\n## Уровень сериализаторов\nВалидация данных на входе и на выходе происходит на уровне сериализаторов `avito_shop/api/serializers.py`. Предусмотрены проверки наличия данных, соответствия типам, достаточного количества и других правил (например, нельзя переводить монеты себе).\n\n## Уровень представлений\nЛогика обработки данных происходит на уровне представления `avito_shop/api/views.py`: создание, изменение данных, обработка ошибок, возврат ответа на запрос клиента.\n\n## Тестирование \nВ проекте реализованы unit и e2e-тесты. Тесты находятся в папке `avito_shop/api/pytest-tests`. \nДля тестирования используется библиотека pytest. Для этого необходимо её установить и ещё раскомментировать в файле `.env` строку `DEBUG=true`.\n\nЧтобы установить библиотеки и запустить тесты, выполните следующие команды:\n```bash\npython -m venv venv\nsource venv/Scripts/activate\npython -m pip install --upgrade pip\ncd avito_shop/\npip install -r requirements.txt\ncd api/\npytest\n```\n\nПлан:\n- авторизация \n    - новый пользователь регистрируется\n    - существующий пользователь получает токен\n    - созданный пользователь сразу получает 1000 монет\n    - с пустыми данными регистрация невозможна \n- покупка товара\n    - не авторизованный не может купить товар\n    - нельзя купить несуществующий товар\n    - невозможно купить товар, если денег не хватает\n    - успешная покупка\n- передача монет\n    - успешная передача монеток\n    - нельзя отправить себе\n    - нельзя отправить больше, чем есть\n    - нельзя отправить несуществующему пользователю\n    - нельзя отправить отрицательное или нулевое значение монет\n- e2e тест для покупки мерча\n- e2e тест для передачи монеток\n\nПосле выполнения будет показан результат:\n\u003cimg src=\"screens/test.png\" alt=\"Профиль\" width=\"600\"\u003e\n\n\n## Деплой и запуск\n- Для деплоя используется Docker: `avito_shop/Dockerfile` + `docker-compose.yml`\n- В `docker-compose.yml` прописаны контейнеры для БД `postgres_db`, бэкенда `avito_backend` и прокси-сервера `nginx_proxy`\n- При запуске контейнера бэкенда исполняется файл `run.sh`, в котором выполняются миграции БД, сбор и копирование статики, создание админа и загрузка справочника товаров.\n\n## Запуск проекта в режиме разработки \nСклонируйте проект\n```bash\ngit clone https://github.com/belyashnikovatn/Avito-shop.git\n```\nПерейдите в папку проекта:\n```bash\ncd Avito-shop/\n```\nВыполните команды:\n```bash\npython -m venv venv\nsource venv/Scripts/activate\npython -m pip install --upgrade pip\ncd avito_shop/\npip install -r requirements.txt\npython manage.py migrate\npython manage.py initadmin\npython manage.py loaddata merch.json\npython manage.py runserver\n```\nСервис станет доступным по адресу http://127.0.0.1:8000/api/  \nАдминка станет доступна по адресу http://127.0.0.1:8000/admin/\n\n## Запуск проекта в контейнерах\nСклонируйте проект\n```bash\ngit clone https://github.com/belyashnikovatn/Avito-shop.git\n```\nПерейдите в папку проекта:\n```bash\ncd Avito-shop/\n```\nУбедитесь, что Docker запущен. В корне проекта выполните команду:\n```bash\ndocker-compose up --build  -d\n```\nПосле этого сервис будет доступен по адресу http://localhost:8080/\n\nЭндпоинты:\n- http://localhost:8080/api/merch/\n- http://localhost:8080/api/auth/\n- http://localhost:8080/api/info/\n- http://localhost:8080/api/buy/{item}/\n- http://localhost:8080/api/sendCoin/\n\n\n## Примеры работы сервиса\n\n### Просмотр всех видов мерча (метод доступен всем)\n\u003cimg src=\"screens/api_merch.png\" alt=\"Мерч пусть все видят\" width=\"600\"\u003e\n\n### Получение токена (доступно всем)\n\u003cimg src=\"screens/api_auth.png\" alt=\"Аутентификация\" width=\"600\"\u003e\n\n### Перевод монеток (доступно только авторизованным)\n\u003cimg src=\"screens/api_sendCoin.png\" alt=\"Подарок монет\" width=\"600\"\u003e\n\n### Покупка несуществующего мерча (доступно только авторизованным)\n\u003cimg src=\"screens/api_buy_wrong.png\" alt=\"Покупка несуществующего мотоцикла\" width=\"600\"\u003e\n\n### Покупка существующего мерча (доступно только авторизованным)\n\u003cimg src=\"screens/api_buy_right.png\" alt=\"Покупка худи\" width=\"600\"\u003e\n\n### Просмотр профиля (доступно только авторизованным)\n\u003cimg src=\"screens/api_info.png\" alt=\"Профиль\" width=\"600\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelyashnikovatn%2Favito-shop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbelyashnikovatn%2Favito-shop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelyashnikovatn%2Favito-shop/lists"}