- Add POST /admin/jobs/run-daily-snapshots (replaces 24h setInterval in server/snapshots.ts) - Add POST /admin/jobs/sync-and-simulate (syncs standings every 2h; only simulates when standings actually changed by comparing gamesPlayed + leagueRank before upserting) - Add standingsLastChangedAt + lastSimulatedAt columns to sportsSeasons (migration 0118) - Add GET /healthz route for Docker healthcheck (pings DB, returns 503 on failure) - Add app/lib/cron-auth.ts shared X-Cron-Secret header auth helper - Remove startSnapshotSystem() from server/socket.ts (no more in-process setInterval) - Add Forgejo Actions scheduled workflows: daily-snapshots.yml (00:05 UTC) and sync-and-simulate.yml (every 2h) — require CRON_SECRET repo secret Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
167 lines
6.6 KiB
TypeScript
167 lines
6.6 KiB
TypeScript
import { type RouteConfig, index, route } from "@react-router/dev/routes";
|
|
|
|
export default [
|
|
index("routes/home.tsx"),
|
|
route("i/:inviteCode", "routes/i.$inviteCode.tsx"),
|
|
route("leagues/new", "routes/leagues/new.tsx"),
|
|
route("leagues/creating", "routes/leagues/creating.tsx"),
|
|
route("leagues/:leagueId", "routes/leagues/$leagueId.tsx"),
|
|
route("leagues/:leagueId/settings", "routes/leagues/$leagueId.settings.tsx"),
|
|
route("leagues/:leagueId/audit-log", "routes/leagues/$leagueId.audit-log.tsx"),
|
|
route(
|
|
"leagues/:leagueId/upcoming-events",
|
|
"routes/leagues/$leagueId.upcoming-events.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/sports-seasons/:sportsSeasonId",
|
|
"routes/leagues/$leagueId.sports-seasons.$sportsSeasonId.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/draft/:seasonId",
|
|
"routes/leagues/$leagueId.draft.$seasonId.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/draft-queue/:seasonId",
|
|
"routes/leagues/$leagueId.draft-queue.$seasonId.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/draft-board/:seasonId",
|
|
"routes/leagues/$leagueId.draft-board.$seasonId.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/standings/:seasonId",
|
|
"routes/leagues/$leagueId.standings.$seasonId.tsx"
|
|
),
|
|
route(
|
|
"leagues/:leagueId/standings/:seasonId/teams/:teamId",
|
|
"routes/leagues/$leagueId.standings.$seasonId.teams.$teamId.tsx"
|
|
),
|
|
route("teams/:teamId/settings", "routes/teams/$teamId.settings.tsx"),
|
|
route("api/auth/*", "routes/api.auth.$.ts"),
|
|
route("api/queue/add", "routes/api/queue.add.ts"),
|
|
route("api/queue/remove", "routes/api/queue.remove.ts"),
|
|
route("api/queue/clear", "routes/api/queue.clear.ts"),
|
|
route("api/queue/reorder", "routes/api/queue.reorder.ts"),
|
|
route("api/draft/make-pick", "routes/api/draft.make-pick.ts"),
|
|
route("api/draft/start", "routes/api/draft.start.ts"),
|
|
route("api/draft/pause", "routes/api/draft.pause.ts"),
|
|
route("api/draft/resume", "routes/api/draft.resume.ts"),
|
|
route("api/draft/force-autopick", "routes/api/draft.force-autopick.ts"),
|
|
route("api/draft/force-manual-pick", "routes/api/draft.force-manual-pick.ts"),
|
|
route("api/draft/replace-pick", "routes/api/draft.replace-pick.ts"),
|
|
route("api/draft/rollback", "routes/api/draft.rollback.ts"),
|
|
route("api/draft/adjust-time-bank", "routes/api/draft.adjust-time-bank.ts"),
|
|
route("api/autodraft/update", "routes/api/autodraft.update.ts"),
|
|
route("api/watchlist/toggle", "routes/api/watchlist.toggle.ts"),
|
|
route("api/user/timezone", "routes/api/user.timezone.ts"),
|
|
route("api/upload-avatar", "routes/api.upload-avatar.ts"),
|
|
route("api/upload-team-logo", "routes/api.upload-team-logo.ts"),
|
|
route("api/upload-sport-icon", "routes/api.upload-sport-icon.ts"),
|
|
route("api/webhooks/cloudinary", "routes/api.webhooks.cloudinary.ts"),
|
|
route("api/seasons/:seasonId/draft", "routes/api/seasons.$seasonId.draft.ts"),
|
|
route("login", "routes/login.tsx"),
|
|
route("register", "routes/register.tsx"),
|
|
route("check-email", "routes/check-email.tsx"),
|
|
route("forgot-password", "routes/forgot-password.tsx"),
|
|
route("reset-password", "routes/reset-password.tsx"),
|
|
route("onboarding", "routes/onboarding.tsx"),
|
|
route("settings", "routes/settings.tsx"),
|
|
route("user-profile", "routes/user-profile-redirect.tsx"),
|
|
route("how-to-play", "routes/how-to-play.tsx"),
|
|
route("rules", "routes/rules.tsx"),
|
|
route("sports", "routes/sports.tsx"),
|
|
route("support", "routes/support.tsx"),
|
|
route("upcoming-events", "routes/upcoming-events.tsx"),
|
|
route("privacy-policy", "routes/privacy-policy.tsx"),
|
|
route("test-socket", "routes/test-socket.tsx"),
|
|
route("healthz", "routes/healthz.ts"),
|
|
|
|
// Cron job endpoints
|
|
route("admin/jobs/run-daily-snapshots", "routes/admin/jobs.run-daily-snapshots.ts"),
|
|
route("admin/jobs/sync-and-simulate", "routes/admin/jobs.sync-and-simulate.ts"),
|
|
|
|
// Admin routes
|
|
route("admin", "routes/admin.tsx", [
|
|
index("routes/admin._index.tsx"),
|
|
route("sports", "routes/admin.sports.tsx"),
|
|
route("simulators", "routes/admin.simulators.tsx"),
|
|
route("sports/new", "routes/admin.sports.new.tsx"),
|
|
route("sports/:id", "routes/admin.sports.$id.tsx"),
|
|
route("sports-seasons", "routes/admin.sports-seasons.tsx"),
|
|
route("sports-seasons/new", "routes/admin.sports-seasons.new.tsx"),
|
|
route("sports-seasons/:id", "routes/admin.sports-seasons.$id.tsx"),
|
|
route(
|
|
"sports-seasons/:id/participants",
|
|
"routes/admin.sports-seasons.$id.participants.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/events",
|
|
"routes/admin.sports-seasons.$id.events.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/events/:eventId",
|
|
"routes/admin.sports-seasons.$id.events.$eventId.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/events/:eventId/bracket",
|
|
"routes/admin.sports-seasons.$id.events.$eventId.bracket.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/events/:eventId/cs2-setup",
|
|
"routes/admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/expected-values",
|
|
"routes/admin.sports-seasons.$id.expected-values.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/simulator",
|
|
"routes/admin.sports-seasons.$id.simulator.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/futures-odds",
|
|
"routes/admin.sports-seasons.$id.futures-odds.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/elo-ratings",
|
|
"routes/admin.sports-seasons.$id.elo-ratings.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/surface-elo",
|
|
"routes/admin.sports-seasons.$id.surface-elo.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/golf-skills",
|
|
"routes/admin.sports-seasons.$id.golf-skills.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/standings",
|
|
"routes/admin.sports-seasons.$id.standings.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/regular-standings",
|
|
"routes/admin.sports-seasons.$id.regular-standings.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/simulate",
|
|
"routes/admin.sports-seasons.$id.simulate.tsx"
|
|
),
|
|
route(
|
|
"sports-seasons/:id/clone",
|
|
"routes/admin.sports-seasons.$id.clone.tsx"
|
|
),
|
|
route("participants", "routes/admin.participants.tsx"),
|
|
route("tournaments", "routes/admin.tournaments._index.tsx"),
|
|
route("tournaments/:id", "routes/admin.tournaments.$id.tsx"),
|
|
route("templates", "routes/admin.templates.tsx"),
|
|
route("templates/new", "routes/admin.templates.new.tsx"),
|
|
route("templates/:id", "routes/admin.templates.$id.tsx"),
|
|
route("data-sync", "routes/admin.data-sync.tsx"),
|
|
route("standings-snapshots", "routes/admin.standings-snapshots.tsx"),
|
|
route("users", "routes/admin.users.tsx"),
|
|
]),
|
|
route(
|
|
"api/admin/export-sports-data",
|
|
"routes/api.admin.export-sports-data.ts"
|
|
),
|
|
] satisfies RouteConfig;
|