167 lines
No EOL
5.5 KiB
Python
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)}") |