team-9/backend/endpoints/queue.py
2025-08-02 04:07:17 +02:00

167 lines
No EOL
5.5 KiB
Python

from fastapi import APIRouter, HTTPException
from pymongo import MongoClient
from bson import ObjectId
from datetime import datetime
from pydantic import BaseModel
from typing import Optional
# Router per le API della queue
queue_router = APIRouter(prefix="/queue")
# Connessione MongoDB
client = MongoClient("mongodb://localhost:27017/")
db = client["simple_db"]
queue_collection = db["queue"]
# Modelli Pydantic
class QueueItem(BaseModel):
id: str
titolo: str
coverUrl: str
color: str
artista: str
voti: int = 0
class QueueItemCreate(BaseModel):
titolo: str
coverUrl: str
color: str
artista: str
voti: int = 0
class QueueItemUpdate(BaseModel):
titolo: Optional[str] = None
coverUrl: Optional[str] = None
color: Optional[str] = None
artista: Optional[str] = None
class VoteUpdate(BaseModel):
increment: bool = True # True per incrementare, False per decrementare
@queue_router.post("/add")
async def add_item(item: QueueItemCreate):
"""POST: Aggiunge un nuovo item alla queue"""
try:
# Genera un ID univoco
import uuid
item_id = str(uuid.uuid4())
new_item = {
"id": item_id,
"titolo": item.titolo,
"coverUrl": item.coverUrl,
"color": item.color,
"artista": item.artista,
"voti": item.voti,
"created_at": datetime.now().isoformat()
}
result = queue_collection.insert_one(new_item)
new_item["_id"] = str(result.inserted_id)
return {"success": True, "message": "Item aggiunto alla queue", "data": new_item}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore aggiunta item: {str(e)}")
@queue_router.get("/read")
async def read_queue():
"""GET: Legge tutti gli item della queue ordinati per voti"""
try:
# Trova tutti gli item ordinati per voti (decrescente)
items = list(queue_collection.find().sort("voti", -1))
# Converti ObjectId in stringa
for item in items:
item["_id"] = str(item["_id"])
return {"success": True, "data": items, "count": len(items)}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore lettura queue: {str(e)}")
@queue_router.get("/read/{item_id}")
async def read_item(item_id: str):
"""GET: Legge un singolo item per ID"""
try:
item = queue_collection.find_one({"id": item_id})
if item:
item["_id"] = str(item["_id"])
return {"success": True, "data": item}
else:
raise HTTPException(status_code=404, detail="Item non trovato")
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore lettura item: {str(e)}")
@queue_router.delete("/delete/{item_id}")
async def delete_item(item_id: str):
"""DELETE: Elimina un item dalla queue"""
try:
result = queue_collection.delete_one({"id": item_id})
if result.deleted_count > 0:
return {"success": True, "message": "Item eliminato dalla queue"}
else:
raise HTTPException(status_code=404, detail="Item non trovato")
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore eliminazione item: {str(e)}")
@queue_router.put("/edit/{item_id}")
async def edit_item(item_id: str, item_update: QueueItemUpdate):
"""PUT: Modifica un item nella queue"""
try:
# Prepara i campi da aggiornare
update_data = {}
for field, value in item_update.dict(exclude_unset=True).items():
if value is not None:
update_data[field] = value
if not update_data:
raise HTTPException(status_code=400, detail="Nessun campo da aggiornare")
update_data["updated_at"] = datetime.now().isoformat()
result = queue_collection.update_one(
{"id": item_id},
{"$set": update_data}
)
if result.modified_count > 0:
return {"success": True, "message": "Item aggiornato"}
else:
raise HTTPException(status_code=404, detail="Item non trovato")
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore aggiornamento item: {str(e)}")
@queue_router.patch("/vote/{item_id}")
async def update_vote(item_id: str, vote_update: VoteUpdate):
"""PATCH: Incrementa/decrementa i voti di un item"""
try:
increment_value = 1 if vote_update.increment else -1
result = queue_collection.update_one(
{"id": item_id},
{"$inc": {"voti": increment_value}}
)
if result.modified_count > 0:
# Recupera l'item aggiornato
updated_item = queue_collection.find_one({"id": item_id})
updated_item["_id"] = str(updated_item["_id"])
action = "incrementato" if vote_update.increment else "decrementato"
return {
"success": True,
"message": f"Voti {action} con successo",
"data": updated_item
}
else:
raise HTTPException(status_code=404, detail="Item non trovato")
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"Errore aggiornamento voti: {str(e)}")