Geek Social — Documentação
Banco de dadosTables

notifications

Notificações in-app por usuário (socket + persistência) — não inclui push.

Tabela de notificações persistidas pra cada usuário. Quando um evento dispara (amigo aceitou, oferta recebida, post comentado), é INSERT aqui + emit socket pro recipient. Push (Web Push) é separado — alimentado pelos mesmos eventos via PushService.

A tabela é flat (sem subtipos) — type (enum) + entity_id (UUID polimórfico) carregam o contexto. Frontend interpreta type pra decidir copy e link de destino.

Colunas

ColunaTipoNullableDefault
id uuidNOT NULLgen_random_uuid()
recipient_iduuidNOT NULL
actor_iduuidNOT NULL
typeenumcolumnNOT NULL
entity_iduuidNULL ok
readbooleanNOT NULLfalse
created_attimestampNOT NULLnow()

primary key   unique

Funcionalidade dos campos

  • id — UUID, PK
  • recipient_id — quem recebe (cascade)
  • actor_id — quem causou (cascade). Permite renderizar "X comentou seu post"
  • type — enum extensa, ver lista abaixo
  • entity_id — UUID polimórfico: aponta pra um post, oferta, friendship, message, etc., dependendo do type. Frontend resolve por type.
  • read — boolean. Default false; UPDATE quando user clica/marca como lida.
  • created_at — momento da notificação

Foreign keys

Coluna(s)ReferênciaON DELETEON UPDATE
recipient_idusers.idcascadeno action
actor_idusers.idcascadeno action

Índices

NomeÚnicoColunasWHERE (parcial)
notifications_recipient_created_at_idxnãorecipient_id, created_at

notifications_recipient_created_at_idx — query principal: "minhas notificações ordem cronológica decrescente".

Constraints

  • PRIMARY KEY (id)

Tipos de notificação

Enum notification_type:

TypeDisparado porentity_id aponta praUI sugere
friend_requestPOST /friends/requestfriendship pendingAceitar/rejeitar
friend_acceptedaceite de friendshipfriendshipAbrir perfil
post_commentcomment em post do userpostAbrir post
post_reactionreaction em post do userpostAbrir post
dm_request_receivednon-friend manda DMdm_requestAbrir solicitações
offer_receivednova oferta no listingitem_offerAbrir Vitrine → ofertas
offer_accepteddono aceitou ofertaitem_offerAbrir Vitrine
offer_rejecteddono rejeitou (ou auto-reject por close)item_offerMostrar histórico
offer_completedtransação executouitem_offerPedir avaliação
offer_cancelledofertante cancelouitem_offer
offer_expiredTTL 7 dias após accepted sem confirmitem_offer
counter_proposal_receivedcounter-proposta novaoffer_proposalAbrir negociação
proposal_rejectedrodada rejeitada (offer continua)offer_proposalCounter-propor?
rating_receivedalguém te avalioulisting_ratingAbrir reputação
steam_import_donebatch Steam terminou okcollectionAbrir coleção
steam_import_partialbatch terminou com falhascollectionAbrir coleção

NotifySafe

Service NotificationsService.notify() é chamado de muitos pontos. Pra evitar que falhas de notificação derrubem fluxos principais, hooks usam notifySafe(...).catch(() => {}).

Push integration

Quando uma notificação é criada, NotificationsService emite via socket pro user (se conectado) E via Web Push (se houver push_subscriptions ativas). Implementação atual em chat.gateway.ts.

Se o user está com is_muted no chat ou tem push desabilitado, alguns disparos são suprimidos seletivamente.

Padrões de uso

  • DispararnotifySafe({ recipientId, actorId, type, entityId }) em todo lugar que cria ação relevante
  • ListarGET /notifications?cursor=...&limit=20
  • Marcar como lidaPOST /notifications/:id/read ou POST /notifications/read-all
  • Contar não-lidasGET /notifications/unread-count

Tabelas relacionadas

  • users — recipient + actor (cascade)
  • push_subscriptions — entrega via push
  • Polymorphic via entity_id: posts, item_offers, offer_proposals, friendships, dm_requests, listing_ratings, collections (Steam imports)

On this page