Collections & Items
Coleções com schema dinâmico + items reutilizáveis com fields customizados.
Visão geral
Os módulos Collections e Items formam o coração do conteúdo gamer/colecionador do Geek Social. Modelagem chave:
- Cada collection tem um type (
games,books,cardgames,boardgames,custom) e um schema dinâmico definido pelo dono - Cada item pertence a uma collection e guarda valores em JSONB indexado pelas keys das field_definitions referenciadas
A separação entre field_definitions (catálogo global) e collection_field_schema (mapeamento por coleção) permite reusar campos entre coleções e respeitar ordenação custom.
Items podem transferir entre usuários via Vitrine — uma offer confirmada move o collection_id do item pro destinatário.
Entidades principais
| Tabela | Papel |
|---|---|
collections | Container com type, visibility, schema |
items | Unidades atômicas com fields JSONB |
collection_field_schema | Mapeamento collection ↔ field_definition + ordem |
field_definitions | Catálogo de campos (sistema + custom) |
Endpoints
Collections (11): create, list mine, list public, get, update, delete, upload icon, upload cover, attach/detach/update field do schema.
Items (7): list (com filtros dinâmicos), create, get, update, delete, upload cover, list public.
Ver API Reference — Collections e API Reference — Items.
Fluxos
Criar coleção com schema dinâmico
Criar item com fields validados
Listar items com filtros dinâmicos
Schema editing após coleção criada
Eventos de socket
Não emite eventos diretamente. Mas:
- Item adicionado com
auto_share_to_feeddispara post no feed → cliente recebe via socket nas próximas atualizações de feed - Item transferido (via offer) atualiza coleções de ambos os lados — frontend re-fetcha após
notification:new (offer_completed)
Edge cases e regras especiais
- Tipo de coleção é imutável — mudaria semântica dos field defs
- Visibility é por coleção, não por item — mas tipo da coleção afeta quais field defs aparecem
fieldsé JSONB merge no UPDATE — não precisa enviar todas as keys- Items sem field_definition correspondente — possível se field foi detached do schema; valor preservado no JSONB
- Auto-criação de coleção destino em transferências —
OffersService.ensureDestinationCollectioncria coleção do tipo certo se receptor não tem asking_priceeavailabilityforam movidos pralistingsna sessão 2026-04-28; código antigo pode mencionar- Privacy
friends_onlyfiltra cross-user; o backend valida viafriendsRepository.areFriends - Field definition de sistema (is_system=true) não é editável pelo user; apenas hidden
- Collection_field_schema sem unique constraint em (collection_id, field_definition_id) — app evita duplicação mas DB não enforce (pendência)
Dependências entre módulos
- Friends — privacy gating cross-user
- Field Definitions — catálogo de campos disponíveis
- Posts — auto-share dispara post item_share
- Listings/Offers — item.collection_id muda em transferências
- Steam — workers
steam.import-gamepopulam items em batch - Storage — upload de cover/icon