Geek Social — Documentação
Módulos

Steam Integration

OpenID link Steam + import de games via pg-boss workers com throttle.

Visão geral

Integração com Steam permite:

  • Vincular conta Steam via OpenID 2.0 (sem precisar API key pra link)
  • Setar Steam Web API key pessoal pra autorizar consultas
  • Listar jogos owned via IPlayerService/GetOwnedGames
  • Importar jogos selecionados em batch — workers steam.import-game (lista) e steam.enrich-game (detalhes via appdetails, com throttle)

Importação roda assíncrona via pg-boss (queue persistida em PG). Frontend pode acompanhar via socket events import:progress / import:done ou polling GET /import/:batchId/status.

Entidades principais

TabelaPapel
userssteam_id, steam_linked_at, steam_api_key
itemsItems criados/atualizados pela importação
collectionsDestino dos jogos importados
import_batch_finalizedMarca atomica de fim de batch

Endpoints

8 endpoints em /integrations/steam:

EndpointResumo
POST /loginIniciar OpenID (retorna URL pra redirect)
GET /callbackCallback OpenID Steam
DELETE /linkDesvincular
PUT /api-keyDefinir Steam Web API key
DELETE /api-keyLimpar API key
GET /gamesListar jogos owned (via API)
POST /importIniciar importação selecionada
GET /import/:batchId/statusStatus do batch

Fluxos

Vincular Steam (OpenID)

Setar API key (necessária pra import)

Listar e importar jogos

Workers e finalização atomica

Desvincular

Eventos de socket

EventoQuando
import:progressCada job processado (incremental counter)
import:doneBatch finalizado
notification:new (steam_import_done)Sucesso completo
notification:new (steam_import_partial)Batch com falhas

Edge cases e regras especiais

  • Steam profile precisa ser público — caso contrário GetOwnedGames retorna EResult_AccessDenied. Backend mapeia pra STEAM_PROFILE_PRIVATE.
  • API key fica em DB — opção do user. Backend só usa em consultas dele. Considerar criptografar at-rest (pendência).
  • Throttle agressivo no enrichappdetails da Steam Store API tem rate limit. 1 worker concurrency=1 → ~1 req/sec.
  • import_batch_finalized PK = batch_id — primeiro INSERT vence, outros falham com unique constraint silenciosamente. É a "race condition resolution".
  • Importação re-rodada — se user importar o mesmo jogo de novo, é UPDATE em vez de INSERT (lookup por appId nos items existentes da coleção).
  • gamesSnapshot opcional — frontend envia o que listou (incluindo playtime no momento). Workers usam pra fallback se Steam API ficar offline durante o batch.
  • Itens importados mantêm fields preenchidos mesmo após desvincular conta Steam — não é "sync contínuo", é snapshot.
  • STEAM_REPLACE_REQUIRES_UNLINK — se user já tem steam_id vinculado e tenta vincular outro, precisa desvincular primeiro.

Dependências entre módulos

  • Items — workers populam ITEMs em batch
  • Collections — destino dos jobs (auto-create se newCollectionName)
  • Field Definitions — campos de sistema (Plataforma, Horas jogadas, App ID) usados nos fields
  • Notifications — steam_import_done / steam_import_partial
  • Chat (gateway) — emit import:progress / import:done

On this page