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