Logotipo Hedhog

Receba novidades do Hedhog no seu e-mail

Novos lançamentos, receitas e breaking changes — sem spam.

Submódulo inbox

drafts

Rascunhos de composição autônomos e salvos automaticamente (inbox_draft) — não vinculados a uma thread ou mensagem até serem explicitamente enviados.

Caminho de origem: libraries/inbox/src/draft

Arquivo do módulo: draft.module.ts

Introdução

O submódulo Drafts gerencia `inbox_draft`, uma tabela intencionalmente desacoplada de `inbox_thread` e `inbox_message`: um rascunho não tem chave estrangeira `thread_id` ou `message_id`, apenas um `account_id` e um `created_by_user_id`. Isso significa que compor e salvar automaticamente um rascunho nunca toca nas tabelas de thread/mensagem, e enviar uma mensagem (via `POST /inbox/messages/send` do submódulo Messages) não consome, converte ou exclui um rascunho automaticamente — os dois são relacionados apenas por convenção na UI do cliente, não por um relacionamento de banco de dados. Um rascunho que o usuário posteriormente envia manualmente ainda precisa ser excluído separadamente se o cliente quiser removê-lo da lista de rascunhos.

Toda chamada de criação e atualização carimba `last_saved_at` com a hora atual do servidor, que é o campo pelo qual o endpoint de lista ordena (`orderBy: last_saved_at desc`) — é isso que dá à lista de rascunhos sua ordenação favorável ao autosave, em que o rascunho editado mais recentemente (não necessariamente o criado mais recentemente) sempre aparece primeiro. Os campos de destinatário (`to`, `cc`, `bcc`, `replyTo`) reutilizam o mesmo formato `RecipientDto` do endpoint de envio do submódulo Messages, e `attachmentsSnapshot` é um blob JSON sem tipagem destinado a guardar um snapshot no lado do cliente de arquivos anexados mas ainda não enviados entre um autosave e outro; o serviço não faz nenhuma validação sobre seu formato.

O controle de acesso segue o mesmo padrão por conta de Threads e Messages: `create` valida o acesso à `accountId` de destino de antemão, e `update` só revalida o acesso se a requisição estiver de fato movendo o rascunho para uma conta diferente (`body.accountId !== existing.account_id`), evitando uma verificação de acesso redundante em cada autosave disparado por digitação. A exclusão é suave (`deleted_at`), consistente com o restante das entidades do módulo.

Endpoints HTTP

5 endpoints

Lista paginada de rascunhos entre as contas acessíveis ao chamador, ordenada pelos salvos mais recentemente.

Query
page, pageSize, search, accountId?

Obtém um único rascunho por ID.

Params
id (int)

Cria um novo rascunho. Define last_saved_at com a hora atual.

Body

FieldTypeRequiredNotes
accountIdintyes
toRecipientDto[] ({ email, name? })yes
ccRecipientDto[] ({ email, name? })no
bccRecipientDto[] ({ email, name? })no
replyToRecipientDto[] ({ email, name? })no
subjectstring (max 255)no
textBodystringno
htmlBodystringno
attachmentsSnapshotunknown (JSON)noClient-side snapshot of pending attachments

Atualiza um rascunho (atualização parcial, com os mesmos campos da criação). Revalida o acesso à conta apenas se accountId estiver mudando. Atualiza last_saved_at.

Params
id (int)

Faz soft delete de um rascunho.

Params
id (int)