forlogic-core 1.16.2 → 1.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.note/memory/features/import/attachment-idempotency-registry.md +8 -0
- package/.note/memory/features/import/attachment-strategy.md +23 -11
- package/dist/hooks/useModuleAccess.d.ts +3 -4
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/modules/softwaresMap.d.ts +4 -0
- package/dist/types.d.ts +0 -2
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Memory: features/import/attachment-idempotency-registry
|
|
2
|
+
Updated: now
|
|
3
|
+
|
|
4
|
+
## REMOVIDO
|
|
5
|
+
|
|
6
|
+
O controle de idempotência via tabela `common.imports_file_registry` foi removido para simplificar o fluxo de importação de anexos. Agora todo arquivo válido (>0 bytes) é enviado diretamente ao Azure Blob Storage sem verificar se já existe no registry. As funções `lookupExistingFiles`, `registerUploadedFiles` e o campo `newFiles` do `UploadResult` foram removidos de `attachmentUploadService.ts`.
|
|
7
|
+
|
|
8
|
+
A tabela `common.imports_file_registry` no Supabase pode ser removida manualmente se desejado — a aplicação não a consulta mais.
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
# Memory: features/import/attachment-strategy
|
|
2
2
|
Updated: now
|
|
3
3
|
|
|
4
|
-
O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{
|
|
4
|
+
O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{id_company}` com nome `{id_file_revision}.{ext}`. Esse mesmo ID é incluído no CSV como coluna `id_file_revision` para que a API grave no banco com a mesma referência.
|
|
5
|
+
|
|
6
|
+
## Idempotência via `common.imports_file_registry`
|
|
7
|
+
|
|
8
|
+
Tabela Supabase com PK `CHAR(8)` (o próprio `id_file_revision`) e constraint `UNIQUE(alias, code, file_name)`:
|
|
9
|
+
- Se `(alias, code, file_name)` já existe com **mesmo tamanho** → reutiliza `id_file_revision` e `blob_url`, **não faz upload**
|
|
10
|
+
- Se existe com **tamanho diferente** → erro de conflito
|
|
11
|
+
- Se não existe → gera novo ID, faz upload, registra no registry **somente após sucesso da API**
|
|
12
|
+
- Arquivos com 0 bytes são rejeitados imediatamente
|
|
13
|
+
|
|
14
|
+
## Fluxo de consistência
|
|
15
|
+
|
|
16
|
+
1. Upload para Azure (novos arquivos)
|
|
17
|
+
2. Envio do CSV para API staging
|
|
18
|
+
3. **Se API sucesso** → `registerUploadedFiles()` grava no registry
|
|
19
|
+
4. **Se API falhar** → registry NÃO é gravado, próxima tentativa refaz upload
|
|
5
20
|
|
|
6
21
|
## Templates de anexo (attachment-only)
|
|
7
22
|
|
|
8
|
-
Quando todos os campos ativos
|
|
23
|
+
Quando `import_target === 'attachments'` ou todos os campos ativos são `file`/`file_metadata`, o sistema detecta automaticamente. Nesse modo:
|
|
9
24
|
- O .zip **não precisa conter xlsx** — apenas pastas com arquivos
|
|
10
|
-
- O código
|
|
11
|
-
- As linhas do CSV são geradas automaticamente a partir dos metadados
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
- Função `buildRowsFromAttachments` no `attachmentUploadService.ts` gera as linhas
|
|
17
|
-
- Função `extractZipAttachmentsOnly` no `zipExtractorService.ts` extrai sem exigir xlsx
|
|
18
|
-
- Detecção via `isAttachmentOnlyTemplate` no `attachmentUploadService.ts`
|
|
25
|
+
- O código é extraído do **diretório pai imediato** do arquivo
|
|
26
|
+
- As linhas do CSV são geradas automaticamente a partir dos metadados
|
|
27
|
+
- Função `executeAttachmentOnlyImport` orquestra o fluxo completo
|
|
28
|
+
- `buildRowsFromAttachments` gera as linhas
|
|
29
|
+
- `extractZipAttachmentsOnly` extrai sem exigir xlsx
|
|
30
|
+
- `isAttachmentOnlyTemplate` detecta o tipo
|
|
@@ -2,17 +2,16 @@ import type { ModuleAccessResult } from '../types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Hook para verificar se o usuário logado tem acesso a um módulo específico.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Usa um mapa estático de softwares (alias → id) e busca apenas as associações
|
|
6
|
+
* do usuário via API Qualiex para verificar acesso.
|
|
7
7
|
*
|
|
8
8
|
* **Pré-requisitos:**
|
|
9
9
|
* - O projeto deve configurar `moduleAlias` no `CoreProviders`
|
|
10
10
|
* - O usuário deve estar autenticado (via `useAuth`)
|
|
11
11
|
*
|
|
12
12
|
* **Cache:**
|
|
13
|
-
* - Softwares: cache de 30 minutos (raramente muda)
|
|
14
13
|
* - Associações: cache de 10 minutos (pode mudar com permissões)
|
|
15
|
-
* -
|
|
14
|
+
* - Limpo automaticamente no `switchUnit`
|
|
16
15
|
*
|
|
17
16
|
* @param moduleAliasOverride - Alias opcional para verificar acesso a outro módulo
|
|
18
17
|
* (ignora o alias configurado no CoreProviders)
|