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.
Ownership model
Section titled “Ownership model”| Layer | Owner | Example |
|---|---|---|
| Content schema (which fields) | Game service | team: { name, logo, country } |
| Content data (the actual records) | Game service DB | 32 team records |
| Content management UI | Platform admin (generic) | The Back Office form |
| Content assignment (which skin gets which content) | Platform | skin → content-set mapping |
Current modules
Section titled “Current modules”Supported modules (extensible):
| Module | Description |
|---|---|
teams | Team lists for sports games |
symbols | Slot / casino symbols |
categories | Quiz / trivia categories |
Adding a module requires game-service + platform coordination (a minor bump).
Endpoint shape
Section titled “Endpoint shape”The game service serves generic content CRUD, guarded by
x-internal-config-secret:
GET /internal/content/:module # listGET /internal/content/:module/:id # detailPOST /internal/content/:module # createPUT /internal/content/:module/:id # updateDELETE /internal/content/:module/:id # deleteThe 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" } ]}Guardrails
Section titled “Guardrails”- 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.
skinKeyis an opaque, service-minted UUID, immutable after create.
Onboarding a new service
Section titled “Onboarding a new service”For a game service that wants content management:
- Implement the CRUD endpoints above.
- Advertise which modules are supported (return a module list from
GET /internal/content). - The platform admin UI generates forms for those modules automatically.
Related
Section titled “Related”- Translations — localized strings
- Data Ownership — what each side stores