Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Caduceus

Aplicação reduzida de gestão de frota: clientes, veículos, dispositivos, técnicos e envios. Modela o fluxo de enviar um equipamento ao cliente e, depois, o técnico instalar esse dispositivo em um veículo, em uma função (posição/GPS ou identificação do motorista).

A stack é Elixir + Phoenix + Ecto + Absinthe (GraphQL). Não tem problema se você nunca trabalhou com ela: faz parte do desafio se virar em um ambiente novo. Você não precisa escrever GraphQL, só rodar uma mutation pronta que está mais abaixo.

O que precisamos de você

Relato do time de operações: "Ao instalar um dispositivo em um veículo, sem querer instalamos dois e o sistema deixou. O veículo ficou com dois dispositivos na mesma função. Isso não deveria ser possível, mas o sistema não barrou. Precisamos corrigir e criar a trava pra não acontecer de novo."

Sua tarefa é investigar, corrigir e implementar a proteção que falta. Capriche em deixar claro o seu raciocínio: vamos conversar sobre a sua solução em uma call de 1h.

Como rodar

Pré-requisitos: Elixir 1.15+, Docker (para o Postgres).

# 1. Suba o Postgres
docker compose up -d

# 2. Instale dependências e prepare o banco (cria, migra e roda os seeds)
mix setup

# 3. Suba a aplicação
mix phx.server

GraphiQL (para explorar e rodar queries/mutations): http://localhost:4000/v1/graphql/ui

Os seeds imprimem os ids de cliente, técnico, veículo e dispositivos no terminal quando você roda mix setup. Você também pode listar tudo pelo GraphiQL (vehicles, devices, technicians).

Como reproduzir o problema

Com os seeds carregados, pegue o id do veículo e de dois dispositivos ready_to_install e rode a mutation abaixo duas vezes, trocando só o deviceId (mantendo o mesmo vehicleId e role: position):

mutation Instalar($vehicleId: ID!, $deviceId: ID!, $technicianId: ID!, $role: InstallationRole!) {
  installDevice(vehicleId: $vehicleId, deviceId: $deviceId, technicianId: $technicianId, role: $role) {
    id
    role
    device { uniqueId }
    vehicle { plate }
  }
}

Variáveis (ajuste os ids para os que apareceram nos seeds):

{ "vehicleId": "1", "deviceId": "1", "technicianId": "1", "role": "POSITION" }

(role aceita POSITION ou IDENTIFIER.)

Você vai notar que a segunda instalação também é aceita, e o veículo passa a ter dois dispositivos na função position. É exatamente esse o problema relatado.

Para ver o estado do veículo:

query { vehicle(id: "1") { plate installations { role device { uniqueId } } } }

Por onde começar

O fluxo de instalação vive em lib/caduceus/installations/. As mutations GraphQL ficam em lib/caduceus_web/. Você não precisa mexer na camada GraphQL para resolver o problema.

Testes

mix test

Domínio

Há um glossário curto dos termos do domínio em DOMINIO.md.

About

Aplicação reduzida de gestão de frota: clientes, veículos, dispositivos, técnicos e envios (Elixir/Phoenix/Absinthe).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages