diff --git a/alembic/versions/20250429_184448_d4adbaca_update_book.py b/alembic/versions/20250429_184448_d4adbaca_update_book.py new file mode 100644 index 0000000..5b4b86f --- /dev/null +++ b/alembic/versions/20250429_184448_d4adbaca_update_book.py @@ -0,0 +1,23 @@ +"""Add a delete_book helper function to handle book deletion logic. +Revision ID: 7d1f3e5a6c2b +Revises: 4a8c3b7d9e2f +Create Date: 2023-10-12 14:30:00.000000 +""" + + +# revision identifiers, used by Alembic. +revision = '7d1f3e5a6c2b' +down_revision = '4a8c3b7d9e2f' +branch_labels = None +depends_on = None + + +def upgrade(): + # This migration only adds a helper method to the model class + # No database schema changes are needed + pass + + +def downgrade(): + # No database schema changes to revert + pass \ No newline at end of file diff --git a/endpoints/books.delete.py b/endpoints/books.delete.py index e69de29..a5ee705 100644 --- a/endpoints/books.delete.py +++ b/endpoints/books.delete.py @@ -0,0 +1,26 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.orm import Session +from uuid import UUID + +from core.database import get_db +from helpers.book_helpers import delete_book + +router = APIRouter() + +@router.delete("/books", status_code=status.HTTP_200_OK) +async def delete_book_endpoint( + book_id: UUID, + db: Session = Depends(get_db) +): + """ + Delete a book from the database by its ID + """ + success = delete_book(db=db, book_id=book_id) + + if not success: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Book not found" + ) + + return {"message": "Book successfully deleted"} \ No newline at end of file diff --git a/helpers/book_helpers.py b/helpers/book_helpers.py index 6e5ee65..3dcf983 100644 --- a/helpers/book_helpers.py +++ b/helpers/book_helpers.py @@ -46,6 +46,25 @@ def update_book(db: Session, book_id: UUID, book_data: BookUpdate) -> Optional[B db.refresh(book) return book +def delete_book(db: Session, book_id: UUID) -> bool: + """ + Deletes a book from the database. + + Args: + db (Session): The database session. + book_id (UUID): The ID of the book to delete. + + Returns: + bool: True if the book was successfully deleted, False if the book was not found. + """ + book = db.query(Book).filter(Book.id == book_id).first() + if not book: + return False + + db.delete(book) + db.commit() + return True + def get_book_by_id(db: Session, book_id: UUID) -> Optional[Book]: """ Retrieves a book by its ID. diff --git a/models/book.py b/models/book.py index af81610..23aad1c 100644 --- a/models/book.py +++ b/models/book.py @@ -43,4 +43,24 @@ class Book(Base): db_session.commit() db_session.refresh(book) - return book \ No newline at end of file + return book + + @classmethod + def delete_book(cls, db_session, book_id: uuid.UUID) -> bool: + """ + Delete a book record from the database. + + Args: + db_session: The database session + book_id: UUID of the book to delete + + Returns: + True if book was successfully deleted, False if book not found + """ + book = db_session.query(cls).filter(cls.id == book_id).first() + if not book: + return False + + db_session.delete(book) + db_session.commit() + return True \ No newline at end of file