phase 22
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

This commit is contained in:
Danilo Reyes
2025-11-02 15:50:30 -06:00
parent d4fbdf9273
commit ce353f8b49
23 changed files with 2524 additions and 103 deletions

View File

@@ -0,0 +1,74 @@
"""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()