106 lines
4.2 KiB
Python
Executable File
106 lines
4.2 KiB
Python
Executable File
# /opt/docker/dev/service_finder/backend/app/seed_data.py
|
|
import asyncio
|
|
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():
|
|
async with AsyncSessionLocal() as db:
|
|
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 (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)
|
|
]
|
|
|
|
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="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()
|
|
|
|
# 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(shop)
|
|
await db.flush()
|
|
|
|
# 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)
|
|
|
|
await db.refresh(good_user)
|
|
print(f"Jó felhasználó hírneve: {good_user.reputation_score}")
|
|
|
|
print("\n--- 5. SZCENÁRIÓ B: AUTO-BAN (SPAM SZŰRÉS) ---")
|
|
fake_shop = ServiceProvider(
|
|
name="KAMU SZERVIZ",
|
|
address="Nincs ilyen utca 0.",
|
|
added_by_user_id=bad_user.id,
|
|
status=ModerationStatus.pending
|
|
)
|
|
db.add(fake_shop)
|
|
await db.flush()
|
|
|
|
# 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)
|
|
|
|
await db.refresh(bad_user)
|
|
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 Sentinel automatikusan leállította a spammert!")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(run_simulation()) |