diff --git a/backend/main.py b/backend/main.py index c0cf9c6..3681dd1 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,5 +1,5 @@ from fastapi import FastAPI -from routers import auth, shows, venues, songs, social, tours, artists, preferences, reviews, badges, nicknames, moderation, attendance, groups, users, search, performances, notifications, feed, leaderboards +from routers import auth, shows, venues, songs, social, tours, artists, preferences, reviews, badges, nicknames, moderation, attendance, groups, users, search, performances, notifications, feed, leaderboards, stats from fastapi.middleware.cors import CORSMiddleware @@ -33,6 +33,7 @@ app.include_router(performances.router) app.include_router(notifications.router) app.include_router(feed.router) app.include_router(leaderboards.router) +app.include_router(stats.router) @app.get("/") def read_root(): diff --git a/backend/routers/shows.py b/backend/routers/shows.py index 9dd4e57..15b9b16 100644 --- a/backend/routers/shows.py +++ b/backend/routers/shows.py @@ -37,6 +37,17 @@ def read_shows( shows = session.exec(query.offset(offset).limit(limit)).all() return shows +@router.get("/recent", response_model=List[ShowRead]) +def read_recent_shows( + limit: int = Query(default=10, le=50), + session: Session = Depends(get_session) +): + """Get the most recent shows ordered by date descending""" + from datetime import datetime + query = select(Show).where(Show.date <= datetime.now()).order_by(Show.date.desc()).limit(limit) + shows = session.exec(query).all() + return shows + @router.get("/{show_id}", response_model=ShowRead) def read_show(show_id: int, session: Session = Depends(get_session)): show = session.get(Show, show_id) diff --git a/backend/routers/stats.py b/backend/routers/stats.py new file mode 100644 index 0000000..ef978dd --- /dev/null +++ b/backend/routers/stats.py @@ -0,0 +1,26 @@ +from typing import List +from fastapi import APIRouter, Depends, Query +from sqlmodel import Session, select, func +from database import get_session +from models import Song, Performance + +router = APIRouter(prefix="/stats", tags=["stats"]) + +@router.get("/top-songs") +def get_top_songs( + limit: int = Query(default=10, le=50), + session: Session = Depends(get_session) +): + """Get top songs by number of performances""" + query = ( + select(Song.id, Song.title, func.count(Performance.id).label("performance_count")) + .join(Performance, Song.id == Performance.song_id) + .group_by(Song.id, Song.title) + .order_by(func.count(Performance.id).desc()) + .limit(limit) + ) + results = session.exec(query).all() + return [ + {"id": r[0], "title": r[1], "performance_count": r[2]} + for r in results + ]