Esse é o repositório de referência para o material de revisão de backend. Temos abaixo um exemplo de enunciado de projeto baseado em um app de playlists que será desenvolvido na dinâmica por meio dos materiais assíncronos.
Leia-o com atenção antes de assistir os vídeos, pois o contexto dos schemas e das funcionalidades são importantes para o entendimento.
- NodeJS
- Typescript
- Express
- SQL e SQLite
- Knex
- POO
- Arquitetura em camadas
- Geração de UUID
- Geração de hashes
- Autenticação e autorização
- Roteamento
- Postman
https://dbdiagram.io/d/63ebc288296d97641d80ea1c
-
Endpoints
- signup
- login
- get playlists
- create playlist
- edit playlist
- delete playlist
- like / dislike playlist
-
Autenticação e autorização
- identificação UUID
- senhas hasheadas com Bcrypt
- tokens JWT
-
Código
- POO
- Arquitetura em camadas
- Roteadores no Express
Endpoint público utilizado para cadastro. Devolve um token jwt.
// request POST /users/signup
// body JSON
{
"name": "Beltrana",
"email": "beltrana@email.com",
"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": "beltrana@email.com",
"password": "beltrana00"
}
// response
// status 200 OK
{
token: "um token jwt"
}
Endpoint protegido, requer um token jwt para acessá-lo.
// request GET /playlists
// headers.authorization = "token jwt"
// response
// status 200 OK
[
{
"id": "uma uuid v4",
"name": "Samba churrasco",
"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",
"name": "Rock and Roll",
"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 POST /playlists
// headers.authorization = "token jwt"
// body JSON
{
"name": "Coding Focus"
}
// response
// status 201 CREATED
Endpoint protegido, requer um token jwt para acessá-lo.
Só quem criou a playlist pode editá-lo e somente o nome pode ser editado.
// request PUT /playlists/:id
// headers.authorization = "token jwt"
// body JSON
{
"name": "Rock & Roll"
}
// response
// status 200 OK
Endpoint protegido, requer um token jwt para acessá-lo.
Só quem criou a playlist pode deletá-lo. Admins podem deletar a playlist de qualquer pessoa.
// request DELETE /playlists/:id
// headers.authorization = "token jwt"
// response
// status 200 OK
Endpoint protegido, requer um token jwt para acessá-lo.
Quem criou a playlist não pode dar like ou dislike na mesma.
Caso dê um like em uma playlist que já tenha dado like, o like é desfeito.
Caso dê um dislike em uma playlist que já tenha dado dislike, o dislike é desfeito.
Caso dê um like em uma playlist que tenha dado dislike, o like sobrescreve o dislike.
Caso dê um dislike em uma playlist que tenha dado like, o dislike sobrescreve o like.
// request PUT /playlists/:id/like
// headers.authorization = "token jwt"
// body JSON
{
"like": true
}
// response
// status 200 OK
// request PUT /playlists/: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 na playlist
- na requisição like é true
-
quando like valor 0 na tabela é porque a pessoa deu dislike na playlist
- 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 uma playlist que já tenha dado like, o like é removido (deleta o item da tabela)
-
caso dê dislike em uma playlist que já tenha dado dislike, o dislike é removido (deleta o item da tabela)