mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-16 21:30:39 -07:00
The suite hadn't run green since the routes refactor: - test_profile_duplicate_names.py imported the pre-refactor module layout and broke collection; now imports backend.services.profiles - tests/conftest.py puts the repo root and backend dir on sys.path so files collect standalone instead of depending on run order - test_cors.py tested a hand-copied mirror of the origin list that had drifted from app.py (missing http://tauri.localhost); it now builds the app via the real create_app() factory - test_progress.py simulated a 1KB download, below the tracker's 1MB reporting threshold; simulation raised to 5MB - slow/timeout markers registered in pyproject Ruff: ~900 violations auto-fixed (typing modernization, import sorting, unused imports, whitespace). The remaining rules are baselined in pyproject.toml with per-rule counts to burn down, plus per-file carve-outs for deliberate env-before-import ordering. ruff check is now clean; suite is 134 passed, 2 skipped.
99 lines
3.0 KiB
Python
99 lines
3.0 KiB
Python
"""Audio channel endpoints."""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
|
|
from .. import models
|
|
from ..database import get_db
|
|
from ..services import channels
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/channels", response_model=list[models.AudioChannelResponse])
|
|
async def list_channels(db: Session = Depends(get_db)):
|
|
"""List all audio channels."""
|
|
return await channels.list_channels(db)
|
|
|
|
|
|
@router.post("/channels", response_model=models.AudioChannelResponse)
|
|
async def create_channel(
|
|
data: models.AudioChannelCreate,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Create a new audio channel."""
|
|
try:
|
|
return await channels.create_channel(data, db)
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
@router.get("/channels/{channel_id}", response_model=models.AudioChannelResponse)
|
|
async def get_channel(
|
|
channel_id: str,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Get an audio channel by ID."""
|
|
channel = await channels.get_channel(channel_id, db)
|
|
if not channel:
|
|
raise HTTPException(status_code=404, detail="Channel not found")
|
|
return channel
|
|
|
|
|
|
@router.put("/channels/{channel_id}", response_model=models.AudioChannelResponse)
|
|
async def update_channel(
|
|
channel_id: str,
|
|
data: models.AudioChannelUpdate,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Update an audio channel."""
|
|
try:
|
|
channel = await channels.update_channel(channel_id, data, db)
|
|
if not channel:
|
|
raise HTTPException(status_code=404, detail="Channel not found")
|
|
return channel
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
@router.delete("/channels/{channel_id}")
|
|
async def delete_channel(
|
|
channel_id: str,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Delete an audio channel."""
|
|
try:
|
|
success = await channels.delete_channel(channel_id, db)
|
|
if not success:
|
|
raise HTTPException(status_code=404, detail="Channel not found")
|
|
return {"message": "Channel deleted successfully"}
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
@router.get("/channels/{channel_id}/voices")
|
|
async def get_channel_voices(
|
|
channel_id: str,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Get list of profile IDs assigned to a channel."""
|
|
try:
|
|
profile_ids = await channels.get_channel_voices(channel_id, db)
|
|
return {"profile_ids": profile_ids}
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
@router.put("/channels/{channel_id}/voices")
|
|
async def set_channel_voices(
|
|
channel_id: str,
|
|
data: models.ChannelVoiceAssignment,
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Set which voices are assigned to a channel."""
|
|
try:
|
|
await channels.set_channel_voices(channel_id, data, db)
|
|
return {"message": "Channel voices updated successfully"}
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|