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 3 modos de cassino, controlados pela env CASSINO_MODE (default legacy quando ausente ou inválida):
| Mode | Home | /games e /games/live |
|---|---|---|
legacy (default) | Config estático (app/config/sections/home-rows.legacy.ts) | Config estático |
api_new | Curadoria do BFF (GET /casino-games/page/home) | Curadoria do BFF (/casino-games/page/{cassino,cassino_live}) |
mixed | Curadoria do BFF | Config estático |
O modo mixed existe pra quando o backoffice já curou apenas a home da marca — a home vem do BFF e as páginas de cassino/ao-vivo continuam nos arquivos de config locais.
Trocar CASSINO_MODE no .dev.vars (ou no deploy) reconfigura o cassino inteiro sem precisar mexer em código. Pra ajustar ordenação/stat exibida em slugs específicos, use o overlay categories.personalize.ts (ver abaixo).
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-key>/app/config/sections/home-rows.legacy.ts)CASSINO_MODE=api_newoumixed→ home vem direto do BFF (GET /casino-games/page/home). Sem arquivo local; a curadoria é feita backend-side pela marca.
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.
As páginas /games e /games/live têm arquivos equivalentes:
| Página | Arquivo | Export |
|---|---|---|
| Home | app/config/sections/home-rows.legacy.ts | legacyHomeRows |
/games | app/config/sections/casino-rows.legacy.ts | casinoRows |
/games/live | app/config/sections/casino-live-rows.legacy.ts | casinoLiveRows |
Overlay de apresentação (api_new / mixed)
Quando as rows vêm da curadoria do BFF, a marca ainda pode ajustar a apresentação de rows específicas em app/config/sections/home-row-overrides.ts (homeRowOverrides, indexado por slug de row). Default vazio — o template não customiza nenhuma row.
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.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" },
};
Slugs ausentes do mapa seguem o comportamento nativo do BFF (ordem da API + balloon com a chain default). Vale tanto pra página /games/category/:slug quanto pras rows games-api.
Ambos os campos são opcionais:
| Campo | Valores aceitos | Efeito |
|---|---|---|
orderBy | pay_today, pay_week, pay_month, players_today, players_week, players_month, bets_today, bets_month | Reordena a lista em ordem decrescente pela métrica. |
displayPriority | paid_today, paid_week, paid_month, players_today, players_week, players_month, bets_today, bets_month, last_minutes, avg_win, rtp, provider, default | Força a stat exibida no balloon do card. "default" equivale a omitir — o card segue a chain default (paid_today → paid_month → avg_win → rtp). |
O default do template foi pensado pro mercado brasileiro (slugs em português). Marcas com catálogo ou slugs diferentes devem criar overrides/<brand-key>/app/config/catalog/categories.personalize.ts.
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.live | /games/live | Lobby de cassino ao vivo |
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 são cacheados no servidor com política stale-while-revalidate:
- Primeira visita: dados buscados da API e cacheados.
- Dentro do TTL: dados servidos do cache instantaneamente.
- Após o TTL, dentro da janela stale: dados stale servidos imediatamente + revalidação em background — o usuário nunca espera pela API.
Os TTLs são definidos por ambiente, pelo time da plataforma, e diferem por recurso (catálogo, detalhe de jogo, estatísticas, listagens). Não dependa de um número específico no fork: se precisa de um TTL diferente pro seu ambiente, peça ao time da plataforma.
Purge manual
O deploy já dispara purge automaticamente. O endpoint abaixo é um escape hatch pra quando o catálogo muda no backend fora de um deploy:
POST /api/cache/purge
X-Cache-Secret: <CACHE_PURGE_SECRET>
O header é obrigatório — sem ele a rota responde 401, e se a variável não estiver configurada no worker da marca a resposta é 500. O CACHE_PURGE_SECRET é provisionado pelo time da plataforma.
Sem body, o purge é amplo (limpa tudo, incluindo o cache de HTML SSR). Pra purges cirúrgicos, mande um JSON:
{ "segments": ["homeRows", "casinoRows"] }
| Campo | Tipo | Efeito |
|---|---|---|
segments | string[] | Limpa apenas os recursos nomeados. |
tags | string[] | Limpa por tag lógica. |
glob | string | Limpa por padrão de chave (ex: "games:*"). |
only | "platform-cache" | "service-api" | "ssr" | "all" | Restringe a quais camadas de cache o purge se aplica. Default: todas. |
Purges cirúrgicos (com segments, tags ou glob) não limpam o cache de HTML SSR — apenas o purge amplo faz isso.
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.