Skip to main content

Ler, substituir e remover a busca padrão pessoal — API

A busca padrão é a configuração (colunas visíveis, ordenação, filtros, tamanho de página e algumas preferências de apresentação) que o Portal aplica automaticamente quando o usuário abre a worklist de exames, sem precisar reaplicar filtros a cada sessão. É um recurso único por usuário — existe no máximo um registro por ator autenticado.

Funcionamento​

  1. Valida o token e a permissão EXAM_READ, sempre com escopo current-user.
  2. GET: devolve a busca padrão do usuário, ou data: null se ele nunca salvou uma.
  3. PUT: substitui integralmente a busca padrão do usuário (não existe PATCH aqui — é sempre um "full replace"; se não existir ainda, cria). Valida columns (lista fechada de colunas), no máximo um critério de sort, os filters (mesmo modelo dos favoritos — DiagnosisSavedWorklistFilterRequest), openPriorExams e pageSize (1–100).
  4. DELETE: remove (soft delete) a busca padrão do usuário; se ele não tinha nenhuma, a operação é um no-op silencioso (204 de qualquer forma).
  5. Toda substituição e remoção grava um evento de auditoria com o estado anterior/novo.

Achado no código. showFavoriteBar (mostrar ou não a barra de favoritos na tela de Exames) está definido no modelo (DiagnosisWorklistDefaultSearchSettings) e no toSettings() do DTO, mas o campo showFavoriteBar em ReplaceDiagnosisWorklistDefaultSearchRequest (replace-diagnosis-worklist-default-search.request.ts:71) não tem nenhum decorator de class-validator. Como o ValidationPipe global usa whitelist: true, qualquer propriedade sem decorator é removida do corpo antes de chegar ao controller — na prática, hoje não há como o cliente enviar showFavoriteBar: true por esta rota; o valor persistido é sempre false, independentemente do que for enviado. Vale confirmar com o time de Diagnosis se isso é uma lacuna pendente ou um decorator esquecido.

Endpoints​

MétodoRotaDescrição
GET/v1/worklist-preferences/default-searchLê a busca padrão do usuário autenticado
PUT/v1/worklist-preferences/default-searchCria ou substitui integralmente a busca padrão
DELETE/v1/worklist-preferences/default-searchRemove a busca padrão do usuário

Versão: v1

Swagger: GET /worklist-preferences/default-search · Rota (Dev): http://localhost:3000/v1/worklist-preferences/default-search

Permissões​

RotaGuardsPermissãoEscopo
GET/PUT/DELETE /default-searchJwtAuthenticationGuard, AuthorizationGuardEXAM_READ (any)current-user

Não há identificador de recurso no path: o escopo current-user já resolve para o registro do próprio ator, então não existe o conceito de acessar a busca padrão de outra pessoa por esta rota.

Headers​

HeaderObrigatórioDescrição
AuthorizationSimBearer <access_token>

Path parameters​

Nenhum.

Query parameters​

Nenhum.

Body​

PUT /default-search — ReplaceDiagnosisWorklistDefaultSearchRequest:

json
{
"columns": ["patientName", "status", "priority", "transferredAt"],
"sort": [{ "field": "transferredAt", "direction": "DESC" }],
"filters": { "statuses": ["TO_PREPARE"] },
"openPriorExams": false,
"pageSize": 20,
"maskIntegrationSharingBlocked": false,
"showFavoriteBar": true
}
CampoTipoObrigatórioValidação
columnsstring[]Simcada item deve estar em accessionNumber, modality, patientCode, patientName, priority, slaExpirationDate, status, studyDescription, transferredAt
sortarraySimno máximo 1 item; cada item { field, direction } com field em createdAt, performedAt, slaExpirationDate, transferredAt e direction em ASC/DESC
filtersobjetoSimmesmo mapa de campos de favoritos de busca
openPriorExamsbooleanSim—
pageSizeintSim1–100
maskIntegrationSharingBlockedbooleanNãodefault false quando omitido
showFavoriteBarbooleanNão (e hoje sem efeito prático — ver achado acima)default false; valor enviado é descartado pelo whitelist da validação antes de chegar ao serviço

Response​

200 — GET /default-search ({ data: DiagnosisDefaultSearchResponse | null }):

json
{
"data": {
"id": "a1b2....",
"userId": "8f2a....",
"settings": {
"columns": ["patientName", "priority", "status", "transferredAt"],
"sort": [{ "field": "transferredAt", "direction": "DESC" }],
"filters": { "statuses": ["TO_PREPARE"] },
"openPriorExams": false,
"pageSize": 20,
"maskIntegrationSharingBlocked": false,
"showFavoriteBar": false
},
"createdAt": "2026-09-01T12:00:00.000Z",
"updatedAt": "2026-09-01T12:00:00.000Z"
}
}

data é null quando o usuário nunca salvou uma busca padrão.

200 — PUT /default-search: mesmo formato de data acima, refletindo o que foi enviado.

204 — DELETE /default-search: sem corpo, mesmo quando não havia registro para remover.

Erros​

Classe de erroerrorCodeStatusQuando ocorre
(guard)UNAUTHENTICATED401token ausente, inválido ou expirado
(guard)FORBIDDEN_ACTION403falta EXAM_READ
(validação)BAD_REQUEST400columns fora da lista fechada, mais de um sort, pageSize fora de 1–100, corpo malformado
DiagnosisWorklistPreferenceInvalidErrorINVALID_WORKLIST_PREFERENCE400sort/direction inválidos na reconstrução do modelo, filters com campo não suportado, intervalo de data invertido

Regras de negócio​

IDRegraComportamento esperado
RN-01PUT é sempre substituição totalnão existe merge parcial; um campo opcional omitido volta ao seu default (false), não ao valor anterior salvo
RN-02No máximo uma coluna de ordenaçãosort aceita 0 ou 1 item; nunca ordenação multi-coluna
RN-03filters usa o mesmo modelo e as mesmas restrições dos favoritosinclusive a normalização de interval: ALL → THIRTY_DAYS (ver favoritos de busca)
RN-04DELETE sem registro existente não é erroresponde 204 mesmo que o usuário nunca tenha salvo uma busca padrão
RN-05showFavoriteBar não é persistível hoje via PUTver achado no código acima; qualquer valor enviado é descartado antes da validação de negócio

Compliance​

Não se aplica diretamente — mesma observação da página de favoritos de busca.

Variáveis de ambiente​

Nenhuma encontrada para esta rota.

Tempo médio de resposta​

A confirmar — responsável: time de Diagnosis; data: 24/09/2026. Não há medição publicada.

Requisitos não funcionais​

RequisitoDefinição
IdempotênciaSim para PUT (mesmo corpo produz o mesmo estado) e para DELETE
PaginaçãoNão se aplica (recurso único por usuário)
Rate limitLimite global padrão da API (ver visão geral)
CacheNão
AuditoriaSim — diagnosis.worklist.default-search-replaced/deleted, com snapshot antes/depois

Relacionado​