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/labook.db

JWT_KEY=senha-de-exemplo-jwt-key
JWT_EXPIRES_IN=100d

BCRYPT_COST=12
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Arquivos de Variáveis de Ambiente do dotenv
.env

# Diretório de Dependências do Node.js
node_modules

# Diretório de Build
build

# Arquivos .DS_Store (Arquivos criados automaticamente no Mac)
.DS_Store

# Arquivos com Extensão .db
*.db
342 changes: 116 additions & 226 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,226 +1,116 @@
# 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.

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.

# Conteúdos abordados
- 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

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

https://dbdiagram.io/d/63d16443296d97641d7c1ae1

# Lista de requisitos
- Documentação Postman de todos os endpoints (obrigatória para correção)

- Endpoints
- [ ] signup
- [ ] login
- [ ] create post
- [ ] get posts
- [ ] edit post
- [ ] delete post
- [ ] like / dislike post

- 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
}
```

# 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"
}
```

## 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"
}
```


## 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!"
}

// response
// status 201 CREATED
```


## 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"
}
}
]
```


## 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
```

## 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!

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

// response
// status 200 OK
```

## 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
```

### 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)
# labook-back-end
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.


# Url da documentação no PostMan:
https://documenter.getpostman.com/view/27736274/2s9Xy6qACb


# Endpoints
# 1. Cadastro de Usuário
Endpoint para o cadastro de novos usuários na plataforma.

Método: POST
URL: /users/signup
Exemplo de Requisição:
bash
Copy code
curl --location 'http://localhost:3003/users/signup' \
--data-raw '{
"name": "Novo Usuario",
"email": "novo@email.com",
"password": "novo123"
}'


# 2. Login de Usuário
Endpoint para realizar o login na plataforma.

Método: POST
URL: /users/login
Exemplo de Requisição:
bash
Copy code
curl --location 'http://localhost:3003/users/login' \
--data-raw '{
"email": "novo@email.com",
"password": "novo123"
}'


# 3. Criação de Post
Endpoint para criar um novo post.

Método: POST
URL: /posts
Headers:
Authorization: Token de autenticação obtido no login
Exemplo de Requisição:
bash
Copy code
curl --location 'http://localhost:3003/posts' \
--header 'Authorization: <seu_token_aqui>' \
--data '{
"content": "Novo post na sua pagina."
}'


# 4. Listagem de Posts
Endpoint para listar todos os posts com o nome do criador.

Método: GET
URL: /posts
Exemplo de Requisição:
bash
Copy code
curl --location 'http://localhost:3003/posts'


# 5. Edição de Post
Endpoint para editar um post existente.

Método: PUT
URL: /posts/:id
Headers:
Authorization: Token de autenticação obtido no login
Exemplo de Requisição:
bash
Copy code
curl --location 'http://localhost:3003/posts/<id_do_post_aqui>' \
--header 'Authorization: <seu_token_aqui>' \
--data '{
"content": "Post editado."
}'


# 6. Remoção de Post
Endpoint para deletar um post.

Método: DELETE
URL: /posts/:id
Headers:
Authorization: Token de autenticação obtido no login
Exemplo de Requisição:
bash
Copy code
curl --location -X DELETE 'http://localhost:3003/posts/<id_do_post_aqui>' \
--header 'Authorization: <seu_token_aqui>'


# 7. Curtir/Descurtir Post
Endpoint para curtir ou descurtir um post.

Método: PUT
URL: /posts/:id/like
Headers:
Authorization: Token de autenticação obtido no login
Exemplo de Requisição para Curtir:
bash
Copy code
curl --location -X PUT 'http://localhost:3003/posts/<id_do_post_aqui>/like' \
--header 'Authorization: <seu_token_aqui>'

# Considerações Finais
Esta documentação detalhou as principais funcionalidades e endpoints do projeto Labook, uma aplicação de rede social. Certifique-se de seguir o formato de solicitação adequado para cada endpoint e incluir o token de autenticação nos headers sempre que necessário. Em caso de dúvidas ou problemas, entre em contato com a equipe de suporte. Divirta-se usando o Labook!


Loading