https://documenter.getpostman.com/view/28316400/2s9YysC1jU
https://github.com/anderson-nunes/labeddit-frontend
Clique aqui para visualizar a modelagem do banco de dados
- Clone o repositório.
- No gerenciador de pacotes NPM, execute:
npm i
- Crie seu próprio arquivo
file-name.db
na pastadatabase
. - Abra o arquivo
labbedit.sql
e execute os comandos de criação de tabela. - Crie um arquivo chamado
.env
na raiz do projeto para colocar essas variáveis de ambiente.
#Porto Expresso
PORTA=3003
#Caminho do arquivo do banco de dados SQLite
DB_FILE_PATH=./src/database/nome-do-arquivo.db
#Credenciais e chaves secretas
JWT_KEY=escolheu uma chave secreta
#Tempo de expiração do token (exemplo: 1 dia)
JWT_EXPIRES_IN=1d
- Execute o servidor.
npm run dev
- TypeScript
- Node.js
- Express
- SQLite3
- Bcrypt.js
- Knex
- Jest
- Cors
- Date-fns
- Dotenv
- Jsonwebtoken
- Uuid
- Zod
Para rodar todos os testes:
npm run test
Para rodar todos os testes detalhadamente:
npm run test:verbose
Para rodar a cobertura de todos os testes:
npm run test:coverage
-
Documentação Postman de todos os endpoints (obrigatória para correção)
-
Endpoints
- signup
- login
- create post
- get posts
- get postsById
- like / dislike post
- create comment
- get comments
- like / dislike comment
-
Autenticação e autorização
- identificação UUID
- senhas hasheadas com Bcrypt
- tokens JWT
-
Código
- POO
- Arquitetura em camadas
- Roteadores no Express
-
README.md
O enum de roles e o payload do token JWT devem estar no seguinte formato:
export enum USER_ROLES {
NORMAL = "NORMAL",
ADMIN = "ADMIN",
}
export interface TokenPayload {
id: string;
name: string;
role: USER_ROLES;
}
Endpoint público utilizado para cadastro. Devolve um token jwt.
// request POST /users/signup
// body JSON
{
"name": "Beltrana",
"email": "[email protected]",
"password": "beltrana00"
}
// response
// status 201 CREATED
{
token: "um token jwt"
}
Endpoint público utilizado para login. Devolve um token jwt.
// request POST /users/login
// body JSON
{
"email": "[email protected]",
"password": "beltrana00"
}
// response
// status 200 OK
{
token: "um token jwt"
}
Endpoint protegido, requer um token jwt para acessá-lo.
// request POST /posts
// headers.authorization = "token jwt"
// body JSON
{
"content": "Post novo!"
}
// response
// status 201 CREATED
Endpoint protegido, requer um token jwt para acessá-lo.
// request GET /posts
// headers.authorization = "token jwt"
// response
// status 200 OK
[
{
"id": "uma uuid v4",
"content": "Hoje vou estudar POO!",
"likes": 2,
"dislikes" 1,
"createdAt": "2023-01-20T12:11:47:000Z"
"updatedAt": "2023-01-20T12:11:47:000Z"
"creator": {
"id": "uma uuid v4",
"name": "Fulano"
}
},
{
"id": "uma uuid v4",
"content": "kkkkkkkkkrying",
"likes": 0,
"dislikes" 0,
"createdAt": "2023-01-20T15:41:12:000Z"
"updatedAt": "2023-01-20T15:49:55:000Z"
"creator": {
"id": "uma uuid v4",
"name": "Ciclana"
}
}
]
Endpoint protegido, requer um token jwt para acessá-lo.
// request COMMENT /comments
// headers.authorization = "token jwt"
// body JSON
{
"content": "Comentário novo!"
}
// response
// status 201 CREATED
Endpoint protegido, requer um token jwt para acessá-lo.
Quem criou o post não pode dar like ou dislike no mesmo.
Caso dê um like em um post que já tenha dado like, o like é desfeito.
Caso dê um dislike em um post que já tenha dado dislike, o dislike é desfeito.
Caso dê um like em um post que tenha dado dislike, o like sobrescreve o dislike.
Caso dê um dislike em um post que tenha dado like, o dislike sobrescreve o like.
// request PUT /posts/:id/like
// headers.authorization = "token jwt"
// body JSON
{
"like": true
}
// response
// status 200 OK
// request PUT /posts/:id/like
// headers.authorization = "token jwt"
// body JSON
{
"like": false
}
// response
// status 200 OK
- no SQLite, lógicas booleanas devem ser controladas via 0 e 1 (INTEGER)
- quando like valer 1 na tabela é porque a pessoa deu like no post
- na requisição like é true
- quando like valer 0 na tabela é porque a pessoa deu dislike no post
- na requisição like é false
- caso não exista um registro na tabela de relação, é porque a pessoa não deu like nem dislike
- caso dê like em um post que já tenha dado like, o like é removido (deleta o item da tabela)
- caso dê dislike em um post que já tenha dado dislike, o dislike é removido (deleta o item da tabela)