átlagos kiegészítséek jó sok
This commit is contained in:
@@ -4,7 +4,9 @@ from sqlalchemy import select, and_, text
|
||||
from typing import List, Optional
|
||||
from app.db.session import get_db
|
||||
from app.services.gamification_service import GamificationService
|
||||
from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise
|
||||
from app.services.config_service import ConfigService
|
||||
from app.services.security_auditor import SecurityAuditorService
|
||||
from app.models.marketplace.service import ServiceProfile, ExpertiseTag, ServiceExpertise
|
||||
from app.services.marketplace_service import (
|
||||
create_verified_review,
|
||||
get_service_reviews,
|
||||
@@ -19,24 +21,92 @@ router = APIRouter()
|
||||
# --- 🎯 SZERVIZ VADÁSZAT (Service Hunt) ---
|
||||
@router.post("/hunt")
|
||||
async def register_service_hunt(
|
||||
name: str = Form(...),
|
||||
lat: float = Form(...),
|
||||
lng: float = Form(...),
|
||||
name: str = Form(...),
|
||||
lat: float = Form(...),
|
||||
lng: float = Form(...),
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
""" Új szerviz-jelölt rögzítése a staging táblába jutalompontért. """
|
||||
# Új szerviz-jelölt rögzítése
|
||||
await db.execute(text("""
|
||||
INSERT INTO marketplace.service_staging (name, fingerprint, status, raw_data)
|
||||
VALUES (:n, :f, 'pending', jsonb_build_object('lat', :lat, 'lng', :lng))
|
||||
"""), {"n": name, "f": f"{name}-{lat}-{lng}", "lat": lat, "lng": lng})
|
||||
INSERT INTO marketplace.service_staging (name, fingerprint, status, city, submitted_by, raw_data)
|
||||
VALUES (:n, :f, 'pending', 'Unknown', :user_id, jsonb_build_object('lat', CAST(:lat AS double precision), 'lng', CAST(:lng AS double precision)))
|
||||
"""), {"n": name, "f": f"{name}-{lat}-{lng}", "lat": lat, "lng": lng, "user_id": current_user.id})
|
||||
|
||||
# MB 2.0 Gamification: 50 pont a felfedezésért
|
||||
# TODO: A 1-es ID helyett a bejelentkezett felhasználót kell használni (current_user.id)
|
||||
await GamificationService.award_points(db, 1, 50, f"Service Hunt: {name}")
|
||||
# MB 2.0 Gamification: Dinamikus pontszám a felfedezésért
|
||||
reward_points = await ConfigService.get_int(db, "GAMIFICATION_HUNT_REWARD", 50)
|
||||
await GamificationService.award_points(db, current_user.id, reward_points, f"Service Hunt: {name}")
|
||||
await db.commit()
|
||||
return {"status": "success", "message": "Discovery registered and points awarded."}
|
||||
|
||||
# --- ✅ SZERVIZ VALIDÁLÁS (Service Validation) ---
|
||||
@router.post("/hunt/{staging_id}/validate")
|
||||
async def validate_staged_service(
|
||||
staging_id: int,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Validálja egy másik felhasználó által beküldött szerviz-jelöltet.
|
||||
Növeli a validation_level-t 10-zel (max 80), adományoz 10 XP-t,
|
||||
és növeli a places_validated számlálót a felhasználó statisztikáiban.
|
||||
"""
|
||||
# Anti-Cheat: Rapid Fire ellenőrzés
|
||||
await SecurityAuditorService.check_rapid_fire_validation(db, current_user.id)
|
||||
|
||||
# 1. Keresd meg a staging rekordot
|
||||
result = await db.execute(
|
||||
text("SELECT id, submitted_by, validation_level FROM marketplace.service_staging WHERE id = :id"),
|
||||
{"id": staging_id}
|
||||
)
|
||||
staging = result.fetchone()
|
||||
if not staging:
|
||||
raise HTTPException(status_code=404, detail="Staging record not found")
|
||||
|
||||
# 2. Ha a saját beküldését validálná, hiba
|
||||
if staging.submitted_by == current_user.id:
|
||||
raise HTTPException(status_code=400, detail="Cannot validate your own submission")
|
||||
|
||||
# 3. Növeld a validation_level-t 10-zel (max 80)
|
||||
new_level = staging.validation_level + 10
|
||||
if new_level > 80:
|
||||
new_level = 80
|
||||
|
||||
# 4. UPDATE a validation_level és a status (ha elérte a 80-at, akkor "verified"?)
|
||||
# Jelenleg csak a validation_level frissítése
|
||||
await db.execute(
|
||||
text("""
|
||||
UPDATE marketplace.service_staging
|
||||
SET validation_level = :new_level
|
||||
WHERE id = :id
|
||||
"""),
|
||||
{"new_level": new_level, "id": staging_id}
|
||||
)
|
||||
|
||||
# 5. Adományozz dinamikus XP-t a current_user-nek a GamificationService-en keresztül
|
||||
validation_reward = await ConfigService.get_int(db, "GAMIFICATION_VALIDATE_REWARD", 10)
|
||||
await GamificationService.award_points(db, current_user.id, validation_reward, f"Service Validation: staging #{staging_id}")
|
||||
|
||||
# 6. Növeld a current_user places_validated értékét a UserStats-ban
|
||||
await db.execute(
|
||||
text("""
|
||||
UPDATE gamification.user_stats
|
||||
SET places_validated = places_validated + 1
|
||||
WHERE user_id = :user_id
|
||||
"""),
|
||||
{"user_id": current_user.id}
|
||||
)
|
||||
|
||||
await db.commit()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Validation successful",
|
||||
"validation_level": new_level,
|
||||
"places_validated_incremented": True
|
||||
}
|
||||
|
||||
# --- 🔍 SZERVIZ KERESŐ (Service Search) ---
|
||||
@router.get("/search")
|
||||
async def search_services(
|
||||
|
||||
Reference in New Issue
Block a user