get.orders.completedBuscar Pedidos Completados
Evento WebSocket para buscar pedidos completados com filtros avançados em tempo real. O cliente emite este evento com parâmetros de busca (SearchDto) para solicitar pedidos que correspondem aos critérios especificados. O servidor processa a requisição via EventEmitter interno e busca os pedidos usando findBySearch() que permite múltiplos filtros (status, termo de busca, usuário, intervalo de datas). Diferente de get.orders.standby e get.orders.progress que usam getOrders() para buscar apenas por status, este evento usa findBySearch() que aceita filtros avançados. O frontend limpa a lista antes de buscar novos resultados e filtra os pedidos recebidos por status antes de adicionar à lista.
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
| Nome | Tipo | Obrig. | Descrição |
|---|---|---|---|
Authorization | string | Sim | Token de autenticação no formato Bearer {accessToken}. O token deve ser enviado durante o handshake de conexão WebSocket. |
AuthorizationOBRIGATÓRIOParâmetros
| Nome | Tipo | Obrig. | Descrição |
|---|---|---|---|
search | string | Não | Termo de busca para filtrar pedidos (opcional) |
acceptUserId | string | Não | ID do usuário que coletou o pedido (opcional) |
status | string | Sim | Status do pedido (ex: COMPLETED, CANCELED, etc.) |
dateInitial | string | Sim | Data inicial do intervalo de busca (formato: YYYY-MM-DD) |
dateFinal | string | Sim | Data final do intervalo de busca (formato: YYYY-MM-DD) |
searchOPCIONALacceptUserIdOPCIONALstatusOBRIGATÓRIOdateInitialOBRIGATÓRIOdateFinalOBRIGATÓRIOFluxo passo a passo: get.orders.completed
Cliente valida parâmetros e emite a requisição via WebSocket
O frontend valida os parâmetros de busca, limpa a lista atual e emite o evento 'get.orders.completed':
// Side.tsx
// Valida parâmetros antes de enviar
const validate = () => {
// Validação dos parâmetros...
};
// Limpa a lista antes de buscar novos resultados
setOrders([]);
// Emite evento com parâmetros de busca
socket?.emit('get.orders.completed', {
search: searchParams.search,
acceptUserId: searchParams.acceptUserId,
status: searchParams.status,
dateInitial: searchParams.dateInitial,
dateFinal: searchParams.dateFinal,
});Servidor recebe payload e emite evento interno
No backend (NestJS + Gateway), o servidor captura o evento com os parâmetros de busca e emite um evento interno:
@SubscribeMessage('get.orders.completed')
async handleOrdersCompled(
@ConnectedSocket() client: Socket,
@MessageBody() data: SearchDto,
) {
// Cria LoadOrdersEvent com client.id, payload e data (parâmetros de busca)
this.eventEmitter.emit(
'load.orders.completed',
new LoadOrdersEvent(client.id, client.data.payload, data),
);
}
class LoadOrdersEvent {
to: string; // ID do socket do cliente
payload: PayloadTokenDto; // Dados de autenticação
data?: SearchDto; // Parâmetros de busca (usado neste caso)
}Listener busca pedidos com filtros avançados
O listener escuta o evento interno e busca os pedidos usando findBySearch() com múltiplos filtros:
@OnEvent('load.orders.completed')
async handleOnLoadOrdersCompleted({ to, payload, data }: LoadOrdersEvent) {
try {
// Busca pedidos com filtros avançados
const orders = await this.ordersService.findBySearch(data, payload);
// Envia cada pedido individualmente
orders.map((order) =>
this.gateway.notifyOnEventClient(to, 'completed', order),
);
} catch (e) {
this.logger.debug(
`Fail execunting event Orders in status: ${OrdersStatusEnum.COMPLETED}`,
e as Error,
);
}
}Servidor envia cada pedido via evento 'completed'
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('completed', order1);
// this.server.to(client.id).emit('completed', order2);
// this.server.to(client.id).emit('completed', order3);
// ...Cliente filtra por status e adiciona à lista
No frontend, o componente escuta o evento 'completed', filtra por status e adiciona cada pedido à lista:
// Side.tsx
useEffect(() => {
if (!socket) return;
const handleCompleted = (newOrder: Order) => {
// Filtra por status antes de adicionar
if (newOrder.status.name === searchParams.status) {
setOrders((prev) =>
// Previne duplicatas
prev.some((o) => o.id === newOrder.id)
? prev
// Adiciona no início da lista (pedidos mais recentes primeiro)
: [newOrder, ...prev]
);
}
};
socket.on('completed', handleCompleted);
return () => {
socket.off('completed', handleCompleted);
};
}, [socket, searchParams.status]);Request URL
ws://api-dev.imagemais.com{
"search": "termo de busca",
"acceptUserId": "123",
...{
"search": "termo de busca",
"acceptUserId": "123",
"status": "COMPLETED",
"dateInitial": "2025-01-01",
"dateFinal": "2025-01-31"
}Respostas
{
"message": "Pedidos completados serão enviados via evento 'completed'"
}{
"message": "Pedidos completados serão enviados via evento 'completed'"
}{
"message": "Erro ao buscar pedidos completados",
"error": "Bad Request",
...{
"message": "Erro ao buscar pedidos completados",
"error": "Bad Request",
"statusCode": 400
}