Add helper functions for Book
This commit is contained in:
parent
edff293d0f
commit
20bf8b6dbd
78
helpers/book_helpers.py
Normal file
78
helpers/book_helpers.py
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user