{"id":16229305,"url":"https://github.com/djwoms/sup","last_synced_at":"2025-03-19T13:31:42.986Z","repository":{"id":205073053,"uuid":"713351196","full_name":"DJWOMS/sup","owner":"DJWOMS","description":"Система управления проектами","archived":false,"fork":false,"pushed_at":"2024-05-28T16:20:19.000Z","size":462,"stargazers_count":15,"open_issues_count":3,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-17T07:44:18.654Z","etag":null,"topics":["fastapi","python","python312","sqlalchemy"],"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/DJWOMS.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":"2023-11-02T10:49:29.000Z","updated_at":"2025-01-28T10:52:25.000Z","dependencies_parsed_at":"2024-02-08T08:23:28.523Z","dependency_job_id":"14a67f3f-b21f-46ce-8dfb-3a2f27f1ce0b","html_url":"https://github.com/DJWOMS/sup","commit_stats":null,"previous_names":["djwoms/sup"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DJWOMS%2Fsup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DJWOMS%2Fsup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DJWOMS%2Fsup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DJWOMS%2Fsup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DJWOMS","download_url":"https://codeload.github.com/DJWOMS/sup/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244434879,"owners_count":20452273,"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":["fastapi","python","python312","sqlalchemy"],"created_at":"2024-10-10T12:57:58.095Z","updated_at":"2025-03-19T13:31:42.680Z","avatar_url":"https://github.com/DJWOMS.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Система управления проектами\nПлатформа должна помочь вести проекты которые реализуются в рамках стажировки молодых специалистов.\n\nАналитика успеваемости стажёров.\n\nСобственная система ведения задач. По причине блокировок пользователей такими ресурсами как Trello и ограничение на использование на подобных ресурсах.\n\nУправление командами и участниками стажировки.\n\n## Старт\n    переименовать\n    .env.example на .env\n\n### Запустить сборку\n```\ndocker-compose up --build\n```\n\n### Alembic migrate\nНе выключая контейнеры выполнить команду\n```\ndocker exec -it sup-back alembic upgrade head\n```\n\n### Перейти по адресу\n```\nhttp:\\\\127.0.0.1:8000\\docs\n```\n\n## Alembic создание migrations\nНе выключая контейнеры выполнить команду\n```\ndocker exec -it sup-back alembic revision --autogenerate -m 'название модели или миграции'\n```\n\n\n#### Будет полезным для ознакомления (видео)\n[Слоистая архитектура](https://youtu.be/aF5_niKPL6c?si=sEqSQYFqU9kPsVDp)\n\n[Слоистая Архитектура на FastAPI](https://youtu.be/8Im74b55vFc?si=0-ZwffTNCdT6VZAx)\n\n## Инструменты\n- Python 3.12\n- FastAPI\n- SqlAlchemy\n- Postgres\n- Alembic\n- Docker\n\n\n## Архитектура и структура\n\n### Контексты\nОтчасти подобие элемента DDD (Domain-driven design) - ограниченный контекст (bounded context). \n\nНе требуется глубоко разбираться в [DDD](https://habr.com/ru/companies/oleg-bunin/articles/551428/), \nно без понимания контекста никуда.\n\n### Контроллеры \nКонтроллеры везде называют по разному: `routers`, `endpoints`, `controllers`, мы используем\n`controllers`.\n\nКонтроллеры отвечают за запрос\\ответ.\nМожно сказать что они должны быть \"тупые\", не иметь бизнес-логики, вообще не иметь бизнес-логики.\n\nОни вызывают нужные зависимости: авторизация, проверка прав и т.д. \nПередают данные в сервис. Обрабатывают `HttpExceptions`.\n\n### Сервисы\nСервис - это \"бизнес контроллеры\", отвечает за бизнес логику, взаимодействуют с \nрепозиторием и другими сервисами.\n\nЕсли в пределах одной сессии (в нашем случае SqlAlchemy) нужно взаимодействовать с \nнесколькими репозиториями, то следует использовать QueryRepository.\n\n### Репозитории\nРепозиторий — это коллекция, которая содержит сущности, может фильтровать и возвращать\nрезультат обратно, в зависимости от требований нашего приложения. Где и как он хранит \nэти объекты, является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.\n\nВ нашем случае репозиторий может взаимодействовать с базой данных, например Postgres, Redis, \nMongoDB.\n\nКаждый отдельный репозиторий взаимодействует только с одной моделью (таблицей).\n\nПаттерн репозиторий служит цели отделить логику работы с БД от бизнес-логики приложения.\nЛично для себя выделяю основной плюс в переиспользовании методов выборки. \n\nПримерами методов репозитория могут быть такие названия методов как:\n- get_single()\n- get_by_id()\n- get_user_list()\n- get_multi()\n- и т.д.\n\nТакже репозиторий может использоваться для create/update/delete операций.\n\n## Структура\nКонтексты - отдельная часть логики проекта. \nСодержит свои контроллеры, сервисы, репозитории, зависимости, модели, exceptions и т.д.\n\n\n### Способ организации кода\n- Файлы находятся в папке разбитые по контекстам. \nКаждый контекст относится к определенной сущности либо бизнес-процессу.\n- Для выборок данных используем паттерн репозиторий.\n- Бизнес-логика и операции создания/изменения моделей выносим в сервис-классы. \nСервис классы не хранят свое состояние, что позволяет их переиспользовать без повторной \nинициализации.\n- Для того чтобы не зависеть от Request в сервисы передаем либо одиночные параметры, \nлибо DTO (Pydantic Model). \nЭто позволяет переиспользовать код вне контроллеров (например, команда создания нового \nпользователя и т.д.).\n- Стараемся, чтобы модели оставались максимально тонкими. В основном содержат в себе связи \n(relations).\n- Все relation_ship lazy должны быть raise_on_sql\n\n### Директории и файлы\n#### Основное\n- migrations - директория alembic для миграций\n- migrations/versions - файлы миграций\n- migrations/base.py - файл с импортированными модулями моделей для работы автогенерации миграций\n- migrations/env.py - скрипт alembic для работы миграций\n-\n- src - верхний уровень, содержит общие routes, main.py и все контексты\n- src/config - директория для общих настроек\n- src/config/database/db_config.py - настройки базы данных\n- src/config/database/db_helper.py - получение сессии базы данных\n- src/config/project_config.py - настройки для проекта\n- src/main.py - корень проекта, который запускает приложение FastAPI\n- src/routes.py - общие routers для всех приложений проекта\n-\n- tests - тесты проекта\n- .env.example - пример (шаблон) для файла .env, переменные окружения\n- pyproject.toml - файл зависимостей для [poetry](https://python-poetry.org/docs/)\n- poetry.lock - обеспечить согласованность между текущими установленными зависимостями и \nтеми, которые вы указали в файле pyproject.toml\n\n#### Контексты\n\n\n#### Библиотека (переиспользуемый код)\n- src/lib/models/base_model - базовый класс SqlAlchemy\n- src/lib/dtos/base_dto - класс базовой модели Pydantic, с настройкой для интеграция с ORM (Ранее известный \nкак \"ORM Mode\"/from_orm)\n\n### Файлы контекста\n- prefix_controller.py - контроллеры контекста\n- prefix_repository.py - работа с БД (Postgres, Redis, MongoDB и т.д.)\n- prefix_service.py - специфичная для модуля бизнес-логика\n- prefix_schema.py - pydantic модели\n- routes.py - общие routes для всех контроллеров контекста\n- prefix_model.py - модели ORM\n\n### Дополнительные файлы контекста\n- dependencies.py - зависимости для контекста\n- exceptions.py - специфические для контекста исключения\n- constants.py - константы контекста\n\n## Соглашения\n\n- Логическая часть проекта находиться внутри контекста \n- Контекст называем в единственном числе (например session, user, support)\n- Избегаем длинных названий файлов и используем `_` (например user_service.py)\n- Сущности более одной собираются в папки (например services, schemas)\n- Поддерживаем цепочку Controller -\u003e Service -\u003e Repository\n- Запросы контекста пишем в локальном репозитории (например support_repository.py)\n\n## Импорты\nВначале, описываем библиотеки, группируем логически.\n\n```\nfrom starlette.status import HTTP_400_BAD_REQUEST, HTTP_204_NO_CONTENT\nfrom fastapi import Depends, HTTPException, APIRouter\n\n\n```\n\nПеречисляем используемые контексты.\n```\nfrom ...auth.user_schema import UserSchema\nfrom ...auth.auth_service import is_admin\n```\n\nВ конце, локальные зависимости контекста.\n\n```\nfrom ..schemas.support_schema import (\n    CreateSupportSchema,\n    UpdateSupportSchema,\n    SupportResponseSchema\n)\nfrom ..services.support_service import SupportService\n```\n\n## Что дополнительно можно почитать\n[DTO в Python. Способы реализации](https://habr.com/ru/articles/752936/)\n\n[Python и чистая архитектура](https://habr.com/ru/companies/piter/articles/588669/)\n\n[Архитектура ПО](https://backendinterview.ru/architecture/index.html)\n\n[Bounded contexts будь проще](https://youtu.be/r_HYgERfMos?si=ZbcPAzIaFzGpkB_D)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjwoms%2Fsup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjwoms%2Fsup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjwoms%2Fsup/lists"}