from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.core.database import get_db from app.core.security import get_current_user from app.models import User, Song, SongDance, DanceAlternative from app.schemas import ( SongCreate, SongOut, SongDanceCreate, SongDanceOut, DanceAlternativeCreate, DanceAlternativeOut, ) router = APIRouter(prefix="/songs", tags=["songs"]) # ── Sange ───────────────────────────────────────────────────────────────────── @router.get("/", response_model=list[SongOut]) def list_songs(db: Session = Depends(get_db), me: User = Depends(get_current_user)): return db.query(Song).filter(Song.owner_id == me.id).all() @router.post("/", response_model=SongOut, status_code=201) def create_song(data: SongCreate, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = Song(owner_id=me.id, **data.model_dump()) db.add(song) db.commit() db.refresh(song) return song @router.get("/{song_id}", response_model=SongOut) def get_song(song_id: str, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = db.query(Song).filter(Song.id == song_id, Song.owner_id == me.id).first() if not song: raise HTTPException(404, "Sang ikke fundet") return song @router.delete("/{song_id}", status_code=204) def delete_song(song_id: str, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = db.query(Song).filter(Song.id == song_id, Song.owner_id == me.id).first() if not song: raise HTTPException(404, "Sang ikke fundet") db.delete(song) db.commit() # ── Danse på en sang ────────────────────────────────────────────────────────── @router.post("/{song_id}/dances", response_model=SongDanceOut, status_code=201) def add_dance(song_id: str, data: SongDanceCreate, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = db.query(Song).filter(Song.id == song_id, Song.owner_id == me.id).first() if not song: raise HTTPException(404, "Sang ikke fundet") dance = SongDance(song_id=song_id, **data.model_dump()) db.add(dance) db.commit() db.refresh(dance) return dance @router.delete("/{song_id}/dances/{dance_id}", status_code=204) def remove_dance(song_id: str, dance_id: str, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = db.query(Song).filter(Song.id == song_id, Song.owner_id == me.id).first() if not song: raise HTTPException(404, "Sang ikke fundet") dance = db.query(SongDance).filter(SongDance.id == dance_id, SongDance.song_id == song_id).first() if not dance: raise HTTPException(404, "Dans ikke fundet") db.delete(dance) db.commit() # ── Alternativ-danse ────────────────────────────────────────────────────────── @router.post("/{song_id}/dances/{dance_id}/alternatives", response_model=DanceAlternativeOut, status_code=201) def add_alternative(song_id: str, dance_id: str, data: DanceAlternativeCreate, db: Session = Depends(get_db), me: User = Depends(get_current_user)): song = db.query(Song).filter(Song.id == song_id, Song.owner_id == me.id).first() if not song: raise HTTPException(404, "Sang ikke fundet") dance = db.query(SongDance).filter(SongDance.id == dance_id, SongDance.song_id == song_id).first() if not dance: raise HTTPException(404, "Dans ikke fundet") alt_dance = db.query(SongDance).filter(SongDance.id == data.alt_song_dance_id).first() if not alt_dance: raise HTTPException(404, "Alternativ-dans ikke fundet") alt = DanceAlternative(song_dance_id=dance_id, **data.model_dump()) db.add(alt) db.commit() db.refresh(alt) return alt @router.get("/{song_id}/dances/{dance_id}/alternatives", response_model=list[DanceAlternativeOut]) def list_alternatives(song_id: str, dance_id: str, db: Session = Depends(get_db), me: User = Depends(get_current_user)): dance = db.query(SongDance).filter(SongDance.id == dance_id, SongDance.song_id == song_id).first() if not dance: raise HTTPException(404, "Dans ikke fundet") return dance.alternatives @router.delete("/{song_id}/dances/{dance_id}/alternatives/{alt_id}", status_code=204) def remove_alternative(song_id: str, dance_id: str, alt_id: str, db: Session = Depends(get_db), me: User = Depends(get_current_user)): alt = db.query(DanceAlternative).filter(DanceAlternative.id == alt_id, DanceAlternative.song_dance_id == dance_id).first() if not alt: raise HTTPException(404, "Alternativ ikke fundet") db.delete(alt) db.commit()