Implementa o MVP do Adaptador de Planilhas no Elo Pro.
O módulo usa a identidade Supabase, isola cada workspace e registra storage, TTL, runner e biblioteca XLSX como decisões ainda abertas. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
commit
6e23f1533b
144 files changed
+19060
No files matched your search
@@ -0,0 +1,33 @@
|
||||
# Autenticação, workspace, permissões e RLS
|
||||
|
||||
## Fluxo
|
||||
|
||||
1. Supabase Auth (`getUser`) quando `NEXT_PUBLIC_SUPABASE_URL` e a anon key existem.
|
||||
2. Workspace ativo no cookie `elo_pro_workspace_id`, validado contra `workspace_members`.
|
||||
3. Fora de produção, `ADAPTER_DEV_AUTH=1` aceita um cookie assinado sem senha, só para identidades já existentes no banco.
|
||||
4. A flag `workspace_module_flags.module_key = spreadsheet_adapter` precisa estar ligada.
|
||||
5. Logout chama `supabase.auth.signOut()` e apaga o cookie local de desenvolvimento.
|
||||
6. `src/proxy.ts` só redireciona quem não tem cookie de sessão. A autorização real continua no servidor.
|
||||
|
||||
Não existe formulário de senha, tabela de credencial ou refresh token do Adaptador. Superadmin (`profiles.is_superadmin`) não ganha bypass dentro do módulo.
|
||||
|
||||
## Fonte do workspace
|
||||
|
||||
O identificador vem do cookie de plataforma ou da sessão de desenvolvimento. Consultas usam o valor já validado no servidor. Payload do browser não escolhe o tenant.
|
||||
|
||||
## Matriz
|
||||
|
||||
| Ação | Owner/Admin | Gestor/Agent |
|
||||
| --- | --- | --- |
|
||||
| Usar módulo habilitado | Sim | Sim |
|
||||
| Operar fonte, mapa, prévia, processo e download | Sim | Sim |
|
||||
| Enviar modelo | Sim | Só se `allow_non_admin_model_upload` |
|
||||
| Excluir modelo e alterar a flag de upload | Sim | Não |
|
||||
|
||||
## RLS
|
||||
|
||||
`migrations/0003_rls.sql` liga e força RLS. O aplicativo faz `set local role app_user` e `app.user_id`. Funções `security definer` resolvem membership, flag, upload e job ativo sem vazamento entre workspaces. A conexão de serviço (worker, seed, flag, limpeza) não passa por `app_user` e permanece só no servidor.
|
||||
|
||||
## Testes
|
||||
|
||||
`tests/integration/rls.test.ts` cobre leitura/escrita cruzada, insert bloqueado por RLS, flag desligada mesmo com contexto mentiroso e agent impedido de gravar settings. `tests/integration/journey.test.ts` cobre agent sem upload, upload após a setting e exclusão negada.
|
||||
Reference in new issue
Block a user