Skip to content

module-register: navigation camelCase vs snake_case mismatch (+ check if dead code) #13

@klinux

Description

@klinux

Contexto

Flagado por Copilot durante review do PR #12 (remoção do campo `route`).

Bug latente

`src/lib/module-register.ts` define o payload de registro como:

```ts
navigation: { label: string; path: string; required_permission?: string }[];
```

mas o payload é montado com `navigation: manifest.navigation` — e `manifest` vem de `module.json`, onde cada entrada usa `requiredPermission` (camelCase):

```json
"navigation": [
{ "label": "Overview", "path": "/my-module", "requiredPermission": "my-module:read" }
]
```

Resultado: se `registerModule()` for efetivamente chamado, o Shell API recebe `requiredPermission` em vez de `required_permission`, e o filtro por permissão na sidebar quebra silenciosamente.

Caminho real de registro (não afetado)

Em produção, o registro vai pelo init container do Helm (`charts/my-module/templates/deployment.yaml`) que lê o ConfigMap gerado a partir do bloco `module:` em `values.yaml` — esse bloco já está em snake_case corretamente (`required_permission`). Então o bug só afeta o caminho de self-registration via `src/register.ts`.

Suspeita de dead code

`src/register.ts` chama `registerModule()`, mas nada invoca `register.ts`:

  • Nenhum script em `package.json` referencia.
  • Nenhum `Dockerfile` usa como CMD/ENTRYPOINT.
  • Nenhum manifest Kubernetes aponta pra ele.

Ou seja, é helper carregado de dead code na forma como o template é shippado hoje.

Opções

  1. Remover `src/register.ts` + `src/lib/module-register.ts` — consolidar todo o registro no init container do Helm, que é o que realmente roda.
  2. Manter e consertar — tipar o `manifest.navigation` com camelCase (como no `module.json`) e mapear para snake_case ao montar o payload antes do `fetch`, alinhando com o que o init container já faz.

Opção 1 é minha preferência porque dois caminhos de registro (um via init container, outro via runtime) mantêm duas fontes de verdade e aumentam a chance de dessync igual esse bug mostrou. Mas depende de ninguém ter caso de uso legítimo para o self-register.

Critérios de aceitação

  • Decidir entre remover ou consertar.
  • Se remover: tirar `src/register.ts`, `src/lib/module-register.ts`, atualizar docs.
  • Se consertar: normalizar navigation camelCase → snake_case; adicionar teste que valida o payload montado.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions