Files
vtuber-awards/Backend
AzuTear b53c7fb736 Add viewer-range categories, nomination tracking, dynamic showact form, session timeout, share URLs, and workflow-per-season
Features:
- Category viewer ranges + subcategory templates (admin group modal, tree workspace)
- Nomination enrichment via TwitchTracker API (NominationEnrichmentService,
  TwitchTrackerViewerStatsProvider) with admin tracking rules editor
- Nomination group tracker: CategoryGroupName as primary identifier,
  CategoryId stays as nullable legacy field; StreamerIdentity table
- Dynamic showact application form builder (AdminShowactFormBuilder,
  ShowactApplicationSchedule)
- Session idle timeout setting (AdminSessionTimeoutCard)
- Share URLs for X and Discord (SiteSettings, public extras)
- Workflow rules now stored per season (falls back to global SiteSettings)
- New admin routes: settings/access, settings/workflows, tracking-rules
- New admin review workspace with subcategory tabs
- AdminCategoriesView rebuilt with group/subcategory modals

Migrations (all additive):
- AddShareUrls, AddShowactDynamicForm, AddCategoryViewerRanges,
  AddSessionIdleTimeoutSettings, AddSeasonSubcategoryTemplates,
  AddNominationGroupTrackerIdentity, AddShowactApplicationSchedule,
  AddSeasonWorkflowRulesJson

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 23:32:21 +02:00
..
2026-06-26 20:06:10 +02:00

Backend

PostgreSQL

The API targets PostgreSQL through EF Core 8 and Npgsql.EntityFrameworkCore.PostgreSQL.

Local development is aligned with ../docker-compose.dev.yml and appsettings.Development.json:

Host=localhost;Port=5433;Database=vtuber_star_awards_dev;Username=vtsa_dev;Password=change-me-local-only

For production or shared deployments, keep checked-in appsettings empty and provide your own value through:

VTSA_POSTGRES
ConnectionStrings__Postgres

The API reads its connection string from:

  • environment variable VTSA_POSTGRES
  • environment variable ConnectionStrings__Postgres

Presentation/demo data is controlled separately:

VTSA_SEED_MODE=demo
  • demo, presentation or sample: seed local presentation data.
  • none, off, disabled or an unset value in Production: do not seed presentation data.
  • Backend/appsettings.Development.json defaults to demo; Backend/appsettings.json defaults to none.

If Docker is available locally, start a dev database from the repository root with:

docker compose -f docker-compose.dev.yml up -d

Commands

Restore and build:

dotnet restore
dotnet build

Create a migration:

dotnet ef migrations add InitialCreate

Generate a SQL migration script:

dotnet ef migrations script 0 20260617060000_InitialCreate --output Migrations/InitialCreate.sql

Apply migrations once PostgreSQL is running:

dotnet ef database update

Fallback bootstrap if dotnet ef is not usable in the current environment:

psql "$VTSA_POSTGRES" -f Migrations/InitialCreate.manual.sql

Run the API:

ASPNETCORE_ENVIRONMENT=Development dotnet run --urls http://127.0.0.1:5084

Check the API and database wiring:

curl http://127.0.0.1:5084/api/health
curl http://127.0.0.1:5084/api/health/database

Development auth/session:

curl -X POST http://localhost:5084/api/auth/dev-login \
  -H "Content-Type: application/json" \
  -d '{"twitchUserId":"jayuhime_admin","displayName":"Jayuhime Admin","role":"admin"}'

Demo admin login for public presentations:

VTSA_DEMO_LOGIN_ENABLED=true
VTSA_DEMO_ADMIN_LOGIN=jayuhime_admin
VTSA_DEMO_ADMIN_EMAIL=admin@example.local
VTSA_DEMO_ADMIN_PASSWORD=<set-secure-demo-password>
VTSA_DEMO_ADMIN_TWITCH_ID=jayuhime_admin
VTSA_DEMO_ADMIN_DISPLAY_NAME=Jayuhime Admin

The frontend route is /login. VTSA_DEMO_ADMIN_LOGIN may be a username or an email-style identifier; the backend also accepts the configured email, Twitch ID, and display name for admin flexibility. Disable the demo login for release with VTSA_DEMO_LOGIN_ENABLED=false.

Team owner bootstrap credentials are separate from demo login credentials:

VTSA_TEAM_OWNER_PASSWORD=<set-secure-owner-password>
VTSA_TEAM_CREATOR_PASSWORD=<set-secure-creator-password>

These fixed owner/creator credentials are authoritative on API startup. If a personal team account gets locked out after an admin reset, redeploying with the configured environment password restores the login.

Frontend app-wide demo gate:

VITE_DEMO_GATE_ENABLED=true
  • true: if /api/public/site-status is unavailable, the Vue app still starts at /login until a session exists.
  • unset or false: if /api/public/site-status is unavailable, public pages such as / remain visible without the initial demo login.

When /api/public/site-status is reachable, the backend demoLoginEnabled flag is authoritative.