Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
PORT=3003

DB_FILE_PATH=./src/database/example.db

JWT_KEY=minha-senha-segura-projeto
JWT_EXPIRES_IN=7d

BCRYPT_COST=12
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.env
node_modules
build
.DS_Store
*.db
221 changes: 32 additions & 189 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# Projeto Labook
O Labook é uma rede social com o objetivo de promover a conexão e interação entre pessoas. Quem se cadastrar no aplicativo poderá criar e curtir publicações.
# 📜 Projeto Labook

Agora que temos as bases de criação de APIs e banco de dados, o próximo nível é a implementação de segurança e códigos mais escaláveis. Veremos durante o prazo de entrega desse projeto inúmeros conceitos e formas de desenvolvimento seguindo padrões de design e arquitetura, e seu desafio será unir as funcionalidades com as boas práticas de código.
Labook é uma rede social com o objetivo de promover a conexão e interação entre pessoas. Quem se cadastrar no aplicativo poderá criar, curtir e descurtir publicações.


## 🔨 Conteúdos e Ferramentas Utilizadas

# Conteúdos abordados
- NodeJS
- Typescript
- Express
Expand All @@ -17,210 +18,52 @@ Agora que temos as bases de criação de APIs e banco de dados, o próximo níve
- Roteamento
- Postman

# Banco de dados
![projeto-labook (2)](https://user-images.githubusercontent.com/29845719/216036534-2b3dfb48-7782-411a-bffd-36245b78594e.png)

https://dbdiagram.io/d/63d16443296d97641d7c1ae1
## 💾 Banco de Dados

# Lista de requisitos
- Documentação Postman de todos os endpoints (obrigatória para correção)
Diagrama do banco de dados demonstrando suas tabelas e a relação entre elas:

- Endpoints
- [ ] signup
- [ ] login
- [ ] create post
- [ ] get posts
- [ ] edit post
- [ ] delete post
- [ ] like / dislike post
![projeto-labook (2)](https://user-images.githubusercontent.com/29845719/216036534-2b3dfb48-7782-411a-bffd-36245b78594e.png)

- 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

# Token payload e User roles
O enum de roles e o payload do token JWT devem estar no seguinte formato:
```typescript
export enum USER_ROLES {
NORMAL = "NORMAL",
ADMIN = "ADMIN"
}

export interface TokenPayload {
id: string,
name: string,
role: USER_ROLES
}
```
https://dbdiagram.io/d/63d16443296d97641d7c1ae1

# Exemplos de requisição

## Signup
Endpoint público utilizado para cadastro. Devolve um token jwt.
```typescript
// request POST /users/signup
// body JSON
{
"name": "Beltrana",
"email": "beltrana@email.com",
"password": "beltrana00"
}

// response
// status 201 CREATED
{
token: "um token jwt"
}
```
## 🖥️ Rodando o Projeto

## Login
Endpoint público utilizado para login. Devolve um token jwt.
```typescript
// request POST /users/login
// body JSON
{
"email": "beltrana@email.com",
"password": "beltrana00"
}

// response
// status 200 OK
{
token: "um token jwt"
}
```
Para rodar o projeto em sua máquina, siga as intruções seguintes:

1. Clone o repositório:

## Create post
Endpoint protegido, requer um token jwt para acessá-lo.
```typescript
// request POST /posts
// headers.authorization = "token jwt"
// body JSON
{
"content": "Partiu happy hour!"
}
```bash
git clone https://github.com/LinconCS/projeto-labook-backend.git

// response
// status 201 CREATED
```

2. Instale as dependências do projeto:

## Get posts
Endpoint protegido, requer um token jwt para acessá-lo.
```typescript
// 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"
}
}
]
```bash
cd projeto-labook-backend
npm install
```

3. Inicie o servidor:

## Edit post
Endpoint protegido, requer um token jwt para acessá-lo.<br>
Só quem criou o post pode editá-lo e somente o conteúdo pode ser editado.
```typescript
// request PUT /posts/:id
// headers.authorization = "token jwt"
// body JSON
{
"content": "Partiu happy hour lá no point de sempre!"
}

// response
// status 200 OK
```bash
npm run dev
```

## Delete post
Endpoint protegido, requer um token jwt para acessá-lo.<br>
Só quem criou o post pode deletá-lo. Admins podem deletar o post de qualquer pessoa.
- garanta que ele continue funcionando depois de implementar o LIKE e DISLIKE!
O servidor será iniciado na porta especificada na variável de ambiente `PORT` (padrão: 3003).

```typescript
// request DELETE /posts/:id
// headers.authorization = "token jwt"

// response
// status 200 OK
```
## 📌 Endpoints da API

## Like or dislike post (mesmo endpoint faz as duas coisas)

Endpoint protegido, requer um token jwt para acessá-lo.<br>
Quem criou o post não pode dar like ou dislike no mesmo.<br><br>
Caso dê um like em um post que já tenha dado like, o like é desfeito.<br>
Caso dê um dislike em um post que já tenha dado dislike, o dislike é desfeito.<br><br>
Caso dê um like em um post que tenha dado dislike, o like sobrescreve o dislike.<br>
Caso dê um dislike em um post que tenha dado like, o dislike sobrescreve o like.
### Like (funcionalidade 1)
```typescript
// request PUT /posts/:id/like
// headers.authorization = "token jwt"
// body JSON
{
"like": true
}

// response
// status 200 OK
```
- **POST /users/signup**: Realiza o cadastro de um novo usuário fornecendo um token JWT;
- **POST /users/login**: Faz o login do usuário fornecendo um token JWT;

- **POST /posts**: Cria um novo post;
- **GET /posts**: Retorna uma lista com todos os posts;
- **PUT /posts/:id**: Atualiza posts com base no Id;
- **DELETE /posts/:id**: Exclui posts com base no Id;
- **PUT /posts/:id/like**: Retonar likes e dislikes em um post com base no Id.

### Dislike (funcionalidade 2)
```typescript
// request PUT /posts/:id/like
// headers.authorization = "token jwt"
// body JSON
{
"like": false
}

// response
// status 200 OK
```

### Para entender a tabela likes_dislikes
- 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)
- Segue link de publicação da API no Postman com maiores informações sobre os endpoints com exemplos de requisições e respostas: https://documenter.getpostman.com/view/28316412/2s9YeK3pwF
Loading