STABLE: Final schema sync, optimized gitignore

This commit is contained in:
Kincses
2026-02-26 08:19:25 +01:00
parent 893f39fa15
commit 505543330a
203 changed files with 11590 additions and 9542 deletions

View File

@@ -1,118 +1,106 @@
# /opt/docker/dev/service_finder/backend/app/seed_data.py
import asyncio
import sys
import os
# Útvonal beállítása
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
# --- JAVÍTÁS 1: A Helyes Aszinkron Session Importálása ---
from app.db.session import AsyncSessionLocal
# ---------------------------------------------------------
from app.models.user import User
from app.models.social import ServiceProvider, Competition, ModerationStatus
from app.services.social_service import vote_for_provider
from sqlalchemy import text
from datetime import datetime, timedelta
import uuid
from datetime import datetime, timedelta, timezone
from sqlalchemy import text, select
from app.database import AsyncSessionLocal
from app.models.identity import User, Person, UserRole
from app.models.social import ServiceProvider, Vote, ModerationStatus, Competition
from app.services.social_service import SocialService
from app.core.security import get_password_hash
async def run_simulation():
# --- JAVÍTÁS 2: Itt is az AsyncSessionLocal-t használjuk ---
async with AsyncSessionLocal() as db:
# -----------------------------------------------------------
print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---")
# Kaszkádolt törlés a data sémában
await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE"))
print("--- 1. TAKARÍTÁS (MB2.0 Séma-tisztítás) ---")
# Szigorú sorrend a kényszerek miatt (Cascade)
await db.execute(text("TRUNCATE identity.users, identity.persons, data.service_providers, data.votes, data.competitions RESTART IDENTITY CASCADE"))
await db.commit()
print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---")
# Admin
admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True)
# Jófiú (aki valós boltokat tölt fel)
good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5)
# Rosszfiú (aki fake boltokat tölt fel)
bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz
# Szavazóközönség
voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1")
voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2")
voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3")
voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4")
voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5")
db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5])
await db.commit()
print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA (Person + User) ---")
users_to_create = [
("admin@test.com", "Adminisztrátor", UserRole.superadmin),
("good@test.com", "Rendes Srác", UserRole.user),
("bad@test.com", "Spammer Aladár", UserRole.user),
("voter@test.com", "Szavazó Gép", UserRole.user)
]
# ID-k lekérése
for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]:
await db.refresh(u)
created_users = {}
for email, name, role in users_to_create:
p = Person(id_uuid=uuid.uuid4(), first_name=name.split()[0], last_name=name.split()[1], is_active=True)
db.add(p)
await db.flush()
u = User(
email=email,
hashed_password=get_password_hash("test1234"),
person_id=p.id,
role=role,
is_active=True,
reputation_score=5 if "good" in email else (-8 if "bad" in email else 0)
)
db.add(u)
await db.flush()
created_users[email] = u
await db.commit()
print("\n--- 3. VERSENY INDÍTÁSA ---")
race = Competition(
name="Nagy Januári Verseny",
description="Töltsd fel a legtöbb boltot!",
start_date=datetime.utcnow() - timedelta(days=1),
end_date=datetime.utcnow() + timedelta(days=30),
name="Téli Szervizvadászat",
start_date=datetime.now(timezone.utc) - timedelta(days=1),
end_date=datetime.now(timezone.utc) + timedelta(days=30),
is_active=True
)
db.add(race)
await db.commit()
await db.refresh(race)
print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---")
# Good Guy feltölt egy boltot
good_shop = ServiceProvider(
name="Korrekt Gumiszerviz",
address="Fő utca 1.",
# Szereplők kiemelése a szimulációhoz
good_user = created_users["good@test.com"]
bad_user = created_users["bad@test.com"]
voter = created_users["voter@test.com"]
print("\n--- 4. SZCENÁRIÓ A: POZITÍV VALIDÁCIÓ ---")
# Rendes srác beküld egy szervizt
shop = ServiceProvider(
name="Profi Gumis",
address="Budapest, Váci út 10.",
added_by_user_id=good_user.id,
status=ModerationStatus.pending
)
db.add(good_shop)
await db.commit()
await db.refresh(good_shop)
db.add(shop)
await db.flush()
# A tömeg megszavazza (Kell 5 pont az elfogadáshoz)
print(f"Szavazás a '{good_shop.name}' boltra...")
await vote_for_provider(db, voter1.id, good_shop.id, 1)
await vote_for_provider(db, voter2.id, good_shop.id, 1)
await vote_for_provider(db, voter3.id, good_shop.id, 1)
await vote_for_provider(db, voter4.id, good_shop.id, 1)
await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt!
# Szavazatok szimulálása (SocialService használatával a pontszámítás miatt)
print(f"Szavazás a '{shop.name}'-re...")
# Szimulálunk 5 pozitív szavazatot különböző "virtuális" szavazóktól
for _ in range(5):
await SocialService.vote_for_provider(db, voter.id, shop.id, 1)
# Eredmény ellenőrzése
await db.refresh(good_user)
print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}")
# Pontszám ellenőrzése
points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}"))
scalar_points = points.scalar()
print(f"Good Guy Verseny Pontjai (Elvárt: 10): {scalar_points}")
print(f"Jó felhasználó hírneve: {good_user.reputation_score}")
print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---")
# Bad Guy feltölt egy fake boltot
print("\n--- 5. SZCENÁRIÓ B: AUTO-BAN (SPAM SZŰRÉS) ---")
fake_shop = ServiceProvider(
name="KAMU Bolt",
address="Nincs ilyen utca",
name="KAMU SZERVIZ",
address="Nincs ilyen utca 0.",
added_by_user_id=bad_user.id,
status=ModerationStatus.pending
)
db.add(fake_shop)
await db.commit()
await db.refresh(fake_shop)
await db.flush()
# A tömeg leszavazza (Kell -3 az elutasításhoz)
print(f"Szavazás a '{fake_shop.name}' boltra...")
await vote_for_provider(db, voter1.id, fake_shop.id, -1)
await vote_for_provider(db, voter2.id, fake_shop.id, -1)
await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at!
# Leszavazás (Kell -3 a bukáshoz)
print("Spam jelentése...")
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1)
# Eredmény ellenőrzése
await db.refresh(bad_user)
print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}")
print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}")
print(f"Rossz felhasználó hírneve: {bad_user.reputation_score}")
print(f"Fiók státusza: {'KITILTVA' if not bad_user.is_active else 'AKTÍV'}")
if not bad_user.is_active:
print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!")
else:
print("❌ HIBA: A felhasználó még mindig aktív.")
print("✅ SIKER: A Sentinel automatikusan leállította a spammert!")
if __name__ == "__main__":
asyncio.run(run_simulation())