WEBSOCKETget.orders.progress

Buscar Pedidos em Progresso

Evento WebSocket para buscar pedidos em status "IN_PROGRESS" em tempo real. O cliente emite este evento quando o componente é montado para solicitar a lista de pedidos em progresso. O servidor retorna uma resposta imediata ({ status: 'receive' }) e processa a requisição via EventEmitter interno, enviando cada pedido individualmente através do evento 'progress'. Diferente de outros eventos que enviam arrays completos, este evento envia cada pedido em uma mensagem separada via 'progress', permitindo que o frontend adicione os pedidos incrementalmente à lista. Os pedidos são adicionados no início da lista (pedidos mais recentes aparecem primeiro). O frontend também escuta o evento 'remove.progress' para remover pedidos quando eles saem do status IN_PROGRESS.

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.progress

1

Cliente emite a requisição via WebSocket

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

// ListInProgress.tsx
useEffect(() => {
  if (socket) {
    socket.emit('get.orders.progress');
  }
}, [socket]);
Quem emite: frontend (ListInProgress.tsx)
Quando: ao montar o componente ou quando socket reconecta
Payload: nenhum (requisição vazia)
Callback: recebe resposta imediata { status: 'receive' } e dados via evento 'progress'
2

Servidor recebe, retorna resposta imediata e emite evento interno

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

@SubscribeMessage('get.orders.progress')
async handleOrdersProgress(
  @ConnectedSocket() client: Socket
) {
  // Cria LoadOrdersEvent com client.id e payload
  this.eventEmitter.emit(
    'load.orders.progress',
    new LoadOrdersEvent(client.id, client.data.payload),
  );
  
  // Retorna resposta imediata (diferente de get.orders.standby)
  return {
    status: 'receive',
  };
}

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.progress' com LoadOrdersEvent
Resposta imediata: retorna { status: 'receive' } (diferente de get.orders.standby)
LoadOrdersEvent: contém to (client.id) e payload (dados de autenticação)
3

Listener busca pedidos e envia individualmente

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

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

Servidor envia cada pedido via evento 'progress'

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('progress', order1);
// this.server.to(client.id).emit('progress', order2);
// this.server.to(client.id).emit('progress', order3);
// ...
Evento: 'progress' (está na lista de eventos permitidos)
Dados: objeto Order completo (um por mensagem)
Quantidade: múltiplos eventos progress (um para cada pedido)
Destino: apenas para o cliente que solicitou (to = client.id)
5

Cliente recebe e adiciona pedidos no início da lista

No frontend, o componente escuta o evento 'progress' e adiciona cada pedido no início da lista:

// ListInProgress.tsx
socket.on('progress', (newData: Order) => {
  setOrders((prev) => {
    // Previne duplicatas
    if (prev.find((d) => d.id === newData.id)) return prev;
    // Adiciona novo pedido no INÍCIO da lista (pedidos mais recentes primeiro)
    return [newData, ...prev];
  });
});

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

// Remove listeners ao desmontar
useEffect(() => {
  return () => {
    socket.off('progress');
    socket.off('remove.progress');
  };
}, []);
Evento progress: recebe um pedido por vez e adiciona no início da lista
Prevenção de duplicatas: verifica se o pedido já existe antes de adicionar
Ordem dos pedidos: pedidos mais recentes aparecem primeiro ([newData, ...prev])
Evento remove.progress: remove pedido da lista quando sai do status IN_PROGRESS
Cleanup: remove listeners ao desmontar para prevenir memory leaks

Request URL

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

Respostas

{
  "status": "receive"
}
{
  "status": "receive"
}
{
  "message": "Erro ao buscar pedidos em progresso",
  "error": "Bad Request",
  ...
{
  "message": "Erro ao buscar pedidos em progresso",
  "error": "Bad Request",
  "statusCode": 400
}