from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from typing import List from app.db.session import get_db from app.schemas.social import ServiceProviderCreate, ServiceProviderResponse, VoteCreate, LeaderboardEntry from app.models.social import ServiceProvider from app.services.social_service import vote_for_provider, get_leaderboard # Mivel még nincs teljes Auth rendszerünk a chat kontextusban, # egyelőre egy "mock" (szimulált) user függőséget használunk teszteléshez. # Később ezt lecseréljük a valós `get_current_user`-re. async def get_mock_current_user(): # Visszaadjuk a "Good Guy" user ID-ját (2) a teszthez return 2 router = APIRouter() @router.post("/providers", response_model=ServiceProviderResponse, status_code=status.HTTP_201_CREATED) async def create_provider( provider: ServiceProviderCreate, db: AsyncSession = Depends(get_db), user_id: int = Depends(get_mock_current_user) ): new_provider = ServiceProvider(**provider.model_dump(), added_by_user_id=user_id) db.add(new_provider) await db.commit() await db.refresh(new_provider) return new_provider @router.get("/providers", response_model=List[ServiceProviderResponse]) async def read_providers(skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db)): from sqlalchemy import select result = await db.execute(select(ServiceProvider).offset(skip).limit(limit)) return result.scalars().all() # --- ÚJ VÉGPONTOK (A Prompt alapján) --- @router.post("/providers/{provider_id}/vote") async def vote( provider_id: int, vote_data: VoteCreate, db: AsyncSession = Depends(get_db), user_id: int = Depends(get_mock_current_user) ): """Szavazás egy szolgáltatóra. A rendszer automatikusan kezeli a hírnevet és pontokat.""" if vote_data.vote_value not in [1, -1]: raise HTTPException(status_code=400, detail="Vote value must be 1 or -1") result = await vote_for_provider(db, user_id, provider_id, vote_data.vote_value) if "error" in result: raise HTTPException(status_code=400, detail=result["error"]) return result @router.get("/competitions/{competition_id}/leaderboard", response_model=List[LeaderboardEntry]) async def get_competition_leaderboard(competition_id: int, db: AsyncSession = Depends(get_db)): """Ranglista lekérése az adott versenyhez.""" results = await get_leaderboard(db, competition_id) leaderboard_data = [] for rank, (score, full_name) in enumerate(results, start=1): # A service UserScore objektumot és nevet ad vissza, ezt alakítjuk át leaderboard_data.append( LeaderboardEntry( username=full_name or "Anonymous", points=score.points, rank=rank ) ) return leaderboard_data