{"id":14986535,"url":"https://github.com/a-menshikov/ylab_fastapi_project","last_synced_at":"2025-07-05T20:02:07.102Z","repository":{"id":183431222,"uuid":"668874732","full_name":"a-menshikov/YLab_Fastapi_project","owner":"a-menshikov","description":"Проект выполнен в рамках интенсива Python от компании Y_lab. По результатам выполнения и техсобеса принят на стажировку в компанию Y_lab","archived":false,"fork":false,"pushed_at":"2023-10-31T06:35:26.000Z","size":179,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-11T22:52:41.315Z","etag":null,"topics":["async","celery","docker","docker-compose","open-api","pydantic","pytest","python","rabbitmq","redis","sqlalchemy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/a-menshikov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2023-07-20T19:52:33.000Z","updated_at":"2024-08-27T18:31:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"d47d4267-0ae8-4a72-9ea0-6112848ce9a5","html_url":"https://github.com/a-menshikov/YLab_Fastapi_project","commit_stats":{"total_commits":127,"total_committers":2,"mean_commits":63.5,"dds":"0.015748031496062964","last_synced_commit":"b4da279bd57eb7448203d098b8179b5f88c5dd6f"},"previous_names":["a-menshikov/ylab_fastapi_project"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a-menshikov%2FYLab_Fastapi_project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a-menshikov%2FYLab_Fastapi_project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a-menshikov%2FYLab_Fastapi_project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a-menshikov%2FYLab_Fastapi_project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/a-menshikov","download_url":"https://codeload.github.com/a-menshikov/YLab_Fastapi_project/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248492956,"owners_count":21113162,"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":["async","celery","docker","docker-compose","open-api","pydantic","pytest","python","rabbitmq","redis","sqlalchemy"],"created_at":"2024-09-24T14:13:06.082Z","updated_at":"2025-04-11T22:52:46.235Z","avatar_url":"https://github.com/a-menshikov.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YLab_Fastapi_project\n\nПроект выполнен в рамках интенсива от Y_Lab. Проходил в июле-августе 2023г. Состоял из 4-х заданий.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eЗАДАНИЯ:\u003c/b\u003e\u003c/summary\u003e\n\n1. Написать проект на FastAPI с использованием PostgreSQL в качестве БД. В проекте следует реализовать REST API по работе с меню ресторана, все CRUD операции. Даны 3 сущности: Меню, Подменю, Блюдо.\n\n    Зависимости:\n    - У меню есть подменю, которые к ней привязаны.\n    - У подменю есть блюда.\n\n    Условия:\n    - Блюдо не может быть привязано напрямую к меню, минуя подменю.\n    - Блюдо не может находиться в 2-х подменю одновременно.\n    - Подменю не может находиться в 2-х меню одновременно.\n    - Если удалить меню, должны удалиться все подменю и блюда этого меню.\n    - Если удалить подменю, должны удалиться все блюда этого подменю.\n    - Цены блюд выводить с округлением до 2 знаков после запятой.\n    - Во время выдачи списка меню, для каждого меню добавлять кол-во подменю и блюд в этом меню.\n    - Во время выдачи списка подменю, для каждого подменю добавлять кол-во блюд в этом подменю.\n\n2. В этом домашнем задании необходимо:\n\n    Обернуть программные компоненты в контейнеры. Контейнеры должны запускаться по одной команде “docker-compose up -d” или той которая описана вами в readme.md.\n\n    Образы для Docker:\n    - (API) python:3.10-slim\n    - (DB) postgres:15.1-alpine\n\n    - Написать CRUD тесты для ранее разработанного API с помощью библиотеки pytest\n    - Подготовить отдельный контейнер для запуска тестов. Команду для запуска указать в README.md\n\n3. В этом домашнем задании необходимо:\n\n    - Вынести бизнес логику и запросы в БД в отдельные слои приложения.\n    - Добавить кэширование запросов к API  с использованием Redis. Не забыть про инвалидацию кэша.\n    - Добавить pre-commit хуки в проект.\n    - Покрыть проект type hints (тайпхинтами)\n    - Описать ручки API в соответствий c OpenAPI\n    - Реализовать в тестах аналог Django reverse() для FastAPI\n\n    Дополнительно:\n\n    - Контейнеры с проектом и с тестами запускаются разными командами.\n\n4. В этом домашнем задании необходимо:\n\n    - Переписать текущее FastAPI приложение на асинхронное выполнение\n    - Добавить в проект фоновую задачу с помощью Celery + RabbitMQ.\n    - Добавить эндпоинт (GET) для вывода всех меню со всеми связанными подменю и со всеми связанными блюдами.\n    - Реализовать инвалидация кэша в background task (встроено в FastAPI)\n    - Блюда по акции. Размер скидки (%) указывается в столбце G файла Menu.xlsx\n\n    Фоновая задача:  \n    Синхронизация Excel документа и БД. В проекте создаем папку admin. В эту папку кладем файл Menu.xlsx (будет прикреплен к ДЗ). При внесении изменений в файл все изменения должны отображаться в БД. Периодичность обновления 15 сек. Удалять БД при каждом обновлении – нельзя.\n\n\u003c/details\u003e\n\n## Запуск\n\n### **Запуск проекта с полным функционалом**\n\n1. Клонировать репозиторий\n\n    ```bash\n    git clone \u003cссылка с git-hub\u003e\n    ```\n\n2. Перейти в папку /YLab_Fastapi_project\n\n3. Требуется файл .env - пример в репозитории. Для пробного запуска можно использовать приложенный пример.\n\n4. Поднять контейнеры в фоновом режиме\n\n    ```bash\n    docker compose up -d\n    ```\n\n5. Чтобы прекратить работу контейнеров воспользуйтесь командой\n\n    ```bash\n    docker compose down\n    ```\n\n    Если хотите прекратить работу контейнеров с удалением томов (рекомендуется), то дополните команду флагом -v\n\n    ```bash\n    docker compose down -v\n    ```\n\n6. Документация доступна по адресу \u003chttp://127.0.0.1:8000/docs\u003e\n\n### **Запуск проекта с прохождением тестов через pytest**\n\nДля прогона написанных мной тестов подготовлен отдельный вариант файла docker compose.\nСценарий тестирования предполагает старт контейнеров, вывод результатов прохождения тестов на экран и удаление контейнеров вместе с томами.\n\nЕсли проект был запущен локально раньше, то для стабильного запуска по данной инструкции необходимо остановить ранее запущенный сервис, удалить контейнеры, тома и образы, которые использовались для него.\n\nТребуется файл .env_test - пример в репозитории. Для пробного запуска можно использовать приложенный пример. Переменная CELERY_STATUS должна быть в положении \"false\".\n\n1. Для запуска сценария необходимо после клонирования репозитория выполнить в папке /YLab_Fastapi_project следующую команду\n\n    ```bash\n    docker compose -f docker-compose-pytest.yml up -d \u0026\u0026 docker logs --follow backend \u0026\u0026 docker compose -f docker-compose-pytest.yml down -v\n    ```\n\n## Контакты\n\n**telegram** [@Menshikov_AS](https://t.me/Menshikov_AS)  \n**e-mail** \u003ca.menshikov1989@gmail.com\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa-menshikov%2Fylab_fastapi_project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fa-menshikov%2Fylab_fastapi_project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa-menshikov%2Fylab_fastapi_project/lists"}