Files
website/dev/populate-db/populate.py
T
2026-07-13 21:07:08 -04:00

91 lines
2.7 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
import argparse
import os
import sys
import requests
def fetch_json(api_root, path):
url = f"{api_root}{path}"
resp = requests.get(url, timeout=30)
resp.raise_for_status()
return resp.json()
def main():
parser = argparse.ArgumentParser(
description="Populate a local instance from production data via REST"
)
parser.add_argument(
"--source",
default=os.environ.get("PHENIX_SOURCE_URL", "https://ballephenix.com"),
help="Source API root (default: https://ballephenix.com)",
)
parser.add_argument(
"--target",
default=os.environ.get("PHENIX_TARGET_URL", "http://localhost:5000"),
help="Target API root (default: http://localhost:5000)",
)
parser.add_argument(
"--force",
action="store_true",
help="Clear existing games before inserting",
)
args = parser.parse_args()
source_root = args.source.rstrip("/")
target_root = args.target.rstrip("/")
years = fetch_json(source_root, "/api/available-years.json")
print(f"Years on source: {len(years)} ({min(years)}–{max(years)})")
all_games = []
for year in years:
games = fetch_json(source_root, f"/api/results/{year}.json")
all_games.extend(games)
print(f"Total games fetched: {len(all_games)}")
if args.force:
resp = requests.delete(f"{target_root}/api/games", timeout=30)
if resp.status_code not in (204, 200):
print(f"Failed to clear games: {resp.status_code} {resp.text}", file=sys.stderr)
sys.exit(1)
print("Cleared existing games")
inserted = 0
skipped = 0
errors = 0
for g in all_games:
payload = {
"date": g.get("date", ""),
"time": g.get("time", ""),
"home": g.get("home", ""),
"away": g.get("away", ""),
"homeScore": g.get("homeScore"),
"awayScore": g.get("awayScore"),
"practice": bool(g.get("practice")),
"rain": bool(g.get("rain")),
}
try:
resp = requests.post(f"{target_root}/api/games", json=payload, timeout=30)
if resp.status_code == 201:
inserted += 1
elif resp.status_code == 409:
skipped += 1
else:
print(f"Error on {g.get('date')} {g.get('time')}: {resp.status_code} {resp.text}", file=sys.stderr)
errors += 1
except requests.RequestException as e:
print(f"Request error on {g.get('date')} {g.get('time')}: {e}", file=sys.stderr)
errors += 1
print(f"Inserted: {inserted}, skipped: {skipped}, errors: {errors}")
print(f"Target: {target_root}")
if __name__ == "__main__":
main()