Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lucaspanizio/nlw-expert-polls

API com a qual é possível criar, consultar e votar em enquetes com múltiplas alternativas, utilizando rotas HTTP e WebSocket. Este projeto foi desenvolvido na trilha React durante o evento Next Level Week Expert da RocketSeat, em fevereiro de 2024.
https://github.com/lucaspanizio/nlw-expert-polls

Last synced: about 1 month ago
JSON representation

API com a qual é possível criar, consultar e votar em enquetes com múltiplas alternativas, utilizando rotas HTTP e WebSocket. Este projeto foi desenvolvido na trilha React durante o evento Next Level Week Expert da RocketSeat, em fevereiro de 2024.

Awesome Lists containing this project

README

        


Logo NLW SpaceTime

Expert Polls




API capaz de criar, consultar e votar em enquetes com múltiplas alternativas, utilizando rotas HTTP e WebSocket. Este projeto foi desenvolvido na trilha Node.js durante a 14ª edição do evento Next Level Week Expert da RocketSeat, em fevereiro de 2024.


🚀 Tecnologias   |   
☝ Pré-Requisitos   |   
⚡ Como Executar   |   
📝 Documentação   |   
📜 Licença



Esboço do Projeto NLW Expert Polls



## 🚀 Tecnologias


JavaScript
Typescript
NPM
Node.js
Redis
Prisma
PostgreeSQL
Docker
Fastify
Zod
Hoppscotch
VS Code


## ☝ Pré-Requisitos

É necessário ter Node.js e Docker instalados previamente.


## ⚡ Como executar

Clone este repositório

```bash
git clone https://github.com/lucaspanizio/nlw-expert-polls.git
```

Acesse o diretório da aplicação

```bash
cd nlw-expert-polls
```

Instale as dependências

```bash
npm install
```

Suba os containers Docker do PostgreeSQL e Redis

```bash
docker compose up -d
```

Execute as migrações do Prisma para criar as tabelas do BD

```bash
npx prisma migrate dev
```

Execute a aplicação

```bash
npm run dev
```

Faça requisições para as rotas mapeadas da API, conforme documentação abaixo, por meio de uma plataforma como Postman ou Hoppscotch.


## 📝 Documentação

## Rotas HTTP

baseURL: localhost:3333

POST http://{baseURL}/polls

Cria uma nova enquete.

#### Request body

```json
{
"title": "Qual é o melhor framework Node.JS ?",
"options": ["Express", "Fastify", "NestJS", "HapiJS"]
}
```

#### Response body

```json
{
"pollId": "16c73779-d463-43de-b832-4b4b10fc2b63"
}
```

![Print da requisição POST para a rota de criação de uma enquete](https://github.com/lucaspanizio/nlw-expert-polls/assets/32407181/a22501c6-48ec-476e-b7ae-4c823ee8008b)


POST http://{baseURL}/polls/:pollId/votes

Vota em uma opção de uma enquete.

Obs.: Ao votar em outra opção de uma mesma enquete já votada anteriormente, o voto original será substituído pelo novo.

#### Request body

```json
{
"pollOptionId": "2db536d6-2ffd-464d-b91b-1ee4c9e59d64"
}
```

#### Response body

```json
{
"message": "Voto realizado com sucesso."
}
```

![Print da requisição POST para votar em uma opção de determinada enquete](https://github.com/lucaspanizio/nlw-expert-polls/assets/32407181/f323786d-a22b-42df-81b4-40542abefd51)


GET http://{baseURL}/polls/:pollId

Retorna dados de uma única enquete.

#### Response body

```json
{
"poll": {
"id": "16c73779-d463-43de-b832-4b4b10fc2b63",
"title": "Qual é o melhor framework Node.JS ?",
"options": [
{
"id": "530b2c40-e197-44a7-80a3-7653f6753f3a",
"title": "Express",
"score": 0
},
{
"id": "2db536d6-2ffd-464d-b91b-1ee4c9e59d64",
"title": "Fastify",
"score": 1
},
{
"id": "ae6f6ee1-5a4e-44b7-a0e3-dee88e8c7485",
"title": "NestJS",
"score": 0
},
{
"id": "8a8af74c-2844-4d6a-8c82-9fdede545773",
"title": "HapiJS",
"score": 0
}
]
}
}
```

![Print da requisição GET que retorna os dados de uma enquete específica](https://github.com/lucaspanizio/nlw-expert-polls/assets/32407181/029aa379-666d-460a-b7c2-ce6a86db303b)

## Rotas WebSockets

ws://localhost:3333/polls/:pollId/results

Recebe essa mensagem a cada voto feito.
Obs.: Se usuário já havia votado nessa enquete, recebe também uma mensagem relativa a ID da opção antiga, e com o novo valor decrementado.

#### Message

```json
{
"pollOptionId": "2db536d6-2ffd-464d-b91b-1ee4c9e59d64",
"votes": 1
}
```

![Print do retorno enviado pelo WebSocket ao "escutar" um POST na rota do voto em uma opção da enquete.](https://github.com/lucaspanizio/nlw-expert-polls/assets/32407181/c2aa091e-48e2-4d3b-83a8-ae4620421cf3)


## 📜 Licença

Esse projeto está sob a licença MIT.

License

#### Desenvolvido por José Lucas Panizio 🖖

[![Linkedin Badge](https://img.shields.io/badge/-LinkedIn-blue?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/lucaspanizio/)](https://www.linkedin.com/in/lucaspanizio/)
[![Gmail Badge](https://img.shields.io/badge/-Gmail-ff0000?style=flat-square&labelColor=ff0000&logo=gmail&logoColor=white&link=mailto:[email protected])](mailto:[email protected])