HNS endpoints: /clan/{id}/hns-career + /klubovi/pgz-financirani + /dashboard/hns-coverage

Backed by: pgz_sport.hns_player_seasons, hns_klub_roster, v_pgz_financirani_klubovi
Used by: cc-hns subagents for UI integration
This commit is contained in:
2026-05-05 10:22:36 +02:00
parent a20230187f
commit c68fd4471e
5 changed files with 651 additions and 1 deletions
+74
View File
@@ -1998,6 +1998,80 @@ except Exception as e:
print(f'[DEBUG] router fail: {e}')
@app.get("/api/v2/clan/{clan_id}/hns-career")
def clan_hns_career(clan_id: int):
"""HNS karijera za sportaša: sezone + utakmice."""
seasons = fetch("""
SELECT sezona, klub_naziv, natjecanje, nastupi, startna, zamjena, golovi, asistencije, zuti, crveni, minute
FROM pgz_sport.hns_player_seasons
WHERE clan_id = %s
ORDER BY sezona DESC
""", (clan_id,))
matches = fetch("""
SELECT datum, natjecanje, domacin, gost, rezultat, pozicija, startna, golovi, asistencije, zuti, crveni
FROM pgz_sport.hns_player_matches
WHERE clan_id = %s
ORDER BY datum DESC NULLS LAST
LIMIT 50
""", (clan_id,))
# Stats roll-up
summary = fetch("""
SELECT
count(DISTINCT sezona) AS sezona_broj,
sum(nastupi) AS ukupno_nastupi,
sum(golovi) AS ukupno_golovi,
sum(asistencije) AS ukupno_asistencije,
sum(zuti) AS ukupno_zuti,
sum(crveni) AS ukupno_crveni
FROM pgz_sport.hns_player_seasons WHERE clan_id = %s
""", (clan_id,))
return {
"clan_id": clan_id,
"summary": summary[0] if summary else {},
"seasons": seasons,
"matches": matches,
"total_seasons": len(seasons),
"total_matches": len(matches),
}
@app.get("/api/v2/klubovi/pgz-financirani")
def klubovi_pgz_financirani(sport: str = None, limit: int = 500):
"""PGŽ financirani klubovi — koji su primili novce iz potpora."""
where_extra = ""
params = []
if sport:
where_extra = " WHERE sport = %s"
params.append(sport)
rows = fetch(f"""
SELECT k.*,
(SELECT count(*) FROM pgz_sport.clanovi WHERE klub_id = k.id) AS sportasa_count,
(SELECT count(*) FROM pgz_sport.hns_klub_roster WHERE klub_id = k.id) AS hns_roster_count,
(SELECT count(*) FROM pgz_sport.potpore_nositelji WHERE klub_id = k.id OR naziv_kluba ILIKE k.naziv) AS potpora_count,
(SELECT sum(iznos) FROM pgz_sport.potpore_nositelji WHERE klub_id = k.id OR naziv_kluba ILIKE k.naziv) AS potpora_ukupno
FROM pgz_sport.v_pgz_financirani_klubovi k
{where_extra}
ORDER BY potpora_ukupno DESC NULLS LAST
LIMIT %s
""", tuple(params) + (limit,))
return {"count": len(rows), "rows": rows}
@app.get("/api/v2/dashboard/hns-coverage")
def dashboard_hns_coverage():
"""HNS Coverage widget data."""
stats = fetch("""
SELECT
(SELECT count(*) FROM pgz_sport.v_pgz_financirani_klubovi WHERE sport='nogomet' AND source_url LIKE %s) AS klubova_target,
(SELECT count(DISTINCT klub_id) FROM pgz_sport.hns_klub_roster) AS klubova_scraped,
(SELECT count(*) FROM pgz_sport.clanovi WHERE hns_igrac_id IS NOT NULL) AS sportasa_s_hns,
(SELECT count(*) FROM pgz_sport.hns_klub_roster) AS roster_total,
(SELECT count(*) FROM pgz_sport.hns_player_seasons) AS seasons_total,
(SELECT max(scraped_at) FROM pgz_sport.hns_klub_roster) AS last_sync
""", ('%semafor.hns.family/klubovi%',))
return stats[0] if stats else {}
@app.get("/")
def root(request: Request):
host = request.headers.get("host", "")