Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ fastapi = "*"
pydantic = "*"
requests = "*"
pymysql = "*"
sqlalchemy = "2.0.12"
sqlalchemy = "2.0.13"
alembic = "1.10.4"
python-dotenv = "*"
unicorn ="*"
python-multipart = "*"
cryptography = "*"

[dev-packages]

Expand Down
29 changes: 29 additions & 0 deletions alembic/versions/d9b85eefcd0e_added_new_table_books.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Added new table books

Revision ID: d9b85eefcd0e
Revises: b8a484e6683d
Create Date: 2023-05-14 20:21:45.567433

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'd9b85eefcd0e'
down_revision = 'b8a484e6683d'
branch_labels = None
depends_on = None


def upgrade() -> None:
op.create_table("books",
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("title", sa.String(255), nullable=False),
sa.Column("author", sa.String(255), nullable=False),
sa.Column("pages_count", sa.Integer, nullable=True),
)


def downgrade() -> None:
op.drop_table("books")
2 changes: 1 addition & 1 deletion app/dependencies/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
security = HTTPBasic()

users = {
"vitalii": "123",
"nic": "7788",
}


Expand Down
50 changes: 45 additions & 5 deletions app/routers/books.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import json

from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel

from app.dependencies.db import get_session
from app.models import Book

from sqlalchemy.future import select

router = APIRouter(prefix="/books")

# books = [
Expand All @@ -29,14 +31,17 @@ class BookCreateModel(BaseModel):
author: str


class BookUpdate(BaseModel):
title: str
author: str
pages_count: int = None


@router.get("", response_model=list[BookModel])
async def get_books(title: str = None, session=Depends(get_session)):
books = session.query(Book).all()

books_models = []
for book in books:
books_models.append(BookModel.from_orm(book))
return books_models
return [BookModel.from_orm(book) for book in books]


# @router.get("/{book_id}", response_model=BookModel)
Expand All @@ -57,3 +62,38 @@ async def create_book(book: BookCreateModel, session=Depends(get_session)):

return BookModel.from_orm(book)


@router.put("/update/{book_id}")
async def update_book(book_id: int, book_update: BookUpdate, session=Depends(get_session)):
book = session.query(Book).filter(Book.id == book_id).first()

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pls add raising 404 error is bot does not exist in DB


if not book:
raise HTTPException(status_code=404, detail="Book not found")

for variant, sense in variants(book_update).items():
if value is not None:
setattr(book, variant, sense)
session.commit()
return BookModel.from_orm(book)


@router.delete("/delete/{book_id}")
async def delete_book(book_id: int, session=Depends(get_session)):
book = session.query(Book).filter(Book.id == book_id).first()

if not book:
raise HTTPException(status_code=404, detail="Book not found")
else:
session.delete(book)
session.commit()
return {"message": "Book deleted"}


@router.get("/get/{book_id}", response_model=BookModel)
async def get_book(book_id: int, session=Depends(get_session)):
if book := session.query(Book).filter(Book.id == book_id).first():
book_data = {k: v for k, v in book.__dict__.items()
if k != '_sa_instance_state'}
return Book(**book_data)
else:
raise HTTPException(status_code=404, detail="Book not found")