diff --git a/.gitignore b/.gitignore index c564a62..f7f6a3b 100644 --- a/.gitignore +++ b/.gitignore @@ -102,7 +102,7 @@ celerybeat.pid *.sage.py # Environments -services_backend/env.env +.env .venv env/ venv/ @@ -129,4 +129,4 @@ dmypy.json # Pyre type checker .pyre/ -desktop.ini \ No newline at end of file +desktop.ini diff --git a/Makefile b/Makefile index 45cd466..d16211d 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ run: - source ./venv/bin/activate && uvicorn --reload --log-level debug services-backend.routes.base:app + source ./venv/bin/activate && uvicorn --reload --log-level debug services_backend.routes.base:app db: docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name db-services-backend postgres:15 -migrate: db +migrate: alembic upgrade head diff --git a/alembic.ini b/alembic.ini index 1bda588..8921c49 100644 --- a/alembic.ini +++ b/alembic.ini @@ -52,9 +52,6 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # are written from script.py.mako # output_encoding = utf-8 -sqlalchemy.url = postgresql://postgres:123@localhost:5432/Profcom - - [post_write_hooks] # post_write_hooks defines scripts or Python functions that are run # on newly generated revision scripts. See the documentation for further diff --git a/requirements.dev.txt b/requirements.dev.txt new file mode 100644 index 0000000..a07e975 --- /dev/null +++ b/requirements.dev.txt @@ -0,0 +1 @@ +Faker diff --git a/requirements.txt b/requirements.txt index 9f083fb..dfdfe90 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,8 @@ -fastapi~=0.86.0 +fastapi fastapi-sqlalchemy psycopg2-binary -pydantic[dotenv]~=1.10.2 -uvicorn~=0.19.0 -alembic~=1.8.1 -SQLAlchemy~=1.4.43 +pydantic[dotenv] +uvicorn +alembic +SQLAlchemy gunicorn - -python-dotenv~=0.21.0 -Faker~=15.3.1 diff --git a/services_backend/routes/button.py b/services_backend/routes/button.py index 1478d44..64dfbe7 100644 --- a/services_backend/routes/button.py +++ b/services_backend/routes/button.py @@ -1,7 +1,5 @@ -from fastapi import HTTPException, APIRouter, Depends -from sqlalchemy.orm import Session -from sqlalchemy.engine import create_engine -from sqlalchemy.ext.declarative import declarative_base +from fastapi import HTTPException, APIRouter +from fastapi_sqlalchemy import db from .models.button import ButtonCreate, ButtonUpdate, ButtonGet from ..models.database import Button @@ -11,56 +9,36 @@ responses={404: {"description": "You tried, but no"}} ) -Base = declarative_base() -engine = create_engine('postgresql+psycopg2://postgres:123@localhost:5432/Profcom') -Base.metadata.create_all(bind=engine) - - -# Да, без этого говна ничего не работает, я честно пытался -def get_db(): - db = Session(bind=engine) - try: - yield db - finally: - db.close() - @button.post("/", response_model=ButtonCreate) -def create_button(button: ButtonCreate, db: Session = Depends(get_db)): +def create_button(button: ButtonCreate): db_button = ButtonCreate(category_id=button.category_id, name=button.name, icon=button.icon) - db.add(db_button) - db.commit() - db.refresh(db_button) - db.close() - + db.session.add(db_button) return db_button @button.get("/", response_model=list[ButtonGet]) -def get_buttons(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): - return db.query(Button).offset(skip).limit(limit).all() +def get_buttons(skip: int = 0, limit: int = 100): + return db.session.query(Button).offset(skip).limit(limit).all() @button.get("/{button_id}", response_model=ButtonGet) -def get_button(button_id: int, db: Session = Depends(get_db)): - return db.query(Button).filter(Button.id == button_id).first() +def get_button(button_id: int): + return db.session.query(Button).filter(Button.id == button_id).first() @button.delete("/") -def remove_button(button_id: int, db: Session = Depends(get_db)): +def remove_button(button_id: int): db_button = get_button(button_id=button_id, db=db) if db_button is None: raise HTTPException(status_code=404, detail="Button does not exist") - delete = db.query(Button).filter(Button.id == button_id).first() - db.delete(delete) - db.commit() - db.close() + db.session.query(Button).filter(Button.id == button_id).first() @button.patch("/", response_model=ButtonUpdate) -def update_button(button: ButtonUpdate, db: Session = Depends(get_db)): +def update_button(button: ButtonUpdate): db_old_button = get_button(button_id=button.id, db=db) if db_old_button is None: raise HTTPException(status_code=404, detail="Button does not exist") - return db.query(Button).update(button) + return db.session.query(Button).update(button) diff --git a/services_backend/routes/category.py b/services_backend/routes/category.py index 77c42cc..2eb211a 100644 --- a/services_backend/routes/category.py +++ b/services_backend/routes/category.py @@ -1,7 +1,5 @@ -from fastapi import HTTPException, APIRouter, Depends -from sqlalchemy.orm import Session -from sqlalchemy.engine import create_engine -from sqlalchemy.ext.declarative import declarative_base +from fastapi import HTTPException, APIRouter +from fastapi_sqlalchemy import db from .models.category import CategoryCreate, CategoryUpdate, CategoryGet from ..models.database import Category, Button @@ -11,63 +9,44 @@ responses={404: {"description": "You tried, but no"}} ) -Base = declarative_base() -engine = create_engine('postgresql+psycopg2://postgres:123@localhost:5432/Profcom') -Base.metadata.create_all(bind=engine) - - -# Да, без этого говна ничего не работает, я честно пытался -def get_db(): - db = Session(bind=engine) - try: - yield db - finally: - db.close() - @category.post("/", response_model=CategoryCreate) -def create_category(category: CategoryCreate, db: Session = Depends(get_db)): +def create_category(category: CategoryCreate): db_category = CategoryCreate(category_id=category.category_id, type=category.type, name=category.name) - db.add(db_category) - db.commit() - db.refresh(db_category) - db.close() - + db.session.add(db_category) return db_category @category.get("/", response_model=list[CategoryGet]) -def get_categories(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): - return db.query(Category).offset(skip).limit(limit).all() +def get_categories(skip: int = 0, limit: int = 100): + return db.session.query(Category).offset(skip).limit(limit).all() @category.get("/{category_id}", response_model=CategoryGet) -def get_category(category_id: int, db: Session = Depends(get_db)): - db_category = db.query(Category).filter(Category.id == category_id).first() +def get_category(category_id: int): + db_category = db.session.query(Category).filter(Category.id == category_id).first() if db_category is None: raise HTTPException(status_code=404, detail="Category does not exist") return db_category @category.delete("/") -def remove_category(category_id: int, db: Session = Depends(get_db)): +def remove_category(category_id: int): db_category = get_category(db=db, category_id=category_id) if db_category is None: raise HTTPException(status_code=404, detail="Category does not exist") - delete = db.query(Category).filter(Category.id == category_id).first() - d = db.query(Button).filter(Button.category_id == category_id).all() + delete = db.session.query(Category).filter(Category.id == category_id).first() + d = db.session.query(Button).filter(Button.category_id == category_id).all() for button in d: - db.delete(button) - db.commit() - db.delete(delete) - db.commit() - db.close() + db.session.delete(button) + db.session.flush() + db.session.delete(delete) @category.patch("/", response_model=CategoryUpdate) -def update_category(category: CategoryUpdate, db: Session = Depends(get_db)): +def update_category(category: CategoryUpdate): db_old_category = get_category(db=db, category_id=category.id) if db_old_category is None: raise HTTPException(status_code=404, detail="Category does not exist") - return db.query(Category).update(category) + return db.session.query(Category).update(category) diff --git a/services_backend/settings.py b/services_backend/settings.py index 7674e3f..8726c4d 100644 --- a/services_backend/settings.py +++ b/services_backend/settings.py @@ -8,9 +8,7 @@ class Settings(BaseSettings): """Application settings""" - path = os.path.join(os.path.dirname(__file__), 'env.env') - load_dotenv(path) - DB_DSN: PostgresDsn = os.getenv('DATABASE_URL') + DB_DSN: PostgresDsn = 'postgresql://postgres@localhost:5432/postgres' CORS_ALLOW_ORIGINS: list[str] = ['*'] CORS_ALLOW_CREDENTIALS: bool = True @@ -21,7 +19,7 @@ class Config: """Pydantic BaseSettings config""" case_sensitive = True - env_file = "env.env" + env_file = ".env" @lru_cache