# 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`: ```text 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: ```text 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: ```text 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: ```bash docker compose -f docker-compose.dev.yml up -d ``` ## Commands Restore and build: ```bash dotnet restore dotnet build ``` Create a migration: ```bash dotnet ef migrations add InitialCreate ``` Generate a SQL migration script: ```bash dotnet ef migrations script 0 20260617060000_InitialCreate --output Migrations/InitialCreate.sql ``` Apply migrations once PostgreSQL is running: ```bash dotnet ef database update ``` Fallback bootstrap if `dotnet ef` is not usable in the current environment: ```bash psql "$VTSA_POSTGRES" -f Migrations/InitialCreate.manual.sql ``` Run the API: ```bash ASPNETCORE_ENVIRONMENT=Development dotnet run --urls http://127.0.0.1:5084 ``` Check the API and database wiring: ```bash curl http://127.0.0.1:5084/api/health curl http://127.0.0.1:5084/api/health/database ``` Development auth/session: ```bash 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: ```text VTSA_DEMO_LOGIN_ENABLED=true VTSA_DEMO_ADMIN_LOGIN=jayuhime_admin VTSA_DEMO_ADMIN_EMAIL=admin@example.local VTSA_DEMO_ADMIN_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`. Frontend app-wide demo gate: ```text VITE_DEMO_GATE_ENABLED=true ``` - `true`: the whole Vue app starts at `/login` until a session exists. - unset or `false`: public pages such as `/` are visible without the initial demo login.