elmeg-demo/backend/routers/artists.py
fullsizemalt 61715a119c
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run
feat: implement Artist model usage, router, and migration script
2025-12-24 12:19:28 -08:00

50 lines
1.8 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlmodel import Session, select
from typing import List, Optional
from database import get_session
from models import Artist, Song, Performance, Show, PerformanceArtist
from schemas import SongRead
router = APIRouter(prefix="/artists", tags=["artists"])
@router.get("/{slug}")
async def get_artist(slug: str, session: Session = Depends(get_session)):
"""Get artist details, covers, and guest appearances"""
artist = session.exec(select(Artist).where(Artist.slug == slug)).first()
if not artist:
raise HTTPException(status_code=404, detail="Artist not found")
# Get covers (Songs by this artist that Goose has played)
covers = session.exec(
select(Song)
.where(Song.artist_id == artist.id)
.order_by(Song.title)
).all()
# Get guest appearances (Performances where this artist is linked)
# This queries the PerformanceArtist link table
guest_appearances = session.exec(
select(Performance, Show)
.join(PerformanceArtist, PerformanceArtist.performance_id == Performance.id)
.join(Show, Performance.show_id == Show.id)
.where(PerformanceArtist.artist_id == artist.id)
.order_by(Show.date.desc())
).all()
# Format guest appearances
guest_spots = []
for perf, show in guest_appearances:
guest_spots.append({
"date": show.date,
"venue": show.venue.name if show.venue else "Unknown Venue",
"city": f"{show.venue.city}, {show.venue.state}" if show.venue else "",
"song_title": perf.song.title,
"show_slug": show.slug,
"song_slug": perf.song.slug
})
return {
"artist": artist,
"covers": covers,
"guest_appearances": guest_spots
}