Api de aplicação para escolher qual é o melhor lugar para se viver em MiddleEarth. Os usuários que possuem cadastro podem enviar fotos de seu lugares favoritos para que qualquer um possa votar.
Frontend: https://github.com/F13Fabricio/mid-angular
[TOC]
- Cadastro de usuários;
- Autenticação com JWT (JSON Web Token);
- Cadastro, edição e exclusão de lugares (somente usuários autenticados);
- Imagens sendo salvas no AWS S3;
- Sistema de votação em tempo usando WebSocket;
- Opção para editar a imagem do lugar;
- Exclusão da imagem após a exclusão do lugar no banco de dados;
- Testes (unitários e integração);
- Mysql
- Nodejs
- Bucket do AWS S3 (com acesso público)
- Após instalar todas as dependências defina todas as informações de ambiente no .env.
- Crie uma base de dados no Mysql com nome e usuário informados nas variáveis de ambiente.
- Execute o comando abaixo para criar as tabelas no banco de dados:
$ npm ./node_modues/.bin/sequelize db:migrate
- Agora basta executar:
$ npm run start
Endpoint base para quando o servidor estiver rodando localmente:
http://localhost:3000/mid-server/api/v1
Endpoint: POST /users
Autenticado: Não
Exemplo de requisição:
{
"name": "Gollum",
"email": "[email protected]",
"password": "my_precious"
}
Exemplo de resposta:
{
"token": "jwt_token",
"data": {
"id": 1,
"name": "Gollum",
"email": "[email protected]",
"updatedAt": "2019-10-21T14:12:34.059Z",
"createdAt": "2019-10-21T14:12:34.059Z"
}
}
Endpoint: POST /login
Autenticado: Não
Exemplo de requisição:
{
"email": "[email protected]",
"password": "slkdfjlklskd"
}
Exemplo de resposta:
{
"token": "jwt_token",
"data": {
"id": 1,
"name": "Gollum",
"email": "[email protected]",
"updatedAt": "2019-10-21T14:12:34.059Z",
"createdAt": "2019-10-21T14:12:34.059Z"
}
}
Endpoint: GET /users/:userId
Autenticado: Sim
Header:
Header | Exemplo |
---|---|
authorization | Bearer token |
Exemplo de resposta:
{
"data": {
"id": 1,
"name": "Gollum",
"email": "[email protected]",
"createdAt": "2019-10-21T14:12:34.000Z",
"updatedAt": "2019-10-21T14:12:34.000Z"
}
}
Endpoint: POST /users/:userId/places
Autenticado: Sim
Header:
Header | Exemplo |
---|---|
authorization | Bearer token |
Requisição do tipo Multipart:
Campo | Exemplo |
---|---|
file | campos_de lis.png |
name | Campos de Lis |
Exemplo de resposta:
{
"data": {
"id": 1,
"name": "Campos de Lis",
"UserId": "1",
"imageUrl": "image_url",
"numberOfVotes": 0,
"updatedAt": "2019-10-21T14:24:03.894Z",
"createdAt": "2019-10-21T14:24:03.894Z"
}
}
Endpoint: GET /places
Autenticado: Não
Exemplo de resposta:
{
"count": 1,
"data": [
{
"data": {
"id": 1,
"name": "Campos de Lis",
"UserId": "1",
"imageUrl": "image_url",
"numberOfVotes": 0,
"updatedAt": "2019-10-21T14:24:03.894Z",
"createdAt": "2019-10-21T14:24:03.894Z"
}
}
]
}
Endpoint: GET /places/:placeId
Autenticado: Não
Exemplo de resposta:
{
"data": {
"id": 1,
"name": "Campos de Lis",
"UserId": "1",
"imageUrl": "image_url",
"numberOfVotes": 0,
"updatedAt": "2019-10-21T14:24:03.894Z",
"createdAt": "2019-10-21T14:24:03.894Z"
}
}
Endpoint: PUT /places/:placeId
Autenticado: Sim
Header:
Header | Exemplo |
---|---|
authorization | Bearer token |
Exemplo de requisição:
{
"name": "Vales do Anduin"
}
Exemplo de resposta:
{
"data": {
"id": 1,
"name": "Vales do Anduin",
"UserId": "1",
"imageUrl": "image_url",
"numberOfVotes": 0,
"updatedAt": "2019-10-21T14:24:03.894Z",
"createdAt": "2019-10-21T14:24:15.894Z"
}
}
Endpoint: DELETE /places/:placeId
Autenticado: Sim
Header:
Header | Exemplo |
---|---|
authorization | Bearer token |