Skip to content

Blackjack Schema ERD

The blackjack Postgres schema (libs/_prisma/src/schema/blackjack.prisma) isolates all multiplayer blackjack state from the main public schema. The bj app (apps/bj/) owns these tables exclusively; the api app never writes to them directly — it interacts via Redis transport events (libs/shared/src/events/bj.events.ts:9-38).

Key design choices: BlackjackUser.id is a string containing the currencyId suffix (e.g. "42-DBC") to reduce schema changes from the legacy codebase (blackjack.prisma:46-47). All game state lives in the BlackjackGame.data JSON column (blackjack.prisma:116), keeping the relational schema small.

erDiagram
    BlackjackTable {
        int id PK
        int maxPlayersCount
        float minBet
        float maxBet
        float minPerfectPairsBet
        float maxPerfectPairsBet
        datetime waitBetUntilUtc
        string activeProvablyFairSeedId FK
        string gameId
        boolean isActive
    }

    BlackjackGame {
        string id PK
        int tableId FK
        enum status
        string provablyFairSeedId FK
        datetime waitActionUntilUtc
        json data
    }

    BlackjackPlayerHand {
        string id PK
        string gameId FK
        enum status
    }

    BlackjackBet {
        string id PK
        datetime createdAt
        datetime settledAt
        string userId FK
        string gameId
        decimal amount
        decimal payout
        json betData
        string blackjackPlayerHandId
    }

    BlackjackUser {
        string id PK
        string username
        boolean isPrivate
        string avatar
        int vipLevel
    }

    BlackjackUserOnTable {
        string userId PK,FK
        int tableId PK,FK
        int position PK
        int countOfSkippedGames
    }

    BlackjackGameConfig {
        int id PK
        datetime updatedAt
        float minBet
        float maxBet
        int numberOfDecks
        float timeToPlaceBetsSec
        float timeToMakeActionSec
        boolean isInsuranceEnabled
        boolean isSplitEnabled
        boolean isSurrenderEnabled
    }

    BlackjackProvablyFairSeed {
        string id PK
        string serverSeed
        string hashedServerSeed
        json externalSeedData
    }

    BlackjackTable ||--o| BlackjackProvablyFairSeed : "active seed"
    BlackjackTable ||--o{ BlackjackGame : "hosts"
    BlackjackTable ||--o{ BlackjackUserOnTable : "seats"
    BlackjackGame ||--|| BlackjackProvablyFairSeed : "uses"
    BlackjackGame ||--o{ BlackjackPlayerHand : "contains"
    BlackjackUser ||--o{ BlackjackBet : "places"
    BlackjackUser ||--o{ BlackjackUserOnTable : "sits at"

Table reference

Table PK Row count driver Prisma line
BlackjackTable id (autoincrement) Static config, ~1-10 rows blackjack.prisma:59
BlackjackGame id (string) One per round per table blackjack.prisma:105
BlackjackPlayerHand id (string) One per player per game (+ splits) blackjack.prisma:94
BlackjackBet id (string) One per hand per player blackjack.prisma:23
BlackjackUser id (string, "userId-currencyId") Mirrors public.user subset blackjack.prisma:44
BlackjackUserOnTable (userId, tableId, position) Active seated players blackjack.prisma:79
BlackjackGameConfig id (default 1) Singleton row blackjack.prisma:123
BlackjackProvablyFairSeed id (uuid) One per game + one pending per table blackjack.prisma:146

Cross-references

  • Blackjack round results sync to public.Bet via the bet-settled queue (apps/api/src/bet/queue/).
  • BlackjackUser is populated by the bj app on table-join, copying fields from public.User.
  • Provably-fair seeds here are separate from public.UserFairnessSeeds — blackjack manages its own seed lifecycle.
  • Flow doc: docs/flows/blackjack.md.