
#3 Desafio de Programação: Sistema de Fila de Espera
Objetivo
Desenvolver um Sistema de Fila de Espera completo, desde o backend até a interface (opcional), que organiza clientes em filas de atendimento. O sistema deve gerenciar múltiplas filas, priorizar atendimentos, enviar notificações e fornecer painéis para administração e consulta dos clientes.
Especificação do Desafio
Você deverá construir um sistema funcional com as seguintes capacidades:
Mínimo Viável
- Registro de clientes em filas com categorias e prioridades.
- Listagem de clientes na fila com ordenação por prioridade.
- Chamar clientes em ordem e registrar o histórico.
- Consulta do cliente à sua posição na fila.
Extras para Diferencial
- Notificações por SMS ou e-mail.
- Painel administrativo com métricas (tempo médio de espera, volume de atendimentos).
- Configuração de regras de fila e prioridades.
O que será aprendido
- Backend:
- Desenvolvimento de APIs RESTful.
- Organização de filas e priorização.
- Persistência de dados com bancos de dados relacionais ou não-relacionais.
- Frontend (opcional):
- Criação de interfaces simples para painéis de clientes e administradores.
- Consumo de APIs.
- DevOps:
- Autenticação e autorização com JWT.
- Configuração de um sistema para notificações externas (ex.: Twilio).
- Conceitos Gerais:
- Manipulação de filas.
- Estruturação e otimização de queries no banco de dados.
- Design de sistemas escaláveis e de alto desempenho.
Arquitetura
1. Diagrama de Arquitetura
[Frontend]
↓ (API RESTful)
[Backend]
↓
[Database]
2. Camadas
- Frontend (opcional):
- Painel do cliente para consultar posição na fila.
- Painel administrativo para gerenciar filas e visualizar métricas.
- Backend:
- API para registro, listagem, chamada e notificações.
- Lógica de prioridade e reordenação.
- Database:
- Relacional: PostgreSQL/MySQL.
- Estruturas básicas:
- Clientes: ID, nome, prioridade, tipo, status.
- Filas: ID, categoria, clientes em espera.
- Histórico: Data, hora, cliente chamado.
Endpoints
1. Endpoints de Cliente
-
Registrar cliente na fila
- POST
/api/queue
- Body:
{ "name": "João Silva", "category": "Consulta", "priority": "Normal", "contact": "email@example.com" }
- Response:
{ "id": "12345", "position": 5 }
- POST
-
Consultar posição na fila
- GET
/api/queue/{id}/position
- Response:
{ "position": 5, "estimated_time": "15 minutes" }
- GET
-
Cancelar inscrição na fila
- DELETE
/api/queue/{id}
- DELETE
2. Endpoints Administrativos
-
Listar todos os clientes na fila
- GET
/api/queue
- Response:
[ { "id": "12345", "name": "João Silva", "position": 1, "priority": "Normal" } ]
- GET
-
Chamar próximo cliente
- POST
/api/queue/next
- Response:
{ "called": { "id": "12345", "name": "João Silva" }, "position": 1 }
- POST
-
Visualizar métricas
- GET
/api/admin/metrics
- Response:
{ "average_wait_time": "10 minutes", "total_attended": 25, "categories": { "Consulta": 15, "Exame": 10 } }
- GET
Estrutura de Dados
Tabelas Relacionais
- Clientes
id
: ID único.name
: Nome do cliente.category
: Tipo de fila.priority
: Prioridade do cliente.status
: Em espera, atendido, ou desistente.
- Filas
id
: ID único.category
: Nome da categoria.clients
: Lista de IDs de clientes associados.
- Histórico
id
: ID único.client_id
: ID do cliente atendido.called_at
: Data e hora da chamada.
Diferenciais (Extras)
- Notificações Externas:
- Integre com serviços como Twilio ou SendGrid para enviar alertas.
- UX/UI:
- Crie uma interface visual intuitiva para gerenciamento.
- Escalabilidade:
- Adicione balanceamento de carga para filas com grande volume de clientes.
- Automação:
- Crie scripts para geração de dados de teste e simulação de filas em tempo real.
Como Disponibilizar no Portfólio
Para adicionar esse projeto ao seu portfólio de maneira atrativa, considere os seguintes pontos:
-
Publicar no GitHub com um bom README.md: Suba o código no GitHub com uma descrição completa do projeto, incluindo uma breve introdução, estrutura do banco de dados, principais endpoints e instruções para instalação modo de uso, regras de negócio, explicação das decisões técnicas e etc.
-
Documentação da API: Use o Swagger ou Postman para documentar a API, incluindo exemplos de requisições e respostas. Isso facilita a compreensão das funcionalidades e mostra seu cuidado com documentação.
-
Demonstração com Docker: Disponibilize uma configuração Docker para facilitar a execução da API. Isso torna o projeto acessível para quem deseja testá-lo rapidamente.
-
Apresentação Visual: Crie um README.md organizado e visualmente atrativo, com imagens e diagramas simples (como diagrama ER) para demonstrar o funcionamento e a arquitetura do sistema.
-
Demo em Produção: Se possível, hospede o projeto em uma plataforma gratuita como Vercel ou Render, para que recrutadores ou interessados possam testar a API em tempo real.
-
Explicação Técnica no Portfólio: Adicione uma seção explicando os desafios enfrentados e soluções implementadas. Destacar problemas específicos resolvidos mostra seu conhecimento técnico.
Boa sorte e bom desafio! 🚀
Envie o link do seu projeto
Envie o link do seu projeto para o email contato@racoelho.com.br.