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.
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.
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.serverGraphiQL (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).
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 } } } }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.
mix testHá um glossário curto dos termos do domínio em DOMINIO.md.