Files
service-finder/code-server-config/data/User/History/-26d8d76b/fw3n.py

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