
Plataforma completa para criação, gerenciamento e participação em enquetes com autenticação segura e interface responsiva inspirada no template oficial do Material UI.
- Visão Geral
- Arquitetura
- Stack Tecnológica
- Estrutura do Projeto
- Configuração e Execução
- Variáveis de Ambiente
- API Endpoints
- Papéis e Permissões
- Deploy e CI/CD
- Testes
- Swagger
- Demonstração
- Screenshots do Sistema
- Contribuição
- Licença
- Contato
O PollHub é uma plataforma completa para criação, gerenciamento e participação em enquetes online. Desenvolvido com tecnologias modernas, oferece uma experiência fluida tanto para criadores quanto para participantes de enquetes.
- Autenticação Segura: Sistema completo de login/registro com JWT
- Criação de Enquetes: Interface intuitiva para criar enquetes com múltiplas opções
- Votação em Tempo Real: Participação em enquetes com feedback instantâneo
- Resultados Dinâmicos: Visualização de resultados em tempo real com gráficos
- Compartilhamento de Enquetes: Sistema para compartilhar enquetes próprias
- Perfil de Usuário: Gerenciamento de dados pessoais e histórico de participação
- Controle Administrativo: Sistema de permissões para administradores
- Interface Responsiva: Design moderno e adaptável a diferentes dispositivos baseado no template oficial do Material UI
- API RESTful: Backend robusto com documentação completa via Swagger (apenas em ambiente local)
O frontend foi desenvolvido utilizando como base o template oficial do Material UI para autenticação:
- Template Base: Material UI Sign-Up Template
- Design System: Material Design 3
- Componentes: Material UI v5+
O projeto segue uma arquitetura de Single Page Application (SPA) com backend RESTful:
- React 18+: Biblioteca para construção da interface
- Vite: Build tool de alta performance
- Material-UI: Framework de design moderno
- Context API: Gerenciamento de estado global
- React Router: Navegação entre páginas
- Spring Boot 3.x: Framework para desenvolvimento enterprise
- Spring Security + JWT: Autenticação e autorização
- Spring Data JPA: Persistência de dados
- PostgreSQL em Nuvem: Banco de dados relacional fornecido pelo Render
- Swagger/OpenAPI: Documentação automática da API (apenas local)
- Frontend: Hospedado no Vercel com CI/CD automático
- Backend: Hospedado no Render com deploy contínuo
- Banco de Dados: PostgreSQL em nuvem fornecido pelo Render
- CI/CD: GitHub Actions para automação
- React 18+: Biblioteca JavaScript para interfaces
- Vite: Build tool e dev server otimizado
- Material-UI (MUI): Framework de componentes React
- React Router v6+: Roteamento de páginas
- Axios: Cliente HTTP para APIs
- Context API: Gerenciamento de estado
- ESLint: Linting e padronização de código
- Java 21: Linguagem de programação
- Spring Boot 3.x: Framework de desenvolvimento
- Spring Security: Segurança e autenticação
- Spring Data JPA: Acesso a dados
- JWT: Tokens de autenticação
- PostgreSQL: Sistema de banco de dados em nuvem (Render)
- Swagger/OpenAPI 3: Documentação da API (apenas local)
- Maven: Gerenciamento de dependências
- JUnit 5: Testes unitários
- Mockito: Mocks para testes
- GitHub Actions: CI/CD
- Docker: Containerização (opcional)
🗂️ Ver estrutura do Frontend
pollhub-frontend/
├── public/ # Arquivos estáticos
├── src/
│ ├── api/ # Configuração da API
│ │ └── client.js # Cliente HTTP configurado
│ ├── assets/ # Recursos estáticos
│ ├── components/ # Componentes reutilizáveis
│ │ ├── PollCard.jsx # Card de enquete
│ │ ├── PollCreationDialog.jsx # Modal de criação de enquetes
│ │ └── ProtectedRoute.jsx # Proteção de rotas
│ ├── contexts/ # Contextos React
│ │ └── AuthContext.jsx # Contexto de autenticação
│ ├── pages/ # Páginas da aplicação
│ │ ├── AllPolls.jsx # Lista de todas as enquetes
│ │ ├── Dashboard.jsx # Dashboard principal
│ │ ├── Login.jsx # Página de login
│ │ ├── PollResults.jsx # Resultados de enquetes
│ │ ├── PollVotes.jsx # Votos de uma enquete
│ │ ├── Register.jsx # Cadastro de usuários
│ │ ├── UserProfile.jsx # Perfil do usuário
│ │ └── UserVotes.jsx # Histórico de votos
│ ├── theme/ # Configuração do tema MUI
│ ├── App.css # Estilos globais
│ ├── AppRoutes.jsx # Configuração de rotas
│ ├── index.css # Reset CSS
│ └── main.jsx # Ponto de entrada
├── .env # Variáveis de ambiente
├── package.json # Dependências e scripts
├── vercel.json # Configuração do Vercel
└── vite.config.js # Configuração do Vite
🗂️ Ver estrutura do Backend
pollhub/
├── .github/workflows/ # CI/CD GitHub Actions
│ └── ci.yml # Pipeline de integração
├── src/main/java/com/pablorodriguesb/pollhub/
│ ├── config/ # Configurações
│ │ ├── OpenApiConfig.java # Configuração do Swagger
│ │ └── SecurityConfig.java # Configuração de segurança
│ ├── controller/ # Controllers REST
│ │ ├── AdminPollController.java # Endpoints administrativos
│ │ ├── AuthController.java # Autenticação
│ │ ├── PollController.java # Enquetes
│ │ ├── UserController.java # Usuários
│ │ └── VoteController.java # Votação
│ ├── dto/ # Data Transfer Objects
│ │ ├── OptionDTO.java # DTO de opções
│ │ ├── PollDTO.java # DTO de enquetes
│ │ ├── UserDTO.java # DTO de usuários
│ │ └── VoteDTO.java # DTO de votos
│ ├── exception/ # Tratamento de exceções
│ │ ├── GlobalExceptionHandler.java
│ │ └── ResourceNotFoundException.java
│ ├── model/ # Entidades JPA
│ │ ├── Option.java # Opção de enquete
│ │ ├── Poll.java # Enquete
│ │ ├── User.java # Usuário
│ │ └── Vote.java # Voto
│ ├── repository/ # Repositórios JPA
│ │ ├── OptionRepository.java
│ │ ├── PollRepository.java
│ │ ├── UserRepository.java
│ │ └── VoteRepository.java
│ ├── security/ # Segurança JWT
│ │ ├── JwtAuthenticationEntryPoint.java
│ │ ├── JwtRequestFilter.java
│ │ └── JwtTokenUtil.java
│ ├── service/ # Camada de serviços
│ │ ├── CustomUserDetailsService.java
│ │ ├── PollService.java
│ │ ├── UserService.java
│ │ └── VoteService.java
│ └── PollHubApplication.java # Classe principal
├── src/main/resources/
│ └── application.properties # Configurações (não versionado)
├── src/test/ # Testes automatizados
├── Dockerfile # Container Docker
├── pom.xml # Dependências Maven
└── README.md # Documentação
- Java 21
- Maven 3.8+
- Node.js 16+
- PostgreSQL 13+ (local ou em nuvem)
- Git
git clone https://github.com/pablorodriguesb/pollhub.git
cd pollhub
Para desenvolvimento local, crie um banco PostgreSQL:
CREATE DATABASE pollhub;
💡 Nota: Em produção, o sistema utiliza PostgreSQL em nuvem fornecido pelo Render.
O arquivo application.properties
está oculto por questões de segurança. Todas as configurações são feitas via variáveis de ambiente.
Configure as seguintes variáveis de acordo com seu sistema operacional:
# Exemplos de configuração (sintaxe varia por SO)
DB_URL=jdbc:postgresql://localhost:5432/pollhub
DB_USERNAME=seu_usuario
DB_PASSWORD=sua_senha
JWT_SECRET=sua_chave_secreta_jwt_muito_longa_e_segura
JWT_EXPIRATION=86400000
# Compilar e executar
mvn clean spring-boot:run
# Ou compilar e executar o JAR
mvn clean package
java -jar target/pollhub-0.0.1-SNAPSHOT.jar
O backend estará disponível em http://localhost:8080
cd pollhub-frontend
npm install
Crie o arquivo .env
na raiz do frontend:
VITE_API_BASE_URL=http://localhost:8080/api
# Modo desenvolvimento
npm run dev
# Build para produção
npm run build
# Preview do build
npm run preview
O frontend estará disponível em http://localhost:5173
Todas as configurações sensíveis são gerenciadas via variáveis de ambiente:
Variável | Descrição | Exemplo |
---|---|---|
DB_URL |
URL de conexão com PostgreSQL | jdbc:postgresql://localhost:5432/pollhub |
DB_USERNAME |
Usuário do banco de dados | postgres |
DB_PASSWORD |
Senha do banco de dados | minhasenha123 |
JWT_SECRET |
Chave secreta para JWT (mín. 256 bits) | minha_chave_super_secreta_jwt_256_bits |
JWT_EXPIRATION |
Tempo de expiração do token JWT em milissegundos (padrão: 86400000, ou seja, 24 horas) | 86400000 |
Variável | Descrição | Exemplo |
---|---|---|
VITE_API_BASE_URL |
URL base da API backend | http://localhost:8080/api |
POST /api/auth/login # Fazer login
POST /api/users/register # Registrar usuário
GET /api/users/username/{username} # Buscar usuário por username
GET /api/users/{username}/polls # Listar enquetes de um usuário
GET /api/users/me/votes # Listar votos do usuário atual
GET /api/users/me/polls # Listar enquetes do usuário atual
GET /api/polls # Listar todas as enquetes
POST /api/polls # Criar nova enquete
GET /api/polls/{id} # Obter enquete específica
DELETE /api/polls/{id} # Deletar enquete (apenas criador/admin)
GET /api/polls/{id}/results # Obter resultados da enquete
POST /api/polls/{id}/vote # Votar em uma enquete
GET /api/votes/poll/{pollId} # Obter votos de uma enquete
DELETE /admin/polls/{id} # Deletar qualquer enquete (apenas admins)
Request:
POST /api/polls
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
"question": "Qual sua linguagem de programação favorita?",
"options": [
{"text": "Java"},
{"text": "JavaScript"},
{"text": "Python"},
{"text": "C#"}
]
}
Response:
{
"id": 1,
"question": "Qual sua linguagem de programação favorita?",
"options": [
{"id": 1, "text": "Java", "voteCount": 0},
{"id": 2, "text": "JavaScript", "voteCount": 0},
{"id": 3, "text": "Python", "voteCount": 0},
{"id": 4, "text": "C#", "voteCount": 0}
],
"createdBy": "usuario123",
"createdAt": "2024-01-15T10:30:00Z",
"totalVotes": 0
}
Request:
POST /api/polls/1/vote
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
"optionId": 2
}
Response:
{
"id": 1,
"pollId": 1,
"optionId": 2,
"votedBy": "usuario123",
"votedAt": "2024-01-15T10:35:00Z"
}
O sistema implementa dois níveis de acesso baseados em permissões:
- ✅ Criar enquetes
- ✅ Votar em enquetes (uma vez por enquete)
- ✅ Visualizar resultados
- ✅ Gerenciar, deletar e compartilhar as próprias enquetes
- ✅ Visualizar histórico de votos
- ❌ Deletar enquetes de outros usuários
- ✅ Todas as permissões de usuário
- ✅ Deletar qualquer enquete
- ✅ Visualizar estatísticas globais
- ✅ Gerenciar usuários (futuro)
📝 Nota: O controle administrativo é realizado através de permissões no backend. Não existe interface gráfica específica para administração, apenas endpoints protegidos por roles.
- Frontend: Hospedado no Vercel
- Backend: Hospedado no Render
- Banco de Dados: PostgreSQL em nuvem fornecido pelo Render
- CI/CD: GitHub Actions
- Conecte seu repositório ao Render
- Configure as variáveis de ambiente:
DB_URL=sua_url_postgresql_render DB_USERNAME=seu_usuario DB_PASSWORD=sua_senha JWT_SECRET=sua_chave_jwt_producao JWT_EXPIRATION=86400000
- O deploy acontece automaticamente a cada push na branch
main
- Conecte seu repositório ao Vercel
- Configure a variável de ambiente:
VITE_API_BASE_URL=https://sua-api.render.com/api
- O deploy acontece automaticamente a cada push
O arquivo .github/workflows/ci.yml
automatiza:
- Execução de testes
- Build da aplicação
- Validação da qualidade do código
- Deploy automático em produção
# Backend (Render)
DB_URL=jdbc:postgresql://<host-do-banco>:5432/<nome-do-banco>
DB_USERNAME=<usuario_prod>
DB_PASSWORD=<senha_super_segura_prod>
JWT_SECRET=<chave_jwt_muito_longa_e_segura_para_producao_256_bits>
JWT_EXPIRATION=86400000 # 24 horas em milissegundos
# Frontend (Vercel)
VITE_API_BASE_URL=https://pollhub-api.render.com/api
mvn test
mvn test jacoco:report
- Testes Unitários dos Serviços: PollService, UserService, VoteService e CustomUserDetailsService
- Teste Principal de Aplicação: PollHubApplicationTests para verificar o contexto da aplicação
# Testar apenas serviços
mvn test -Dtest="*ServiceTest"
# Testar um serviço específico
mvn test -Dtest="PollServiceTest"
# Executar testes com perfil de teste
mvn test -Dspring.profiles.active=test
# Executar testes unitários
npm run test
# Executar testes com coverage
npm run test:coverage
# Executar testes E2E
npm run test:e2e
- Local:
http://localhost:8080/swagger-ui.html
- Produção: Não disponível (desabilitado por segurança)
Para acessar a documentação completa da API, execute o projeto localmente e acesse o endpoint Swagger mencionado acima.
- Visão geral das enquetes
- Estatísticas de participação
- Acesso rápido às funcionalidades
- Interface intuitiva para criar enquetes
- Adição dinâmica de opções
- Validação em tempo real
- Interface de votação simples
- Resultados em tempo real com gráficos
- Histórico de participação
- Sistema para compartilhar enquetes próprias
- URLs amigáveis para compartilhamento
- Controle de privacidade
📸 Screenshots do Sistema
![]() Tela Principal - Dashboard |
![]() Criação de Enquetes |
![]() Visualização de Resultados |
![]() Interface Mobile |
Contribuições são muito bem-vindas! Para contribuir:
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-funcionalidade
) - Implemente suas mudanças seguindo os padrões do projeto
- Execute os testes e garanta que tudo funciona
- Commit suas mudanças (
git commit -m 'feat: Nova funcionalidade'
) - Push para a branch (
git push origin feature/nova-funcionalidade
) - Abra um Pull Request detalhando as alterações
feat: Nova funcionalidade
fix: Correção de bug
docs: Alteração na documentação
style: Formatação de código
refactor: Refatoração
test: Adição/correção de testes
chore: Tarefas de build, CI/CD
- Criação, votação e gerenciamento de enquetes
- Enquetes com tempo limite
- Autenticação JWT e controle de permissões (ROLE_USER, ROLE_ADMIN)
- Deletar e compartilhar enquetes próprias
- Responsividade para dispositivos móveis
- Integração com redes sociais
- Painel administrativo visual
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Pablo Rodrigues
- GitHub: @pablorodriguesb
- LinkedIn: Pablo Rodrigues
- Email: [email protected]
⭐ Se este projeto te agradou, deixe uma estrela!