first commit

This commit is contained in:
2026-04-20 11:56:11 +03:00
commit 8d80fadb56
103 changed files with 19756 additions and 0 deletions

View File

@@ -0,0 +1,153 @@
from db import get_connection
from repositories.team_repository import get_team_id_by_external_id
def replace_standings_for_season(season: str, standings_rows: list[dict]) -> None:
delete_query = """
DELETE FROM standings
WHERE season = %s;
"""
insert_query = """
INSERT INTO standings (
team_id,
season,
played,
wins,
losses,
draws,
points_for,
points_against,
points,
position,
created_at,
updated_at
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW());
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(delete_query, (season,))
for row in standings_rows:
team_external_id = row["team_external_id"]
team_id = get_team_id_by_external_id(team_external_id)
if team_id is None:
raise ValueError(f"Team not found by external_id: {team_external_id}")
cur.execute(
insert_query,
(
team_id,
season,
row.get("played", 0),
row.get("wins", 0),
row.get("losses", 0),
row.get("draws", 0),
row.get("points_for", 0),
row.get("points_against", 0),
row.get("points", 0),
row.get("position"),
),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def get_standings_by_season(season: str):
query = """
SELECT
s.id,
s.team_id,
t.name AS team_name,
s.season,
s.played,
s.wins,
s.losses,
s.draws,
s.points_for,
s.points_against,
s.points,
s.position,
s.created_at,
s.updated_at
FROM standings s
JOIN teams t ON t.id = s.team_id
WHERE s.season = %s
ORDER BY s.position ASC NULLS LAST, s.id ASC;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(query, (season,))
return cur.fetchall()
finally:
conn.close()
def get_standings_by_match_id(match_id: int) -> list[dict]:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT m.season, m.tour
FROM matches m
WHERE m.id = %s
""",
(match_id,),
)
base = cur.fetchone()
if not base:
return []
season = base[0]
cur.execute(
"""
SELECT
s.position,
t.logo_url,
t.name,
s.played,
s.wins,
s.draws,
s.losses,
s.points_for,
s.points_against,
s.points
FROM standings s
JOIN teams t ON t.id = s.team_id
WHERE s.season = %s
ORDER BY s.position ASC, s.points DESC, s.team_id ASC
""",
(season,),
)
rows = cur.fetchall()
return [
{
"position": r[0],
"team_logo": r[1] or "",
"team_name": r[2] or "",
"played": r[3] or 0,
"wins": r[4] or 0,
"draws": r[5] or 0,
"losses": r[6] or 0,
"goals_for": r[7] or 0,
"goals_against": r[8] or 0,
"points": r[9] or 0,
}
for r in rows
]
finally:
conn.close()