Feature: Gründer-Aktivierung nach Hunde-Profil mit Plausibilitätsprüfung
- is_founder_pending: bei Registrierung mit Code gesetzt (statt sofort is_founder) - dogs.py: erstes Hunde-Profil → Plausibilitätsprüfung → is_founder aktivieren - Prüfung: Name min. 2 Zeichen + Buchstaben, Rasse gültig, Geburtsjahr realistisch - Settings: gelbes 'Gründer-Platz reserviert' Badge mit Link zu Hunde-Profil - Onboarding-Toast informiert über nötiges Hunde-Profil - SW by-v566, APP_VER 543
This commit is contained in:
parent
7fd71342da
commit
230455c250
6 changed files with 75 additions and 10 deletions
|
|
@ -97,9 +97,8 @@ async def register(data: RegisterRequest, response: Response, request: Request):
|
|||
"SELECT COUNT(*) FROM users WHERE is_founder=1"
|
||||
).fetchone()[0]
|
||||
if total_founders < 100:
|
||||
founder_num = total_founders + 1
|
||||
updates["is_founder"] = 1
|
||||
updates["founder_number"] = founder_num
|
||||
# Pending — wird nach erstem Hunde-Profil mit Plausibilitätsprüfung aktiviert
|
||||
updates["is_founder_pending"] = 1
|
||||
set_clause = ", ".join(f"{k}=?" for k in updates)
|
||||
conn.execute(
|
||||
f"UPDATE users SET {set_clause} WHERE id=?",
|
||||
|
|
@ -198,7 +197,7 @@ async def me(user=Depends(get_current_user)):
|
|||
"""SELECT id, name, real_name, email, rolle, is_premium, email_verified,
|
||||
bio, wohnort, erfahrung, social_link,
|
||||
profil_sichtbarkeit, avatar_url, created_at,
|
||||
is_founder, is_partner, founder_number
|
||||
is_founder, is_partner, founder_number, is_founder_pending
|
||||
FROM users WHERE id=?""",
|
||||
(user["id"],)
|
||||
).fetchone()
|
||||
|
|
|
|||
|
|
@ -78,6 +78,41 @@ async def list_dogs(user=Depends(get_current_user)):
|
|||
return result
|
||||
|
||||
|
||||
def _is_plausible_dog(name: str, rasse: str, geburtstag) -> tuple[bool, str]:
|
||||
"""Einfache Plausibilitätsprüfung für Hunde-Profile."""
|
||||
import re, datetime
|
||||
name = (name or "").strip()
|
||||
rasse = (rasse or "").strip()
|
||||
|
||||
if len(name) < 2:
|
||||
return False, "Der Name muss mindestens 2 Zeichen haben."
|
||||
if not re.search(r'[a-zA-ZäöüÄÖÜß]', name):
|
||||
return False, "Der Name muss mindestens einen Buchstaben enthalten."
|
||||
if len(set(name.lower())) < 2:
|
||||
return False, "Bitte einen echten Namen eingeben."
|
||||
|
||||
if rasse and len(rasse) < 2:
|
||||
return False, "Bitte eine gültige Rasse eingeben."
|
||||
if rasse and not re.search(r'[a-zA-ZäöüÄÖÜß]', rasse):
|
||||
return False, "Die Rasse muss Buchstaben enthalten."
|
||||
|
||||
if geburtstag:
|
||||
try:
|
||||
if isinstance(geburtstag, str):
|
||||
year = int(geburtstag[:4])
|
||||
else:
|
||||
year = geburtstag.year
|
||||
now = datetime.date.today().year
|
||||
if year > now:
|
||||
return False, "Das Geburtsdatum liegt in der Zukunft."
|
||||
if year < now - 30:
|
||||
return False, "Das Geburtsdatum ist unrealistisch."
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return True, ""
|
||||
|
||||
|
||||
@router.post("")
|
||||
async def create_dog(data: DogCreate, user=Depends(get_current_user)):
|
||||
with db() as conn:
|
||||
|
|
@ -93,6 +128,28 @@ async def create_dog(data: DogCreate, user=Depends(get_current_user)):
|
|||
"SELECT * FROM dogs WHERE user_id=? ORDER BY id DESC LIMIT 1",
|
||||
(user["id"],)
|
||||
).fetchone()
|
||||
|
||||
# Gründer-Aktivierung: erstes Hunde-Profil + is_founder_pending
|
||||
user_row = conn.execute(
|
||||
"SELECT is_founder_pending, is_founder FROM users WHERE id=?",
|
||||
(user["id"],)
|
||||
).fetchone()
|
||||
if user_row and user_row["is_founder_pending"] and not user_row["is_founder"]:
|
||||
dog_count = conn.execute(
|
||||
"SELECT COUNT(*) FROM dogs WHERE user_id=?", (user["id"],)
|
||||
).fetchone()[0]
|
||||
if dog_count == 1: # genau dieser erste Hund
|
||||
plausible, reason = _is_plausible_dog(data.name, data.rasse, data.geburtstag)
|
||||
if plausible:
|
||||
total = conn.execute(
|
||||
"SELECT COUNT(*) FROM users WHERE is_founder=1"
|
||||
).fetchone()[0]
|
||||
if total < 100:
|
||||
conn.execute(
|
||||
"UPDATE users SET is_founder=1, founder_number=?, is_founder_pending=0 WHERE id=?",
|
||||
(total + 1, user["id"])
|
||||
)
|
||||
|
||||
return dict(dog)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue