253 lines
5.8 KiB
Python
253 lines
5.8 KiB
Python
import secrets
|
|
|
|
from db import get_connection
|
|
|
|
|
|
def create_match_session(
|
|
match_id: int,
|
|
operator_name: str | None = None,
|
|
vmix_project_path: str | None = None,
|
|
):
|
|
session_token = secrets.token_urlsafe(24)
|
|
|
|
query = """
|
|
INSERT INTO match_sessions (
|
|
match_id,
|
|
operator_name,
|
|
session_token,
|
|
vmix_project_path,
|
|
is_active,
|
|
created_at,
|
|
updated_at
|
|
)
|
|
VALUES (%s, %s, %s, %s, TRUE, NOW(), NOW())
|
|
RETURNING id, match_id, operator_name, session_token, vmix_project_path, is_active, created_at, updated_at;
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(
|
|
query, (match_id, operator_name, session_token, vmix_project_path)
|
|
)
|
|
row = cur.fetchone()
|
|
conn.commit()
|
|
return row
|
|
except Exception:
|
|
conn.rollback()
|
|
raise
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def get_match_session_by_token(session_token: str):
|
|
query = """
|
|
SELECT
|
|
ms.id,
|
|
ms.match_id,
|
|
ms.operator_name,
|
|
ms.session_token,
|
|
ms.vmix_project_path,
|
|
ms.is_active,
|
|
ms.created_at,
|
|
ms.updated_at,
|
|
|
|
m.external_id AS match_external_id,
|
|
m.match_date,
|
|
m.tour,
|
|
m.season,
|
|
m.place,
|
|
|
|
ht.id AS home_team_id,
|
|
ht.name AS home_team_name,
|
|
ht.logo_url AS home_team_logo,
|
|
ht.logo_path AS home_team_logo_path,
|
|
|
|
at.id AS away_team_id,
|
|
at.name AS away_team_name,
|
|
at.logo_url AS away_team_logo,
|
|
at.logo_path AS away_team_logo_path
|
|
|
|
FROM match_sessions ms
|
|
JOIN matches m ON m.id = ms.match_id
|
|
JOIN teams ht ON ht.id = m.home_team_id
|
|
JOIN teams at ON at.id = m.away_team_id
|
|
WHERE ms.session_token = %s
|
|
LIMIT 1;
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, (session_token,))
|
|
return cur.fetchone()
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def deactivate_match_session(session_token: str) -> None:
|
|
query = """
|
|
UPDATE match_sessions
|
|
SET is_active = FALSE,
|
|
updated_at = NOW()
|
|
WHERE session_token = %s;
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, (session_token,))
|
|
conn.commit()
|
|
except Exception:
|
|
conn.rollback()
|
|
raise
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def update_match_session_vmix_path(session_token: str, vmix_project_path: str) -> None:
|
|
query = """
|
|
UPDATE match_sessions
|
|
SET vmix_project_path = %s,
|
|
updated_at = NOW()
|
|
WHERE session_token = %s;
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, (vmix_project_path, session_token))
|
|
conn.commit()
|
|
except Exception:
|
|
conn.rollback()
|
|
raise
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def get_match_by_id(match_id: int):
|
|
query = """
|
|
SELECT
|
|
m.id,
|
|
m.external_id,
|
|
m.match_date,
|
|
m.tour,
|
|
m.season,
|
|
ht.name AS home_team_name,
|
|
at.name AS away_team_name
|
|
FROM matches m
|
|
JOIN teams ht ON ht.id = m.home_team_id
|
|
JOIN teams at ON at.id = m.away_team_id
|
|
WHERE m.id = %s
|
|
LIMIT 1;
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, (match_id,))
|
|
return cur.fetchone()
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def list_matches_for_admin(today_only: bool = False, tour: str | None = None):
|
|
query = """
|
|
SELECT
|
|
m.id,
|
|
m.external_id,
|
|
m.match_date,
|
|
m.status,
|
|
m.tour,
|
|
m.season,
|
|
ht.name AS home_team_name,
|
|
at.name AS away_team_name
|
|
FROM matches m
|
|
JOIN teams ht ON ht.id = m.home_team_id
|
|
JOIN teams at ON at.id = m.away_team_id
|
|
WHERE 1=1
|
|
"""
|
|
params = []
|
|
|
|
if today_only:
|
|
query += " AND DATE(m.match_date) = CURRENT_DATE "
|
|
|
|
if tour:
|
|
query += " AND m.tour = %s "
|
|
params.append(tour)
|
|
|
|
query += " ORDER BY m.match_date ASC NULLS LAST, m.id ASC; "
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, params)
|
|
return cur.fetchall()
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def list_available_tours():
|
|
query = """
|
|
SELECT DISTINCT tour
|
|
FROM matches
|
|
WHERE tour IS NOT NULL AND tour <> '';
|
|
"""
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query)
|
|
tours = [row[0] for row in cur.fetchall()]
|
|
|
|
def extract_tour_number(value: str):
|
|
value = str(value).strip()
|
|
digits = "".join(ch for ch in value if ch.isdigit())
|
|
return int(digits) if digits else 999999
|
|
|
|
tours.sort(key=lambda x: (extract_tour_number(x), str(x)))
|
|
return tours
|
|
finally:
|
|
conn.close()
|
|
|
|
def list_matches_for_admin(
|
|
today_only: bool = False,
|
|
tour: str | None = None,
|
|
hide_finished: bool = True,
|
|
):
|
|
query = """
|
|
SELECT
|
|
m.id,
|
|
m.external_id,
|
|
m.match_date,
|
|
m.status,
|
|
m.tour,
|
|
m.season,
|
|
ht.name AS home_team_name,
|
|
at.name AS away_team_name
|
|
FROM matches m
|
|
JOIN teams ht ON ht.id = m.home_team_id
|
|
JOIN teams at ON at.id = m.away_team_id
|
|
WHERE 1=1
|
|
"""
|
|
params = []
|
|
|
|
if today_only:
|
|
query += " AND DATE(m.match_date) = CURRENT_DATE "
|
|
|
|
if tour:
|
|
query += " AND m.tour = %s "
|
|
params.append(tour)
|
|
|
|
if hide_finished:
|
|
query += " AND COALESCE(m.status, 'scheduled') <> 'finished' "
|
|
|
|
query += " ORDER BY m.match_date ASC NULLS LAST, m.id ASC; "
|
|
|
|
conn = get_connection()
|
|
try:
|
|
with conn.cursor() as cur:
|
|
cur.execute(query, params)
|
|
return cur.fetchall()
|
|
finally:
|
|
conn.close() |