Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
Submódulo inbox
labels
Labels com escopo de conta (inbox_label) com semântica de sistema opcional, aplicados a mensagens via inbox_message_label, incluindo um modo de alternância no nível da thread no endpoint de atualização.
Caminho de origem: libraries/inbox/src/label
Arquivo do módulo: label.module.ts
Introdução
O submódulo Labels gerencia `inbox_label`, um catálogo de rotulagem por conta associado a mensagens por meio de `inbox_message_label`. Cada label tem um `name` único dentro da conta à qual pertence (imposto no nível do serviço com uma verificação `findFirst` + `ConflictException`, não por uma restrição de banco de dados), uma `color` opcional e um `system_type` opcional (`inbox` | `sent` | `archived` | `trash` | `spam`) que permite que um label funcione também como marcador semântico, em vez de uma tag puramente cosmética — embora nada na lógica atual do serviço trate `system_type` de forma especial além de armazená-lo e ordenar por ele (`list` ordena por `system_type asc` antes de `id desc`, agrupando os labels com system_type primeiro).
`PATCH /inbox/labels/:id` tem propósito duplo, distinguido apenas por o corpo da requisição incluir ou não um `threadId`. Sem ele, comporta-se como uma atualização comum de campos (name/color/systemType/accountId, todos opcionais via `PartialType`). Com um `threadId`, ele ignora os demais campos por completo e, em vez disso, alterna a presença do label em todas as mensagens daquela thread (restritas às contas acessíveis ao chamador): verifica se alguma mensagem da thread já carrega o label via `inbox_message_label` e, em caso afirmativo, remove-o de todas elas; caso contrário, adiciona-o a todas — uma única ação idempotente de "aplicar/remover este label nesta thread", em vez de uma alternância granular por mensagem. O campo `toggled` da resposta reflete o estado resultante (`true` se o label acabou de ser aplicado, `false` se acabou de ser removido), e `applied: false` é retornado sem nenhuma escrita quando a thread não tem mensagens dentro das contas acessíveis ao chamador.
Excluir um label é um soft delete apenas em `inbox_label` — as linhas de junção `inbox_message_label` são deixadas no lugar em vez de serem limpas, e o `ON DELETE CASCADE` no nível do banco de dados naquela chave estrangeira nunca dispara, porque a própria linha do label nunca é fisicamente excluída. Isso é seguro porque toda consulta downstream que expõe labels (em particular as consultas de lista e detalhe de thread do submódulo Threads) filtra explicitamente `l.deleted_at IS NULL` ao fazer o join por `inbox_message_label`, de modo que um label em soft delete simplesmente deixa de aparecer em qualquer lugar na UI sem exigir um job de limpeza.
Endpoints HTTP
4 endpoints
Lista paginada de labels entre as contas acessíveis ao chamador, ordenada por system_type e depois pelos mais recentes.
- Query
- page, pageSize, search, accountId?
Cria um novo label para uma conta. Rejeita com 409 se já existir um label com o mesmo nome naquela conta.
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| accountId | int | yes | — |
| name | string (max 120) | yes | Must be unique within the account |
| systemType | "inbox" | "sent" | "archived" | "trash" | "spam" | no | — |
| color | string (max 32) | no | — |
Atualiza os campos de um label OU — quando threadId é informado — alterna a presença do label em todas as mensagens de uma thread (aplicar/remover idempotente).
- Params
- id (int)
Body
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string (max 120) | no | — |
| systemType | "inbox" | "sent" | "archived" | "trash" | "spam" | no | — |
| color | string (max 32) | no | — |
| accountId | int | no | — |
| threadId | int | no | When present, all other fields are ignored and the call instead toggles this label on every message of the given thread |
Faz soft delete de um label. As associações inbox_message_label existentes são mantidas, mas ficam excluídas de todas as consultas de label assim que o label é excluído.
- Params
- id (int)