asvs's picture
Claude Sonnet 4.6
Refactor: split monolithic app.py into maintainable modules
c04d3f9
Raw
History Blame Contribute Delete
4.26 kB
"""CRUD operations: add, update, and delete matches via Supabase."""
from datetime import datetime
from config import supabase, IST, logger
import data
def add_match(home, away, home_goals, away_goals):
"""Validate and insert a new match into Supabase and the in-memory cache."""
if not home or not away or not home.strip() or not away.strip():
return "Error: Team names cannot be empty!"
home = home.strip()
away = away.strip()
if home == away:
return "Error: Home and away teams must be different!"
if home_goals < 0 or away_goals < 0:
return "Error: Goals must be non-negative!"
logger.info(f"-> Adding match: {home} {int(home_goals)} - {int(away_goals)} {away}")
try:
match_datetime = datetime.now(IST).isoformat()
response = supabase.table("matches").insert({
"home": home,
"away": away,
"home_goals": int(home_goals),
"away_goals": int(away_goals),
"datetime": match_datetime
}).execute()
if response.data:
record = response.data[0]
match_id = str(record["id"])
match_entry = [match_id, home, away, int(home_goals), int(away_goals), record["datetime"]]
data.matches.append(match_entry)
logger.info(f" ✓ Match ID: {match_id}")
return f"Match added: {home} {int(home_goals)}{int(away_goals)} {away}"
else:
return "Match added locally but Supabase returned no data"
except Exception as e:
logger.error(f" ✗ Error saving to Supabase: {e}")
return f"Error: Failed to save match — {e}"
def delete_match_by_id(match_id):
"""Delete a match from Supabase and remove it from the in-memory cache."""
try:
supabase.table("matches").delete().eq("id", match_id).execute()
for i, match in enumerate(data.matches):
if match[0] == match_id:
data.matches.pop(i)
break
logger.info(f" ✓ Match {match_id} deleted")
return True
except Exception as e:
logger.error(f" ✗ Error deleting: {e}")
return False
def update_match(row_number, new_home, new_away, new_home_goals, new_away_goals):
"""Update an existing match (identified by display row number) in Supabase and the cache."""
if row_number is None or row_number < 1:
return "Error: Please enter a valid row number!"
sorted_matches = sorted(data.matches, key=lambda x: x[5], reverse=True)
row_idx = int(row_number) - 1
if row_idx >= len(sorted_matches) or row_idx < 0:
return f"Error: Row {int(row_number)} does not exist! Valid rows: 1–{len(sorted_matches)}"
if not new_home or not new_away or not new_home.strip() or not new_away.strip():
return "Error: Team names cannot be empty!"
new_home = new_home.strip()
new_away = new_away.strip()
if new_home == new_away:
return "Error: Home and away teams must be different!"
if new_home_goals < 0 or new_away_goals < 0:
return "Error: Goals must be non-negative!"
sorted_match = sorted_matches[row_idx]
match_id = sorted_match[0]
try:
update_datetime = datetime.now(IST).isoformat()
response = supabase.table("matches").update({
"home": new_home,
"away": new_away,
"home_goals": int(new_home_goals),
"away_goals": int(new_away_goals),
"updated_at": update_datetime
}).eq("id", match_id).execute()
if response.data:
for i, match in enumerate(data.matches):
if match[0] == match_id:
data.matches[i][1] = new_home
data.matches[i][2] = new_away
data.matches[i][3] = int(new_home_goals)
data.matches[i][4] = int(new_away_goals)
break
return f"Updated row {int(row_number)}: {new_home} {int(new_home_goals)}{int(new_away_goals)} {new_away}"
else:
return "Error: Update returned no data"
except Exception as e:
logger.error(f" ✗ Error updating: {e}")
return f"Error: Failed to update match — {e}"