72 lines
2.8 KiB
Python
Executable File
72 lines
2.8 KiB
Python
Executable File
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 |