Esta API foi desenvolvida para gerenciar enquetes de forma eficiente e escalável. Com ela, é possível criar enquetes, permitir que os usuários votem em opções específicas e acompanhar os resultados em tempo real. A API utiliza tecnologias modernas para garantir alta performance e facilidade de manutenção.
-
Criação de Enquetes:
- Endpoint:
POST /polls
- Permite criar uma enquete com um título e múltiplas opções.
- Endpoint:
-
Votação em Enquetes:
- Endpoint:
POST /polls/:pollId/votes
- Permite que os usuários votem em uma opção específica de uma enquete.
- Endpoint:
-
Obtenção de Detalhes de uma Enquete:
- Endpoint:
GET /polls/:pollId
- Retorna os detalhes de uma enquete, incluindo as opções e a contagem de votos.
- Endpoint:
-
Listagem de Enquetes:
-
Endpoint:
GET /polls
-
Retorna uma lista de enquetes com suporte a paginação e filtro por nome.
-
Parâmetros de Query:
page
(opcional): Número da página (padrão:1
).limit
(opcional): Quantidade de enquetes por página (padrão:10
, máximo:100
).search
(opcional): Filtro para buscar enquetes pelo título (case-insensitive).
-
Resposta:
Exemplo de Resposta
{ "data": [ { "id": "123e4567-e89b-12d3-a456-426614174000", "nome": "Qual é a sua linguagem favorita?", "createdAt": "2023-10-01T12:00:00.000Z" }, { "id": "123e4567-e89b-12d3-a456-426614174001", "nome": "Qual é o melhor framework?", "createdAt": "2023-10-02T15:30:00.000Z" } ], "meta": { "total": 15, "page": 1, "limit": 10, "totalPages": 2 } }
-
-
Resultados em Tempo Real:
- Endpoint WebSocket:
/polls/:pollId/results
- Permite acompanhar os resultados de uma enquete em tempo real via WebSocket.
- Endpoint WebSocket:
- Fastify: Framework web rápido e eficiente.
- Prisma: ORM para interagir com o banco de dados PostgreSQL.
- Redis: Utilizado para gerenciar contagens de votos e publicar atualizações em tempo real.
- WebSockets: Para comunicação em tempo real.
- TypeScript: Para tipagem estática e maior segurança no desenvolvimento.
- Node.js (versão 18 ou superior)
- Docker e Docker Compose
-
Clone o repositório:
git clone <URL_DO_REPOSITORIO> cd API-Polls
-
Instale as dependências:
npm install
-
Configure o banco de dados e o Redis com Docker Compose:
docker-compose up -d
-
Configure as variáveis de ambiente:
- Crie um arquivo
.env
na raiz do projeto com a variávelDATABASE_URL
apontando para o banco PostgreSQL.
- Crie um arquivo
-
Execute as migrações do banco de dados:
npx prisma migrate dev
-
Inicie o servidor:
npm run dev
src/http/routes
: Contém as rotas HTTP para criar enquetes, votar, listar e obter detalhes.src/http/ws
: Contém a implementação do WebSocket para resultados em tempo real.src/lib
: Configurações do Prisma e Redis.src/utils
: Utilitário para gerenciar publicação e assinatura de eventos de votação.
- URL:
POST /polls
- Body:
{ "title": "Qual é a sua linguagem favorita?", "options": ["JavaScript", "Python", "Java"] }
Exemplo de Resposta
{
"pollId": "123e4567-e89b-12d3-a456-426614174000"
}
- URL:
POST /polls/:pollId/votes
- Body:
{ "pollOptionId": "1" }
Exemplo de Resposta
{
"status": 201
}
- URL:
GET /polls/:pollId
Exemplo de Resposta
{
"poll": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Qual é a sua linguagem favorita?",
"options": [
{
"id": "1",
"title": "JavaScript",
"score": 10
},
{
"id": "2",
"title": "Python",
"score": 5
}
]
}
}
- URL:
GET /polls
- Parâmetros de Query:
page
(opcional): Número da página (padrão:1
).limit
(opcional): Quantidade de enquetes por página (padrão:10
, máximo:100
).search
(opcional): Filtro para buscar enquetes pelo título (case-insensitive).
Exemplo de Resposta
{
"data": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"nome": "Qual é a sua linguagem favorita?",
"createdAt": "2023-10-01T12:00:00.000Z"
}
],
"meta": {
"total": 15,
"page": 1,
"limit": 10,
"totalPages": 2
}
}
- URL: WebSocket
/polls/:pollId/results
Exemplo de Mensagem
{
"pollOptionId": "123e4567-e89b-12d3-a456-426614174001",
"votes": 42
}
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou enviar pull requests.
Este projeto está licenciado sob a licença MIT. Consulte o arquivo LICENSE
para mais informações.