- Increase token expiry from 30 minutes to 7 days - Remove internal session.commit() calls from gamification services - Add try/except around gamification logic in review creation - Add elmeg.runfoo.run hostname support in frontend api-config
73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
from typing import List, Optional
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from sqlmodel import Session, select, func
|
|
from database import get_session
|
|
from models import Review, User
|
|
from schemas import ReviewCreate, ReviewRead
|
|
from auth import get_current_user
|
|
from services.gamification import award_xp, check_and_award_badges, update_streak, XP_REWARDS
|
|
|
|
router = APIRouter(prefix="/reviews", tags=["reviews"])
|
|
|
|
@router.post("/", response_model=ReviewRead)
|
|
def create_review(
|
|
review: ReviewCreate,
|
|
session: Session = Depends(get_session),
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
db_review = Review.model_validate(review)
|
|
db_review.user_id = current_user.id
|
|
session.add(db_review)
|
|
session.flush() # Ensure ID is generated for badge checks if needed
|
|
|
|
# Check if this is user's first review for bonus XP
|
|
# We check relative to THIS review just being added (id > 0)
|
|
review_count = session.exec(
|
|
select(func.count(Review.id)).where(Review.user_id == current_user.id)
|
|
).one() or 0
|
|
|
|
# Award XP
|
|
xp_amount = XP_REWARDS["review_write"]
|
|
if review_count <= 1: # This is the first one
|
|
xp_amount += XP_REWARDS["first_review"] # Bonus for first review
|
|
|
|
try:
|
|
award_xp(session, current_user, xp_amount, "review")
|
|
update_streak(session, current_user)
|
|
check_and_award_badges(session, current_user)
|
|
except Exception as e:
|
|
# Don't fail the review if gamification fails, but log it
|
|
print(f"Error in gamification service during review: {e}")
|
|
|
|
session.commit()
|
|
session.refresh(db_review)
|
|
return db_review
|
|
|
|
@router.get("/", response_model=List[ReviewRead])
|
|
def read_reviews(
|
|
show_id: Optional[int] = None,
|
|
venue_id: Optional[int] = None,
|
|
song_id: Optional[int] = None,
|
|
performance_id: Optional[int] = None,
|
|
tour_id: Optional[int] = None,
|
|
year: Optional[int] = None,
|
|
offset: int = 0,
|
|
limit: int = Query(default=100, le=100),
|
|
session: Session = Depends(get_session)
|
|
):
|
|
query = select(Review)
|
|
if show_id:
|
|
query = query.where(Review.show_id == show_id)
|
|
if venue_id:
|
|
query = query.where(Review.venue_id == venue_id)
|
|
if song_id:
|
|
query = query.where(Review.song_id == song_id)
|
|
if performance_id:
|
|
query = query.where(Review.performance_id == performance_id)
|
|
if tour_id:
|
|
query = query.where(Review.tour_id == tour_id)
|
|
if year:
|
|
query = query.where(Review.year == year)
|
|
|
|
reviews = session.exec(query.offset(offset).limit(limit)).all()
|
|
return reviews
|