78 lines
1.7 KiB
Python
78 lines
1.7 KiB
Python
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 |