Geek Social — Documentação
Referência

Códigos de erro

Catálogo completo dos códigos tipados retornados pela API, por módulo.

A API retorna erros como { "error": "CODIGO_TIPADO" } em todos os 4xx. Esta página é o catálogo canônico — clientes devem comparar pelo código, nunca pela mensagem.

Convenção e padrão completo em Convenções de erro. Cada controller mapeia código → status HTTP via STATUS_BY_CODE.

Auth

CódigoStatusOnde aconteceCausaComo resolver
EMAIL_ALREADY_EXISTS409POST /auth/registerE-mail já cadastradoUse login ou recovery
INVALID_CREDENTIALS401POST /auth/login, PUT /auth/change-passwordEmail/senha não bateu, ou senha atual incorretaVerificar credenciais; se persistir, usar reset
INVALID_RESET_TOKEN400POST /auth/reset-passwordToken expirado/usado/inexistenteSolicitar novo via /forgot-password
PASSWORD_ALREADY_SET409POST /auth/set-passwordUser já tem senha localUse change-password
USER_NOT_FOUND404VáriasUser do JWT não existe (conta deletada com sessão viva)Logout + re-login
GOOGLE_ALREADY_LINKED_TO_OTHER_USER400GET /auth/google/linkGoogle account já é vínculo de outra contaDesvincule da outra conta primeiro
GOOGLE_NOT_LINKED404DELETE /auth/google/linkConta atual não tem Google
PASSWORD_REQUIRED_BEFORE_UNLINK409DELETE /auth/google/linkSem senha local; desvincular deixaria orfãUse set-password antes
INVALID_STATE (redirect)GET /auth/google/callbackState JWT inválido/expiradoRefazer fluxo
OAUTH_FAILED (redirect)GET /auth/google/callbackToken exchange/userInfo falhouTentar de novo
EMAIL_MISSING (redirect)GET /auth/google/callbackConta Google sem e-mailRe-autorizar com escopo email
LOGIN_FAILED / LINK_FAILED (redirect)GET /auth/google/callbackErro inesperadoLogs do backend

Users

CódigoStatusCausaComo resolver
USER_NOT_FOUND404User não existe
FORBIDDEN403Tentativa de editar perfil/recurso de outro user
STORAGE_NOT_CONFIGURED500S3Adapter sem credenciais válidasConfigurar .env

Validação Zod (updateProfileSchema, etc.) retorna 400 com detalhes em .flatten().

Friends

CódigoStatusCausaComo resolver
SELF_REQUEST400Tentou pedir amizade pra si mesmo
SELF_BLOCK400Tentou se bloquear
ALREADY_EXISTS409Pedido pendente já existe nessa direção
NOT_FOUND404Friendship/block não existe
NOT_PENDING409Tentou aceitar/rejeitar pedido que já foi processadoRe-fetch a lista
FORBIDDEN403Tentou aceitar/cancelar pedido de outro user

Collections

CódigoStatusCausaComo resolver
NOT_FOUND404Coleção não existe
FORBIDDEN403Não é dono da coleção
INVALID_NAME400Nome vazio/excede 100 chars
FIELD_IN_USE409Tentou remover do schema field que items já usamConsiderar is_hidden em vez
FIELD_NOT_FOUND404field_definition_id inválido no schema

Items

CódigoStatusCausaComo resolver
NOT_FOUND404Item não existe
FORBIDDEN403Não é dono
REQUIRED_FIELD_MISSING422Field marcado isRequired no schema não foi preenchidoPreencher campo
INVALID_FIELD_TYPE422Tipo do valor não bate com fieldType (ex: string em number)Coercion no client
INVALID_FIELD_VALUE422Valor não está em selectOptions (para tipo select)Use uma das opções
INVALID_RATING422Rating fora de 1-5
CANNOT_EDIT_ITEM_SHARE403Tentou editar post auto-criado de tipo item_shareEdita o item; post é auto-derived

Field Definitions

CódigoStatusCausaComo resolver
FIELD_KEY_ALREADY_EXISTS409Tentou criar definition custom com field_key que já existeUse outro nome
FIELD_KEY_DUPLICATE409Mesmo conflito (variante em outro path)
SYSTEM_FIELD_LOCKED403Tentou deletar/editar definition de sistemaNão permitido; use is_hidden
NOT_FOUND404

Listings (Vitrine)

CódigoStatusCausaComo resolver
ITEM_NOT_FOUND404Item alvo não existe
NOT_FOUND404Listing não existe
NOT_AUTHORIZED403Não é dono do listing
ALREADY_LISTED409Item já tem listing activeEncerrar o existente OU editar
INVALID_TRANSITION422Tentou pause/resume em estado errado (ex: pause de closed)Verifique estado
LISTING_CLOSED422Tentou editar/pausar/reativar listing closedListing terminou ciclo
LISTING_NOT_CLOSED422Tentou hard delete sem ter encerrado antesDELETE encerra; com ?hard=true em closed faz hard delete

Offers

CódigoStatusCausaComo resolver
LISTING_NOT_FOUND404listingId no body inválido
LISTING_NOT_ACTIVE409Listing pausado/closedNão aceita ofertas
ITEM_NOT_FOUND404Item alvo desapareceu
OFFER_NOT_FOUND404offerId inexistente
OFFERED_ITEM_NOT_FOUND404offered_item_id em trade não existe
OFFERED_ITEM_NOT_OWNED403Tentou oferecer item que não é seu
OFFERED_COLLECTION_PRIVATE422Item oferecido está em coleção private — owner não consegue verificarMudar visibility da coleção
OFFERED_COLLECTION_REQUIRES_FRIENDSHIP403Coleção friends_only entre não-amigosAdicionar amizade
ITEM_NOT_AVAILABLE404Item já transferido
ITEM_NOT_FOR_SALE / ITEM_NOT_FOR_TRADE422Listing não suporta tipo da oferta
CANNOT_OFFER_OWN_ITEM403Owner tentou ofertar pro próprio listing
DUPLICATE_PENDING_OFFER409Já tem oferta pending nesse itemCancelar a antiga primeiro
NO_PENDING_PROPOSAL409Tentou accept/reject sem proposal pendingRe-fetch
CANNOT_ACCEPT_OWN_PROPOSAL / CANNOT_REJECT_OWN_PROPOSAL403Tentou agir na própria proposal (precisa ser do oposto)Esperar oposto
ALREADY_PROPOSED409Já tem proposal pending — não pode criar outra
OFFER_NOT_NEGOTIABLE409Oferta em estado final (completed, cancelled, rejected)
INVALID_PROPOSAL422Counter-proposta inválida (ex: trade sem offered_item_id)
NO_PROPOSAL_HISTORY404Histórico vazio (impossível na prática)
NOT_AUTHORIZED403Não é offerer nem owner
INVALID_TRANSITION409Tentou ação não permitida no estado atual
ALREADY_CONFIRMED409Lado já confirmou(mas confirm é idempotente)
ITEM_GONE / OFFERED_ITEM_GONE410Item foi deletado entre create e confirmCancelar oferta
OFFERER_HAS_NO_COLLECTION / OWNER_HAS_NO_COLLECTION422Receptor não tem coleção compatível pra acolher transferBackend tenta auto-criar; se falhar, criar manualmente

Listing Ratings

CódigoStatusCausaComo resolver
OFFER_NOT_FOUND / NOT_FOUND404offerId inválido
OFFER_NOT_COMPLETED422Tentou avaliar offer não-completedEsperar transferência confirmar
NOT_AUTHORIZED403Não é participante (offerer/owner)
WINDOW_EXPIRED422Mais de 30 dias após completedJanela fechou
ALREADY_RATED409Já avaliou essa oferta (unique offer×rater)Imutável — não dá pra refazer

Chat

CódigoStatusCausaComo resolver
NOT_FOUND404Conversation/message/dm_request inexistente
FORBIDDEN403Não é membro / sem role suficiente
NOT_FRIEND400Tentou abrir DM com não-amigoUse DM request
BLOCKED403Há block em alguma direção
MEDIA_LIMIT_EXCEEDED413Attachment excede 5MB ou >10 arquivos

Reports

CódigoStatusCausaComo resolver
TARGET_NOT_FOUND404targetId não existe pro targetType
ALREADY_REPORTED409Já denunciou esse target
CANNOT_REPORT_OWN403Tentou denunciar próprio conteúdo

Steam

CódigoStatusCausaComo resolver
USER_NOT_FOUND404
STEAM_NOT_LINKED400Tentou usar API sem vincular contaPOST /integrations/steam/login
STEAM_API_KEY_MISSING400Sem users.steam_api_keyPUT /integrations/steam/api-key
STEAM_API_KEY_INVALID_FORMAT422Key não tem 32 chars hexVerifique no Steam dashboard
STEAM_ALREADY_LINKED_TO_OTHER_USER409Conta Steam já é de outro user
STEAM_REPLACE_REQUIRES_UNLINK409Tentou vincular outra Steam sem desvincular antesDELETE /integrations/steam/link primeiro
STEAM_PROFILE_PRIVATE422Steam profile não permite GetOwnedGamesTornar perfil público
STEAM_AUTH_FAILED502Steam API rejeitou (key inválida ou ban temporário)Verificar key
IMPORT_NO_GAMES_SELECTED400appIds vazioSelecione pelo menos 1
IMPORT_DESTINATION_REQUIRED400Nem collectionId nem newCollectionNameForneça um
IMPORT_INVALID_COLLECTION_NAME400newCollectionName inválido1-100 chars
IMPORT_COLLECTION_NOT_FOUND404collectionId inválido
IMPORT_COLLECTION_NOT_OWNED403Coleção é de outro user
IMPORT_COLLECTION_NOT_GAMES_TYPE400Coleção não é tipo games
IMPORT_ALREADY_IN_PROGRESS409Há batch ativo do mesmo userAguardar concluir ou implementar cancel

Notifications, Field Definitions, Posts genéricos

CódigoStatusOnde
NOT_FOUND404Notification/post/comment inexistente
FORBIDDEN403Não é dono da notification (tentou marcar lida de outro user)
SELF_REACTION400Reagir ao próprio post bloqueado em alguns casos

Erros de validação Zod (genéricos)

Toda request com body/query/params inválidos retorna 400 com schema padrão:

{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "querystring.limit must be number",
  "code": "FST_ERR_VALIDATION"
}

Frontend pode parsear message pra mostrar campo específico, ou tratar genérico.

Erros de servidor (5xx)

StatusQuando
500Bug no código, problema de DB, integração externa fora
502Steam API/Google OAuth falhou downstream
503Manutenção / shutdown gracioso (não implementado hoje)

5xx não devem ter código tipado — são bugs ou indisponibilidades. Logs do backend são fonte da causa raiz.

Convenções para adicionar novo código

  1. Adicione no *.controller.ts em STATUS_BY_CODE
  2. Throw ModuleError com o code no service
  3. Documente aqui (PR no docs)
  4. Frontend trata em UI específico se for caso de UX particular (modal, redirect)

Detalhes em Convenções de erro e Tutorial: Adicionar novo endpoint.

On this page