All checks were successful
CI/CD Pipeline / VM Test - backend-integration (push) Successful in 12s
CI/CD Pipeline / VM Test - full-stack (push) Successful in 9s
CI/CD Pipeline / VM Test - performance (push) Successful in 9s
CI/CD Pipeline / VM Test - security (push) Successful in 9s
CI/CD Pipeline / Backend Linting (push) Successful in 3s
CI/CD Pipeline / Frontend Linting (push) Successful in 24s
CI/CD Pipeline / Nix Flake Check (push) Successful in 53s
CI/CD Pipeline / CI Summary (push) Successful in 1s
CI/CD Pipeline / VM Test - backend-integration (pull_request) Successful in 2s
CI/CD Pipeline / VM Test - full-stack (pull_request) Successful in 2s
CI/CD Pipeline / VM Test - performance (pull_request) Successful in 2s
CI/CD Pipeline / VM Test - security (pull_request) Successful in 2s
CI/CD Pipeline / Backend Linting (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Linting (pull_request) Successful in 16s
CI/CD Pipeline / Nix Flake Check (pull_request) Successful in 38s
CI/CD Pipeline / CI Summary (pull_request) Successful in 0s
75 lines
1.8 KiB
Python
75 lines
1.8 KiB
Python
"""Image search and filtering functionality."""
|
|
|
|
from sqlalchemy import or_
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database.models.image import Image
|
|
|
|
|
|
def search_images(
|
|
user_id: str,
|
|
db: Session,
|
|
query: str | None = None,
|
|
limit: int = 50,
|
|
offset: int = 0,
|
|
) -> list[Image]:
|
|
"""
|
|
Search user's image library with optional filters.
|
|
|
|
Args:
|
|
user_id: User UUID
|
|
db: Database session
|
|
query: Search query (searches filename)
|
|
limit: Maximum results (default 50)
|
|
offset: Pagination offset (default 0)
|
|
|
|
Returns:
|
|
List of matching images
|
|
"""
|
|
# Base query - get user's images
|
|
stmt = db.query(Image).filter(Image.user_id == user_id)
|
|
|
|
# Add search filter if query provided
|
|
if query:
|
|
search_term = f"%{query}%"
|
|
stmt = stmt.filter(
|
|
or_(
|
|
Image.filename.ilike(search_term),
|
|
Image.image_metadata["format"].astext.ilike(search_term),
|
|
)
|
|
)
|
|
|
|
# Order by most recently uploaded
|
|
stmt = stmt.order_by(Image.created_at.desc())
|
|
|
|
# Apply pagination
|
|
stmt = stmt.limit(limit).offset(offset)
|
|
|
|
return stmt.all()
|
|
|
|
|
|
def count_images(user_id: str, db: Session, query: str | None = None) -> int:
|
|
"""
|
|
Count images matching search criteria.
|
|
|
|
Args:
|
|
user_id: User UUID
|
|
db: Database session
|
|
query: Search query (optional)
|
|
|
|
Returns:
|
|
Count of matching images
|
|
"""
|
|
stmt = db.query(Image).filter(Image.user_id == user_id)
|
|
|
|
if query:
|
|
search_term = f"%{query}%"
|
|
stmt = stmt.filter(
|
|
or_(
|
|
Image.filename.ilike(search_term),
|
|
Image.image_metadata["format"].astext.ilike(search_term),
|
|
)
|
|
)
|
|
|
|
return stmt.count()
|