WEBSOCKETget.orders.standby

Buscar Pedidos em Standby

Evento WebSocket para buscar pedidos em status "STANDBY" em tempo real. O cliente emite este evento quando o componente é montado para solicitar a lista de pedidos em standby. O servidor processa a requisição via EventEmitter interno e envia cada pedido individualmente através do evento 'collect'. Diferente de outros eventos que enviam arrays completos, este evento envia cada pedido em uma mensagem separada via 'collect', permitindo que o frontend adicione os pedidos incrementalmente à lista. O frontend também escuta o evento 'remove.standby' para remover pedidos quando eles saem do status standby.

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.orders.standby

1

Cliente emite a requisição via WebSocket

O frontend emite o evento 'get.orders.standby' quando o componente é montado:

// ListStandby.tsx
useEffect(() => {
  if (socket) {
    socket.emit('get.orders.standby');
  }
}, [socket]);
Quem emite: frontend (ListStandby.tsx)
Quando: ao montar o componente ou quando socket reconecta
Payload: nenhum (requisição vazia)
Callback: não aguarda resposta direta; recebe dados via evento 'collect'
2

Servidor recebe e emite evento interno

No backend (NestJS + Gateway), o servidor captura o evento e emite um evento interno:

@SubscribeMessage('get.orders.standby')
async handleOrdersStandby(
  @ConnectedSocket() client: Socket
) {
  // Cria LoadOrdersEvent com client.id e payload
  this.eventEmitter.emit(
    'load.orders.standby',
    new LoadOrdersEvent(client.id, client.data.payload),
  );
}

class LoadOrdersEvent {
  to: string;              // ID do socket do cliente
  payload: PayloadTokenDto; // Dados de autenticação
  data?: SearchDto;        // (Opcional) Para este caso não é usado
}
Quem recebe: servidor (Gateway WS)
O que faz: emite evento interno 'load.orders.standby' com LoadOrdersEvent
LoadOrdersEvent: contém to (client.id) e payload (dados de autenticação)
Resposta direta: não retorna resposta imediata
3

Listener busca pedidos e envia individualmente

O listener escuta o evento interno, busca os pedidos STANDBY no banco e envia cada um via 'collect':

@OnEvent('load.orders.standby')
async handleOnLoadOrdersStandby({ to, payload }: LoadOrdersEvent) {
  try {
    // Busca pedidos com status STANDBY
    const orders = await this.loadOrdersByStatus(
      OrdersStatusEnum.STANDBY,
      payload,
    );
    
    // Envia cada pedido individualmente
    orders.map((order) =>
      this.gateway.notifyOnEventClient(to, 'collect', order),
    );
  } catch (e) {
    this.logger.debug(
      `Fail execunting event Orders in status: ${OrdersStatusEnum.STANDBY}`,
      e as Error,
    );
  }
}
O que busca: pedidos com status STANDBY
Filtro: por accountId do payload
Como envia: cada pedido em uma mensagem separada via 'collect'
Destino: apenas para o cliente que solicitou (to = client.id)
4

Servidor envia cada pedido via evento 'collect'

O método `notifyOnEventClient` envia cada pedido individualmente para o cliente:

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);
  }
}

// Para cada pedido encontrado:
// this.server.to(client.id).emit('collect', order1);
// this.server.to(client.id).emit('collect', order2);
// this.server.to(client.id).emit('collect', order3);
// ...
Evento: 'collect' (está na lista de eventos permitidos)
Dados: objeto Order completo (um por mensagem)
Quantidade: múltiplos eventos collect (um para cada pedido)
Destino: apenas para o cliente que solicitou (to = client.id)
5

Cliente recebe e adiciona pedidos à lista

No frontend, o componente escuta o evento 'collect' e adiciona cada pedido à lista:

// ListStandby.tsx
socket.on('collect', (newData: Order) => {
  setOrders((prev) => {
    // Previne duplicatas
    if (prev.find((d) => d.id === newData.id)) return prev;
    // Adiciona novo pedido à lista
    return [...prev, newData];
  });
});

// Também escuta remove.standby para remover pedidos
socket.on('remove.standby', (remove: Order) => {
  setOrders((prev) => 
    prev.filter((order) => order.id !== remove.id)
  );
});

// Remove listeners ao desmontar
useEffect(() => {
  return () => {
    socket.off('collect');
    socket.off('remove.standby');
  };
}, []);
Evento collect: recebe um pedido por vez e adiciona à lista
Prevenção de duplicatas: verifica se o pedido já existe antes de adicionar
Evento remove.standby: remove pedido da lista quando sai do status standby
Cleanup: remove listeners ao desmontar para prevenir memory leaks

Request URL

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

Respostas

{
  "message": "Pedidos em standby serão enviados via evento 'collect'"
}
{
  "message": "Pedidos em standby serão enviados via evento 'collect'"
}
{
  "message": "Erro ao buscar pedidos em standby",
  "error": "Bad Request",
  ...
{
  "message": "Erro ao buscar pedidos em standby",
  "error": "Bad Request",
  "statusCode": 400
}