Games (Casino)
O template inclui um lobby de cassino completo com categorias, providers, busca, detalhe de jogo e cache server-side.
Modos do cassino (CASSINO_MODE)
O template suporta 2 modos de cassino, controlados pela env CASSINO_MODE:
| Mode | Categorias | Rows |
|---|---|---|
legacy (default) | BFF /casino-games/filter | home-rows.legacy.ts + BFF categories[] |
api_new | BFF /casino-games/list/base | BFF /casino-games/page/{home,cassino,cassino_live} (curadoria backend) |
Trocar CASSINO_MODE no .dev.vars (ou em deploy) reconfigura o cassino inteiro sem precisar mexer em código. Pra ajustar ordenação/stat exibida em slugs específicos (independente do modo), use o overlay categories.personalize.config.ts.
Customização da home
Dependendo do CASSINO_MODE, edite o arquivo correspondente:
CASSINO_MODE=legacy→app/config/sections/home-rows.legacy.ts(ou override emoverrides/<brand>/app/config/sections/home-rows.legacy.ts)CASSINO_MODE=api_new→ home vem direto do BFF (GET /casino-games/page/home). Sem arquivo local; a curadoria é feita backend-side pela brand.
A estrutura do arquivo .legacy.ts (array de LegacyHomeRowConfig):
export const legacyHomeRows = [
{ slug: "home-banners", type: "widget" },
{ slug: "search-field", type: "widget" },
{ title: "Slots", slug: "slots", type: "games-api", maxItems: 15 },
{ title: "Providers", slug: "providers-list", type: "widget" },
// adicione, remova ou reordene
];
Tipos disponíveis: widget, games-api (resolve via BFF), games-fixed, providers-api.
Para casino-rows (/games) e casino-live-rows (/games/live), o mesmo arquivo .legacy.ts existe com export correspondente.
Personalize de categorias (orderBy + displayPriority)
Pra reordenar ou controlar o stat exibido no balloon do card pra uma categoria BFF específica, use app/config/catalog/categories.personalize.config.ts:
export const categoriesPersonalize = {
"todos-os-jogos": { orderBy: "pay_month", displayPriority: "paid_month" },
"jogos-mais-jogados": { orderBy: "pay_today", displayPriority: "paid_today" },
slots: { orderBy: "pay_month", displayPriority: "default" },
};
Ativo em legacy e api_new. Slugs ausentes do mapa seguem o comportamento nativo do BFF. Veja docs-internal pra referência completa de orderBy e displayPriority.
Rotas
As rotas do cassino sao configuraveis via Route Registry. A tabela abaixo mostra os paths padrao (sem override de brand):
| Chave | Path padrao | Descricao |
|---|---|---|
casino | /games | Lobby (home page do cassino) |
casino.play | /games/:provider/:game | Pagina de detalhe do jogo |
casino.category | /games/category/:slug | Jogos por categoria |
casino.providers | /games/providers | Grid de providers |
casino.provider | /games/providers/:slug | Jogos de um provider |
O path padrao e /games, mas brands podem customizar para qualquer outro (ex: /casino). Use sempre routeHref("casino") e gameHref(slug) para gerar links — nunca paths hardcoded.
Cache
Dados de jogos sao cacheados no servidor com TTL de 5 minutos e stale-while-revalidate. Isso significa:
- Primeira visita: dados buscados da API e cacheados
- Visitas seguintes (< 5min): dados servidos do cache instantaneamente
- Visitas apos 5min: dados stale servidos imediatamente + revalidacao em background
Purge manual
Para forcar atualizacao do catalogo apos mudancas no backend:
POST /api/cache/games/purge
SEO e Descriptions de Jogos
Paginas de detalhe de jogos incluem meta tags OG/Twitter e Schema markup automaticamente. O conteudo de SEO e descriptions e totalmente configuravel via app/config/content/game-details.server.ts.
Estrutura do config
// app/config/content/game-details.server.ts
export const gameDetails: GameDetailsConfig = {
// Templates padrao aplicados a TODOS os jogos
defaults: {
meta_title: "{game_name} - Jogar Online | {brand_name}",
meta_description: "{game_name} é um jogo de cassino online disponível no {brand_name}...",
front_description: "<strong>{game_name}</strong> é um jogo de cassino online...",
},
// Overrides por jogo — campos omitidos herdam do defaults
games: {
"pgsoft/fortune-tiger": {
meta_description: "Fortune Tiger é um dos slots mais populares da PG Soft...",
front_description: "<strong>Fortune Tiger</strong> é um dos slots mais populares...",
},
},
};
Campos
| Campo | Uso | Formato |
|---|---|---|
meta_title | Tag <title> e og:title | texto puro |
meta_description | Tag <meta description> e JSON-LD | texto puro |
front_description | Exibido visualmente na pagina do jogo | HTML (suporta <strong>, <em>, etc.) |
Template tags
Use estas tags nos textos — sao substituidas automaticamente com dados reais:
| Tag | Valor |
|---|---|
{game_name} | Nome do jogo (ex: Fortune Tiger) |
{game_provider} | Nome do provedor (ex: PG Soft) |
{game_rtp} | RTP do jogo (ex: 96.81). Se nao disponivel, usa 97 como fallback |
{brand_name} | Nome da sua marca |
Como funciona a heranca
- Jogos sem entry em
gamesusam osdefaultscom templates resolvidos - Jogos com entry podem definir apenas os campos que querem customizar — os demais herdam do
defaults - Exemplo: se um jogo so define
front_description, ometa_titleemeta_descriptionvem dos defaults
Customizacao por brand
Este arquivo e overridable — crie overrides/<brand-key>/app/config/content/game-details.server.ts para personalizar defaults (idioma, tom de voz) e/ou descriptions de jogos especificos.
Ao customizar os defaults, voce personaliza automaticamente todos os jogos da plataforma de uma vez. Use entries em games apenas para jogos que precisam de texto especifico.
Busca
A busca de jogos e feita in-memory sobre o cache completo do catalogo — sem latencia de rede. Suporta busca por nome do jogo e provider.
Estatisticas
A pagina de detalhe mostra estatisticas do jogo por periodo (5min, 1h, 24h, 7d, 15d, 30d):
- Numero de apostas
- Numero de ganhos
- Jogadores ativos
- RTP (Return to Player)
Votos
Usuarios autenticados podem dar like/dislike em jogos. A contagem e exibida na pagina de detalhe.