Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jacks1o/blis---teste-t-cnico


https://github.com/jacks1o/blis---teste-t-cnico

argon2 axios docker docker-compose dotenv express jest joi jsonwebtoken multer mysql nodejs prisma typescript

Last synced: about 21 hours ago
JSON representation

Awesome Lists containing this project

README

        

# Blis---Teste-técnico

## Instruções


Como executar o projeto

1. Clone o repositório
`
[email protected]:JackS1o/Blis---Teste-t-cnico.git
`
2. Instale as dependências
`
npm install
`
3. Crie um arquivo .env e adicione nele as variáveis de ambiente conforme o arquivo .env.exemple

4. Na raíz do projeto, execute o comando `docker-compose up --build` para subir o container da aplicação e do banco de dados. O servidor estará disponível na porta `3000`.

5. Acesse o projeto em http://localhost:3000

6. Entre no container docker com o comando `docker exec -it meu-backend bash`, execute o comando `npm run prisma:migrate` para migrar as tabelas do banco de dados.

7. Execute o comando `npm test` para executar os testes unitários.

8. Para parar o container, execute o comando `docker-compose down`.


Rotas desenvolvidas



- `POST /users` - Cria um novo usuário. O corpo da requisição deve conter o `name`, `birthdate`, `email` e `password` desejados. Exemplo de corpo de requisição:
```json
{
"name": "Jack",
"birthdate": "2000-12-15",
"email": "[email protected]",
"password": "123456789"
}
```
a resposta será um objeto com o seguinte formato:
```json
{
"message": "User created successfully"
}
```

- `POST /users/login` - Realiza o login de um usuário. O corpo da requisição deve conter o `email` e `password` que existam no banco de dados. O retorno dessa requisição tabém gera um `token`. Exemplo de corpo de requisição:
```json
{
"email": "[email protected]",
"password": "123456",
}
```
a resposta será um objeto com o seguinte formato:
```json
{
"message": "Login successful",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImI2NTQxMTU0LWJkNmQtNDgzNC04N2RlLTc0ZTQyMjczMmZiMCIsImVtYWlsIjoiamFja0BnbWFpbC5jb20iLCJpYXQiOjE3MzQzNTIxMDEsImV4cCI6MTczNDM1NTcwMX0.6dpuKRclgogXkKt6pGyVDG_zWv-pI6hnEKfLw_fssOg",
"user": {
"id": "b6541154-bd6d-4834-87de-74e422732fb0",
"email": "[email protected]",
"name": "Jack"
}
}
```

- `POST /users/documents` - Permite fazer o upload de um documento do usuário. O corpo da requisição deve conter o `name` do documento desejado. Exemplo de corpo de requisição:

![alt text](./README/image.png)

a resposta será um objeto com o seguinte formato:

```json
{
"message": "Document created successfully",
"document": {
"id": "4c81e50d-5fdc-41b9-a3f7-0e2dd5be7a5d",
"name": "teste",
"url": "/uploads/1734352778796-648562658-test_document.pdf",
"user_id": "b6541154-bd6d-4834-87de-74e422732fb0",
"createdAt": "2024-12-16T12:39:38.800Z",
"updatedAt": "2024-12-16T12:39:38.800Z"
}
}
```

- `GET /uploads/document.pdf` - Rota estática que permite visualizar o documento do usuário. Exemplo de requisição:

```json
/uploads/1734287051299-845511958-test_document.pdf
```

- `POST /abilities` - Permite criar uma habilidade. O corpo da requisição deve conter o `name` da habilidade desejada. Exemplo de corpo de requisição:

```json
{
"name": "pedreiro"
}
```

a resposta será um objeto com o seguinte formato:

```json
{
"id": "5a93ad0b-781b-4c09-83ec-e46a70e3a31a",
"name": "pedreiro",
"active": true,
"createdAt": "2024-12-16T12:42:47.453Z",
"updatedAt": "2024-12-16T12:42:47.453Z"
}
```

- `PUT /abilities/:id` - Permite atualizar uma habilidade. O corpo da requisição deve conter o `active` da habilidade desejada. Exemplo de corpo de requisição:

```json
{
"active": true
}
```
a resposta será um objeto com o seguinte formato:

```json
{
"id": "5a93ad0b-781b-4c09-83ec-e46a70e3a31a",
"name": "pedreiro",
"active": true,
"createdAt": "2024-12-16T12:42:47.453Z",
"updatedAt": "2024-12-16T12:44:48.029Z"
}
```

- `POST /users/abilities` - Permite associar uma habilidade a um usuário. O corpo da requisição deve conter o `ability_id` e `years_experience` desejados. Exemplo de corpo de requisição:

```json
{
"ability": "pedreiro",
"years_experience": 4
}
```

a resposta é um objeto com o seguinte formato:

```json
{
"message": "Ability added successfully"
}
```

- `DELETE /users/abilities` - Permite remover uma ou mais habilidades de um usuário. O corpo da requisição deve conter o `ability` desejado. Exemplo de corpo de requisição:

```json
{
"abilities": [
"pedreiro",
"padeiro"
]
}
```
a resposta é um objeto com o seguinte formato:

```json
{
"message": "Ability deleted successfully"
}
```

- `GET /users/abilities` - Permite obter as habilidades de um usuário de forma paginada e ordenada por ordem de criação decrescente. A url da requisição deve conter o `page` e `limit` desejados. Exemplo de url de requisição:

```json
"/users/abilities?page=1&limit=10"
```

a resposta é um objeto com o seguinte formato:

```json
{
"count": 1,
"rows": [
{
"user_id": "b6541154-bd6d-4834-87de-74e422732fb0",
"name": "Jack",
"email": "[email protected]",
"birthdate": "2000-12-15T00:00:00.000Z",
"ability": "pedreiro",
"years_experience": 4,
"profilePicture": "https://images.dog.ceo/breeds/terrier-scottish/n02097298_9085.jpg"
}
]
}
```


Atividade Extra

Atividade extra desenvolvida foi usar a API `https://dog.ceo/api/breeds/image/random` para obter uma imagem de cachorro aleatória e adiciona-la ao perfil do usuário ao criar um novo usuário.
Essa imagem de cachorro foi adicionada ao banco de dados na tablea `dog_profile_pictures`.

No retorno da rota - `GET /users/abilities` - foi adicionado o campo `profilePicture` com o link da imagem do cachorro.

```json
{
"count": 1,
"rows": [
{
"user_id": "b6541154-bd6d-4834-87de-74e422732fb0",
"name": "Jack",
"email": "[email protected]",
"birthdate": "2000-12-15T00:00:00.000Z",
"ability": "pedreiro",
"years_experience": 4,
"profilePicture": "https://images.dog.ceo/breeds/terrier-scottish/n02097298_9085.jpg"
}
]
}
```


Tecnologias Usadas no Projeto

- TypeScript
- Node.js
- Express
- Prisma
- MySQL
- Docker
- Docker-Compose
- Joi
- Argon2
- axios
- dotenv
- Multer
- jsonwebtoken
- jest


Scripts do Projeto

- `docker-compose up --build` - Subir o container da aplicação e do banco de dados.
- `npm run dev` - Subir o servidor local.
- `npm run prisma:migrate` - Migrar as tabelas do banco de dados.
- `npm run format` - Formatar o código.
- `npm run build` - Compilar o código typescript para o javascript.
- `npm test` - Executar os testes unitários.