> For the complete documentation index, see [llms.txt](https://lunarie.gitbook.io/lunarie-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lunarie.gitbook.io/lunarie-docs/banco-de-dados/06-regras-de-dados.md).

# Regras de Dados

> **Última atualização:** 08/10/2026 Regras aplicadas no próprio banco (triggers, jobs e políticas), conferidas em 08/10/2026. Essa camada vale mesmo se o frontend for contornado.

## Triggers de negócio

| Trigger                                                                                                                                  | Tabela            | Regra                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `check_invite_before_signup`                                                                                                             | `auth.users`      | Exige código de convite válido antes de criar a conta, mesmo em chamadas diretas ao Auth.                                                                                                   |
| `on_auth_user_created`                                                                                                                   | `auth.users`      | Executa `handle_new_user`: entre as 20 primeiras contas (a administração não conta), registra o selo `primeira_estante`.                                                                    |
| `limit_fila_da_lua_inserts`                                                                                                              | `fila_da_lua`     | Rejeita a entrada (erro `fila_limite`) se já houve 10 na última hora ou 30 nas últimas 24 h. Protege o limite diário de e-mails do Resend, já que cada entrada dispara 2 e-mails (ADR-097). |
| `on_new_fila_da_lua`                                                                                                                     | `fila_da_lua`     | Chama `notify-admin` (aviso à administração) e `send-fila-confirmation` (confirmação à pessoa).                                                                                             |
| `trg_checar_conquistas_leitura`                                                                                                          | `ebooks`          | Concede conquistas ao marcar um livro como lido. As conquistas são permanentes.                                                                                                             |
| `trg_audit_storage_delete`                                                                                                               | `storage.objects` | Grava toda exclusão do bucket `ebooks` em `storage_delete_audit`.                                                                                                                           |
| `protect_objects_delete` e `protect_buckets_delete`                                                                                      | `storage.*`       | Protegem contra exclusões indevidas no Storage.                                                                                                                                             |
| `trg_update_ebooks_data_atualizacao`, `trg_knowledge_base_atualizado_em`, `trg_metas_leitura_atualizado_em`, `update_objects_updated_at` | várias            | Mantêm os carimbos de atualização.                                                                                                                                                          |

## Jobs agendados (pg\_cron)

| Job                       | Agenda        | Função                                                                                                  |
| ------------------------- | ------------- | ------------------------------------------------------------------------------------------------------- |
| `kindle-bounce-check`     | A cada 15 min | Lê as notificações de falha E999 da Amazon (via Resend inbound), tenta marcar o envio e avisa a pessoa. |
| `cleanup-invite-attempts` | 03:30 diário  | Apaga tentativas de convite com mais de 24 h (limite por IP).                                           |
| `feedback-30-dias-daily`  | 10:00 diário  | Envia uma vez por conta o convite de feedback 30 dias após o cadastro (ADR-014).                        |
| `kindle-resumo-semanal`   | Sábado, 02:00 | Resumo semanal de envios ao Kindle.                                                                     |

## Buckets de Storage

| Bucket     | Visibilidade | Conteúdo            | Acesso                                                      |
| ---------- | ------------ | ------------------- | ----------------------------------------------------------- |
| `ebooks`   | Privado      | Arquivos dos livros | URL assinada de 1 h, com policies por pasta `{usuario_id}/` |
| `avatares` | Privado      | Fotos de perfil     | URL assinada de 1 h, com policies por pasta `{usuario_id}/` |
| `capas`    | Público      | Capas dos livros    | URL pública estável (ADR-011)                               |

## Regras estruturais

* **RLS em todas as tabelas** do schema `public`. As tabelas de serviço (`storage_delete_audit`, `invite_attempts`, `kindle_bounce_seen`) têm RLS sem policies, e só o `service_role` acessa.
* **Sem planos nem limites no banco.** As tabelas `plans`, `plan_limits` e `user_plans`, os triggers de limite e as policies de cota de storage foram removidos em 08/10/2026 (ADR-095).
* **Convites** com RNG criptográfico, validade de 7 dias e limite de 10 tentativas inválidas por hora por IP.
* **Exclusão de conta** em ordem explícita pela Edge Function `delete-account` ([Relacionamentos](/lunarie-docs/banco-de-dados/05-relacionamentos.md)).

## Pontos de atenção

| Item                                  | Detalhe                                                                                                                                                                                                                                                                                                                                       |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `erro_conversao` rejeitado pelo CHECK | O CHECK de `kindle_envios.status` aceita `enviado`, `erro`, `arquivo_ausente` e `arquivo_muito_grande`. O `kindle-bounce-check` grava `erro_conversao`, e essa gravação é rejeitada. Todos os 17 envios atuais estão como `enviado`, então a falha ainda não apareceu. É preciso incluir `erro_conversao` no CHECK e testar com um E999 real. |
| `storage_delete_audit` sem alerta     | O alerta diário foi desligado (ADR-078). A tabela continua registrando.                                                                                                                                                                                                                                                                       |
| Funções `SECURITY DEFINER` abertas    | `audit_storage_object_delete` e `check_invite_before_signup` ainda são executáveis por `anon` e `authenticated` ([Segurança](/lunarie-docs/arquitetura/05-seguranca.md)).                                                                                                                                                                     |

## Documentos relacionados

* [Tabelas](/lunarie-docs/banco-de-dados/03-tabelas.md)
* [Relacionamentos](/lunarie-docs/banco-de-dados/05-relacionamentos.md)
* [Segurança](/lunarie-docs/arquitetura/05-seguranca.md)
