34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
"""Favorites: toggle save/unsave, check status, list."""
|
|
from sqlalchemy.exc import IntegrityError
|
|
from app.extensions import db
|
|
from app.models.favorite import Favorite
|
|
|
|
|
|
def is_favorited(user_id: int, listing_id: int) -> bool:
|
|
return Favorite.query.filter_by(
|
|
user_id=user_id, listing_id=listing_id).first() is not None
|
|
|
|
|
|
def toggle_favorite(user_id: int, listing_id: int) -> bool:
|
|
"""Add if not present; remove if present. Returns True if now favorited."""
|
|
existing = Favorite.query.filter_by(
|
|
user_id=user_id, listing_id=listing_id).first()
|
|
if existing:
|
|
db.session.delete(existing)
|
|
db.session.commit()
|
|
return False
|
|
fav = Favorite(user_id=user_id, listing_id=listing_id)
|
|
db.session.add(fav)
|
|
try:
|
|
db.session.commit()
|
|
except IntegrityError:
|
|
db.session.rollback()
|
|
return True
|
|
|
|
|
|
def user_favorites(user_id: int, page=1, per_page=20):
|
|
return (Favorite.query
|
|
.filter_by(user_id=user_id)
|
|
.order_by(Favorite.created_at.desc())
|
|
.paginate(page=page, per_page=per_page, error_out=False))
|