No description
  • Go 94.4%
  • Bru 5.3%
  • Dockerfile 0.3%
Find a file
2026-03-06 12:06:39 +03:00
cmd/content feat(leaderboard): anti-cheat v1.1 + ranked submit observability (#8) 2026-02-20 19:41:46 +03:00
deploy Backend daily reset policy: server dayKey + /v1/daily-context (#3) 2026-02-13 18:40:59 +03:00
migrations feat(leaderboard): enforce single counted run per player/day (#6) 2026-02-19 10:34:57 +03:00
tools/bruno/ruwords-api bruno: store packVersion env var as string in manifest script (#9) 2026-03-06 12:06:39 +03:00
.gitignore chore: add Bruno collection for ruwords-api manual testing (#5) 2026-02-17 10:58:02 +03:00
AGENTS.md Initial split from apps.waldemarleo.com monorepo 2026-02-12 10:22:52 +03:00
go.mod Initial split from apps.waldemarleo.com monorepo 2026-02-12 10:22:52 +03:00
go.sum Initial split from apps.waldemarleo.com monorepo 2026-02-12 10:22:52 +03:00
openapi.yaml feat(leaderboard): anti-cheat v1.1 + ranked submit observability (#8) 2026-02-20 19:41:46 +03:00
README.md Backend daily reset policy: server dayKey + /v1/daily-context (#3) 2026-02-13 18:40:59 +03:00

ruwords-api

Backend API for RuWords.

Current scope:

  • cmd/content — content delivery API (/content/v1/*)
  • leaderboard MVP API (/v1/ranked-runs, /v1/leaderboards/*)
  • daily boundary context API (/v1/daily-context)

Project layout

  • cmd/content/ — HTTP server (content + leaderboard handlers)
  • migrations/ — SQL migrations for leaderboard tables
  • openapi.yaml — API contract
  • deploy/ — Docker + Caddy deployment templates

Local run

Content-only mode (default)

CONTENT_ROOT=./content/prod \
PORT=8080 \
go run ./cmd/content serve

Content + leaderboard mode

LEADERBOARD_ENABLED=true \
LEADERBOARD_DATABASE_URL='postgres://analytics:password@127.0.0.1:5432/ruwords_staging?sslmode=disable' \
LEADERBOARD_BEARER_TOKEN='dev_token' \
CONTENT_ROOT=./content/prod \
PORT=8080 \
go run ./cmd/content serve

Validate release layout

go run ./cmd/content validate --root ./content/prod

Build and test

go fmt ./...
go test ./...
go build ./cmd/content

Leaderboard configuration

Environment variables:

  • LEADERBOARD_ENABLED (default: false)
  • LEADERBOARD_DATABASE_URL (required when enabled)
  • LEADERBOARD_BEARER_TOKEN (required when enabled)
  • LEADERBOARD_EXPECTED_QUESTION_COUNT (default: 15)
  • LEADERBOARD_MAX_BODY_BYTES (default: 65536)
  • LEADERBOARD_DEFAULT_LIMIT (default: 50)
  • LEADERBOARD_MAX_LIMIT (default: 100)
  • DAILY_RESET_TIMEZONE (default: Europe/Moscow)
  • DAILY_RESET_HOUR (default: 0)
  • DAILY_RESET_MINUTE (default: 0)

Daily context endpoint (GET /v1/daily-context) returns server-authoritative dayKey, nextResetAt, and secondsToReset for countdown UI and fair day rollover.

Migrations

Compatible with migrate/migrate:

migrate -path ./migrations -database "$LEADERBOARD_DATABASE_URL" up