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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions