Skip to content

Content Modules

Some games have skin-scoped structural content: a sports game’s team list, a slot’s symbol set, a quiz’s question bank. This content lives in the game service’s own database; the platform provides only a generic content management bridge for its admin UI.

LayerOwnerExample
Content schema (which fields)Game serviceteam: { name, logo, country }
Content data (the actual records)Game service DB32 team records
Content management UIPlatform admin (generic)The Back Office form
Content assignment (which skin gets which content)Platformskin → content-set mapping

Supported modules (extensible):

ModuleDescription
teamsTeam lists for sports games
symbolsSlot / casino symbols
categoriesQuiz / trivia categories

Adding a module requires game-service + platform coordination (a minor bump).

The game service serves generic content CRUD, guarded by x-internal-config-secret:

GET /internal/content/:module # list
GET /internal/content/:module/:id # detail
POST /internal/content/:module # create
PUT /internal/content/:module/:id # update
DELETE /internal/content/:module/:id # delete

The platform admin UI proxies these endpoints to present a generic content editor. Example response for GET /internal/content/teams:

{
"ok": true,
"module": "teams",
"items": [
{ "id": 1, "name": "Lions FC", "country": "BR", "logoUrl": "https://...", "skinKey": "default" },
{ "id": 2, "name": "Eagles United", "country": "US", "logoUrl": "https://...", "skinKey": "default" }
]
}
  • Skin-scoped: every content record is bound to a skinKey; one skin’s content does not affect another’s.
  • Validation lives in the service: the platform blindly proxies content; schema validation (required fields, type checks) is the service’s responsibility.
  • IDs are minted by the service: the platform only transports them.
  • Idempotent delete: deleting a missing ID returns 200 (a no-op), not 404.
  • skinKey is an opaque, service-minted UUID, immutable after create.

For a game service that wants content management:

  1. Implement the CRUD endpoints above.
  2. Advertise which modules are supported (return a module list from GET /internal/content).
  3. The platform admin UI generates forms for those modules automatically.