From 20bf8b6dbd1f6ab373ede702c3b30d64e6a9eabe Mon Sep 17 00:00:00 2001 From: Backend IM Bot Date: Wed, 26 Mar 2025 22:56:16 +0100 Subject: [PATCH] Add helper functions for Book --- helpers/book_helpers.py | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 helpers/book_helpers.py diff --git a/helpers/book_helpers.py b/helpers/book_helpers.py new file mode 100644 index 0000000..f0f92e0 --- /dev/null +++ b/helpers/book_helpers.py @@ -0,0 +1,78 @@ +from typing import Optional +from datetime import datetime +import re +from pydantic import BaseModel, validator + +class Book(BaseModel): + title: str + author: str + description: Optional[str] = None + page_count: int + published_date: datetime + isbn: str + + @validator('isbn') + def validate_isbn(cls, isbn): + """ + Validate the ISBN format. + """ + pattern = r'^[\d-]+$' + if not re.match(pattern, isbn): + raise ValueError('Invalid ISBN format') + return isbn + +def create_book(db, book_data): + """ + Create a new book in the database. + + Args: + db: Database session + book_data: Book data to create + + Returns: + Book object if created successfully, None otherwise + """ + try: + book = Book(**book_data.dict()) + except ValueError as e: + return None + + db_book = db.query(Book).filter(Book.isbn == book.isbn).first() + if db_book: + return None + + db.add(book) + db.commit() + db.refresh(book) + return book + +def get_book_by_isbn(db, isbn): + """ + Get a book by its ISBN. + + Args: + db: Database session + isbn: ISBN to search for + + Returns: + Book object if found, None otherwise + """ + return db.query(Book).filter(Book.isbn == isbn).first() + +def search_books(db, query): + """ + Search for books based on a query string. + + Args: + db: Database session + query: Search query string + + Returns: + List of Book objects matching the query + """ + books = db.query(Book).filter( + Book.title.ilike(f'%{query}%') | + Book.author.ilike(f'%{query}%') | + Book.description.ilike(f'%{query}%') + ).all() + return books \ No newline at end of file