Skip to content

Issue 0001#1

Open
vinicius-el-khalili wants to merge 3 commits into
infleet:mainfrom
vinicius-el-khalili:issue-0001
Open

Issue 0001#1
vinicius-el-khalili wants to merge 3 commits into
infleet:mainfrom
vinicius-el-khalili:issue-0001

Conversation

@vinicius-el-khalili

@vinicius-el-khalili vinicius-el-khalili commented Jul 1, 2026

Copy link
Copy Markdown

Unicidade de dispositivo por função em cada veículo

Contexto

O time de operações relatou que instalou dois dispositivos exercendo a mesma função em um mesmo veículo, e o sistema permitiu.

Ao ser instalado em um veículo, um dispositivo assume uma função: posição (GPS) ou identificação do motorista. Cada função deve ser exercida por um único dispositivo em cada veículo.

O sistema não impõe essa regra em nenhum ponto, então nada impede uma segunda instalação numa função já ocupada.

O que este PR faz

  • Cria a trava que faltava: um veículo não pode mais ficar com dois dispositivos na mesma função.
  • Uma segunda instalação numa função já ocupada passa a ser recusada com uma mensagem clara, em vez de aceita silenciosamente.
  • O fluxo legítimo continua intacto: funções diferentes no mesmo veículo, e a primeira instalação de cada função, seguem funcionando normalmente.
  • Acompanha um teste que reproduz o bug original e fixa o novo comportamento, para que ele não volte.

Detalhes de implementação

  • Adiciona unique_index [:vehicle_id, :role] na tabela installations via migration. É a trava real: rejeita a duplicata de forma atômica, resistente a concorrência.
  • Declara unique_constraint no changeset da instalação, convertendo a violação do índice em erro de validação em vez de exceção.
  • Ancora esse unique_constraint no campo role com mensagem customizada, em vez do default que apontaria vehicle_id. É uma exemplificação (ADR-0003).
  • Mantém a trava sobre todas as instalações, sem índice parcial, coerente com a tabela ser append-only (ADR-0002).
  • Adiciona um teste de integração que reproduz a duplicata e verifica a recusa e a mensagem.

Documentação de apoio

Este PR vem com uma trilha de documentação em docs/issues/issue-001/: enquadramento do problema como issue, diagnóstico, e decisões registradas com suas alternativas e trade-offs em ADRs dedicados:

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adiciona uma restrição de unicidade para o par (vehicle_id, role) na tabela installations, via migração de índice único e constraint no changeset com mensagem customizada, acompanhada de teste de regressão e documentação (issue, investigação e três ADRs) descrevendo o problema, alternativas e decisões.

Changes

Correção de unicidade de função por veículo

Layer / File(s) Summary
Registro da issue e investigação do bug
docs/issues/issue-001/issue.md, docs/issues/issue-001/investigation.md
Documenta o relato do problema, passos de reprodução via GraphiQL, resultado esperado, critérios de aceite e a investigação técnica que aponta ausência de unique_constraint/índice único nas camadas de serviço, changeset e migration.
Índice único no banco de dados
priv/repo/migrations/20260701012457_add_unique_index_on_installations_vehicle_role.exs
Cria migração Ecto que adiciona unique_index em installations para as colunas vehicle_id e role.
Constraint no changeset e teste de regressão
lib/caduceus/installations/installation.ex, test/caduceus/installations_test.exs
Adiciona unique_constraint/2 para :role referenciando o índice único e mensagem de erro dedicada; adiciona teste garantindo que a segunda instalação na mesma função/veículo retorna erro.
ADRs das decisões arquiteturais
docs/issues/issue-001/adr-0001.md, docs/issues/issue-001/adr-0002.md, docs/issues/issue-001/adr-0003.md
Registra as decisões de impor unicidade no banco, não modelar desinstalação agora, e customizar a mensagem de erro de violação de unicidade, cada uma com contexto, alternativas e consequências.

Estimated code review effort: 2 (Simple) | ~12 minutes

Sequence Diagram(s)

Não aplicável — as mudanças são majoritariamente documentação, uma migração de banco e uma constraint simples de changeset, sem fluxo de múltiplos componentes que justifique um diagrama.

Poem

Uma função, um dispositivo só,
o índice único guarda o controle,
🐰 pulei feliz ao ver o erro no changeset,
ADRs anotados, cenoura no bolso,
nunca mais duas rodas na mesma função! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive O título é genérico e não descreve a mudança principal do PR. Use um título curto e específico, como a regra de unicidade por veículo e função nas instalações.
✅ Passed checks (4 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
test/caduceus/installations_test.exs (1)

29-53: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Adicione cobertura para a função :identifier e verifique o estado do device após falha.

O critério de aceite exige que a trava valha para ambas as funções (position e identifier), mas o teste só cobre :position. Além disso, considere verificar que device_b permanece :ready_to_install após a falha, garantindo que o rollback da transação Multi funcionou corretamente.

# Sugestão de teste adicional para :identifier
test "não permite dois dispositivos na mesma função identifier do mesmo veículo" do
  # ... setup similar, com role: :identifier
end

Ou parametrizar o teste:

for role <- [:position, :identifier] do
  `@tag` role: role
  test "não permite dois dispositivos na mesma função #{role} do mesmo veículo", %{role: role} do
    # ... corpo do teste usando role
  end
end
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/caduceus/installations_test.exs` around lines 29 - 53, The current test
only exercises the duplicate-role constraint for :position, so extend the
coverage in installations_test.exs to also validate :identifier using
Installations.install_device and the same vehicle/device setup. Use the existing
test as a template and either add a second test or parameterize it over both
roles, then assert the expected role error for each case. Also verify after the
failed second install that device_b remains :ready_to_install by checking its
persisted status, ensuring the Multi rollback behavior is covered.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@test/caduceus/installations_test.exs`:
- Around line 29-53: The current test only exercises the duplicate-role
constraint for :position, so extend the coverage in installations_test.exs to
also validate :identifier using Installations.install_device and the same
vehicle/device setup. Use the existing test as a template and either add a
second test or parameterize it over both roles, then assert the expected role
error for each case. Also verify after the failed second install that device_b
remains :ready_to_install by checking its persisted status, ensuring the Multi
rollback behavior is covered.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14520e39-3363-4b25-9cf2-6d7506cfd0e7

📥 Commits

Reviewing files that changed from the base of the PR and between 9e18e5f and 6e6d592.

📒 Files selected for processing (8)
  • docs/issues/issue-001/adr-0001.md
  • docs/issues/issue-001/adr-0002.md
  • docs/issues/issue-001/adr-0003.md
  • docs/issues/issue-001/investigation.md
  • docs/issues/issue-001/issue.md
  • lib/caduceus/installations/installation.ex
  • priv/repo/migrations/20260701012457_add_unique_index_on_installations_vehicle_role.exs
  • test/caduceus/installations_test.exs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant