feat: Add /shows/recent and /stats/top-songs API endpoints
This commit is contained in:
parent
0e71d283c9
commit
ffce34f948
3 changed files with 39 additions and 1 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
from fastapi import FastAPI
|
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
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
|
|
@ -33,6 +33,7 @@ app.include_router(performances.router)
|
||||||
app.include_router(notifications.router)
|
app.include_router(notifications.router)
|
||||||
app.include_router(feed.router)
|
app.include_router(feed.router)
|
||||||
app.include_router(leaderboards.router)
|
app.include_router(leaderboards.router)
|
||||||
|
app.include_router(stats.router)
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
def read_root():
|
def read_root():
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,17 @@ def read_shows(
|
||||||
shows = session.exec(query.offset(offset).limit(limit)).all()
|
shows = session.exec(query.offset(offset).limit(limit)).all()
|
||||||
return shows
|
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)
|
@router.get("/{show_id}", response_model=ShowRead)
|
||||||
def read_show(show_id: int, session: Session = Depends(get_session)):
|
def read_show(show_id: int, session: Session = Depends(get_session)):
|
||||||
show = session.get(Show, show_id)
|
show = session.get(Show, show_id)
|
||||||
|
|
|
||||||
26
backend/routers/stats.py
Normal file
26
backend/routers/stats.py
Normal file
|
|
@ -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
|
||||||
|
]
|
||||||
Loading…
Add table
Reference in a new issue