Vai al contenuto

Ticket de uso único para abrir o WebSocket do chat (apelido, sai no próximo deploy)

POST/api/chat/ticket

Auth
Richiede un token
Chiave API:
Non accetta chiavi API
X-CommunityId
X-CommunityId Invia l’X-CommunityId della community in cui avviene l’operazione.
Le descrizioni degli endpoint provengono dalla specifica dell’API e per ora sono in portoghese. L’interfaccia intorno è tradotta.

**Apelido antigo, por um deploy:** o app novo usa `POST /api/realtime/ticket` e `/api/realtime/socket` (subprotocolo `memberfy-realtime`), que funcionam com o chat ligado ou desligado. Esta rota e `/api/chat/socket` ficam só para abas abertas com o app antigo, com a regra de antes (chat desligado: 403 e fechamento 4003). Os eventos abaixo valem para os dois sockets.

Qualquer papel. Devolve um ticket de **uso único**, válido por 60 s, preso à pessoa **e a esta comunidade**. Abra `wss://<api>/api/chat/socket` (`data.path`) passando o ticket como segundo subprotocolo: `new WebSocket(url, ['memberfy-chat', ticket])` (`data.protocols`); o servidor responde com `memberfy-chat`. O ticket nunca vai na URL (ela fica em log de roteador); na query ele é ignorado. Trocar de comunidade no app fecha o socket e pede outro ticket. Sem ticket válido a conexão é recusada antes de virar WebSocket (401). O servidor manda `ping` a cada 25 s; reconecte com backoff pedindo ticket novo.

**Eventos do servidor** (JSON `{ type, data }`): `ready`, `message.new` (uma `ChatMessage`, mais `silent: true` quando quem recebe está indisponível ou Ocupado; o e-mail de aviso de quem está Ocupado segue a regra de Disponível), `message.deleted` (`{ id, conversationId, deletedAt }`), `typing` (`{ conversationId, profileId }`), `read` (`{ conversationId, profileId, readAt }`), `conversation.cleared` (`{ conversationId, clearedAt }`, só para quem limpou o histórico), `presence.delta` (`{ profileId, online, status?, lastSeenAt?, profile?, canStart?, connection? }`, só para quem está disponível; com `online: false` vem `lastSeenAt` (visto por último, arredondado ao minuto; `null` quando a pessoa ou quem recebe desligou `chatShowLastSeen`, e no bloqueio); com `online: true` vem `status` (`AVAILABLE`, `AWAY` ou `BUSY`), e toda troca de status com o app aberto (inclusive o Ausente automático entrar ou sair) publica de novo `online: true` com o `status` novo; com `online: true` vêm também `connection` e `canStart` como quem recebe veria aquela pessoa na linha de `GET /api/chat/members`, para inserir a linha sem buscar de novo; `canStart` some enquanto o servidor ainda não leu a regra de quem recebe, e um plano novo reflete em até um minuto), `conversation.blocked` (`{ conversationId, profileId, blocked }`, só para quem bloqueou), `me.updated` (`{ chatAvailable, chatStatus, chatShowLastSeen }`, quando o status ou o `chatShowLastSeen` da própria pessoa muda), `connection.requested` / `connection.accepted` / `connection.removed` (`{ connectionId, profileId, connection, profile? }`: `profileId` é sempre a outra pessoa; recusa e bloqueio só avisam quem agiu), `notification.new` (uma `Notification`), `notification.read` (`{ ids? , all?, unreadCount }`), `notification.removed` (`{ id }`), `chat.settings` (`{ enabled, whoCanStart, startMode }`; desligado fecha o socket com o código 4003), `session.revoked` (`{}`: a pessoa saiu da comunidade ou a sessão foi encerrada; o socket fecha com 4004 e o app não deve reconectar com a mesma sessão) e `pong`. **Do cliente:** `{ "type": "typing", "conversationId": "<uuid>" }`, `{ "type": "presence.idle", "idle": true|false }` (a aba ficou inativa ou voltou; a pessoa fica `AWAY` quando **todas** as abas estão inativas; uma mudança por conexão a cada 10 s, a de dentro da janela espera e vale a última) e `{ "type": "ping" }`; quadros de até 4 KB, sem binário, no máximo 5 por segundo (acima disso o socket fecha com 1008). Até 10 sockets por pessoa por servidor (o mais antigo fecha com 4009). O ticket vale para a geração da sessão em que foi pedido. Sem Redis: 503, e o app segue buscando pelas rotas.

Header

NomeTipoDescrizione
X-CommunityIdfacoltativostring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Corpo della richiesta application/json

La specifica non dichiara i campi di questo corpo (un upload multipart, per esempio). Consulta la guida dell’argomento.

Risposte

CodiceDescrizione
201Ticket emitido.
401Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`).
403Autenticado, mas sem permissão para esta operação.
500Erro interno do servidor.
503Tempo real fora do ar (sem Redis); use as rotas.

Esempio con curl

curl -X POST "https://api.memberfy.net/api/chat/ticket" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID" \
  -H "Content-Type: application/json" \
  -d '{}'