WEBSOCKETget.notifications

Buscar Notificações

Evento WebSocket para buscar notificações de requisições de orçamento pendentes em tempo real. O cliente emite este evento para solicitar as notificações. O servidor retorna uma resposta imediata (confirmação) e, em seguida, busca as notificações no banco de dados e envia os dados reais via evento separado 'notifications'. Diferente de eventos de broadcast, este evento envia os dados apenas para o cliente que solicitou (usando client.id), garantindo que cada cliente receba apenas suas próprias notificações.

Access Token

Para realizar requisições GET, POST, PUT, DELETE e PATCH nos endpoints da API você precisa de uma chave de autorização. Chamamos essa chave de accessToken.

Para ter acesso ao accessToken, é necessário que o usuário master da licença efetue a liberação deste pela interface do ImageMais Clinic. O accessToken tem validade de 1 hora.

Headers

AuthorizationOBRIGATÓRIO
Tipo:string
Token de autenticação no formato Bearer {accessToken}. O token deve ser enviado durante o handshake de conexão WebSocket.

Parâmetros

Este método não possui parâmetros.

Fluxo passo a passo: get.notifications

1

Cliente emite a requisição via WebSocket

O frontend emite o evento 'get.notifications' para solicitar as notificações pendentes:

socket.emit(
  'get.notifications',
  (response: {
    status: string;
    timestamp: string;
    message?: string;
  }) => {
    // Trata resposta imediata (confirmação)
    if (response.status !== 'receive') {
      setErrorBudgetRequests(
        response.message ?? 'Erro ao buscar notificações'
      );
    }
    setLoadingBudgetRequests(false);
  }
);
Quem emite: frontend (Notification.tsx ou BudgetList.tsx)
Payload: nenhum (requisição vazia)
Callback: recebe resposta imediata (status: 'receive' ou 'refused')
2

Servidor recebe e retorna confirmação imediata

No backend (NestJS + Gateway), o servidor captura o evento e retorna uma resposta imediata:

@SubscribeMessage('get.notifications')
async handleGetNotifications(
  @ConnectedSocket() client: Socket
) {
  try {
    const payload = client.data.payload as PayloadTokenDto;
    
    // Emite evento interno para buscar notificações
    this.eventEmitter.emit('notifications', {
      to: client.id,
      payload: payload,
    });
    
    // Retorna resposta imediata (vai para o callback)
    return {
      status: 'receive',
      timestamp: new Date().toISOString(),
    };
  } catch (error) {
    return {
      status: 'refused',
      message: 'Erro ao buscar notificações',
      timestamp: new Date().toISOString(),
    };
  }
}
Quem recebe: servidor (Gateway WS)
O que faz: emite evento interno 'notifications' com client.id
Resposta imediata: retorna status: 'receive' ou 'refused'
3

Listener busca notificações no banco de dados

O listener escuta o evento interno e busca as notificações pendentes:

@OnEvent('notifications')
async handleOnBudgetsRequestsNotifications(event: {
  to: string;
  payload: PayloadTokenDto;
}) {
  try {
    // Busca notificações pendentes no banco
    const response = await this.budgetsRequestsService.findAllQueue(
      event.payload,
      { status: BudgetsRequestsStatus.PENDING }
    );
    
    // Envia para o cliente específico
    this.gateway.notifyOnEventClient(event.to, 'notifications', {
      type: 'budgets_request',
      ...response,
    });
  } catch (e) {
    this.logger.debug('Erro ao buscar notificações', e);
  }
}
O que busca: notificações com status PENDING
Filtro: por accountId do payload
Destino: apenas para o cliente que solicitou (event.to)
4

Servidor envia dados para cliente específico

O método `notifyOnEventClient` envia os dados apenas para o cliente que solicitou:

async notifyOnEventClient(to: string, event: string, data: any) {
  if (this._events.includes(event)) {
    // Envia apenas para o socket específico
    this.server.to(to).emit(event, data);
  }
}
Diferença importante: notifyOnEvent() → broadcast para todos da conta
: notifyOnEventClient() → apenas para um cliente (to = client.id)
5

Cliente recebe e atualiza a UI

No frontend, componentes escutam o evento 'notifications' e atualizam o estado:

// Notification.tsx
socket.on('notifications', (notificationBudgetsRequest) => {
  setNotifications(notificationBudgetsRequest.data);
});

// BudgetList.tsx
socket.on('notifications', (notificationBudgetsRequest) => {
  setBudgetRequests(notificationBudgetsRequest.data);
});
Notification.tsx: atualiza badge e lista de notificações
BudgetList.tsx: atualiza lista de requisições de orçamento
Dados recebidos: type: 'budgets_request' + dados do banco

Request URL

ws://api-dev.imagemais.com
{}
{}

Respostas

{
  "status": "receive",
  "timestamp": "2025-01-23T10:30:00.000Z"
  ...
{
  "status": "receive",
  "timestamp": "2025-01-23T10:30:00.000Z"
}
{
  "status": "refused",
  "message": "Erro ao buscar notificações",
  ...
{
  "status": "refused",
  "message": "Erro ao buscar notificações",
  "timestamp": "2025-01-23T10:30:00.000Z"
}