Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio concluído (Lucas Pereira Miranda) #3

Open
wants to merge 86 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
8e92420
Colocar arquivos /img no .github p separar da api
LucasPereiraMiranda Jan 15, 2021
f611bb7
Adicionar instruções de execução no README.md
LucasPereiraMiranda Jan 15, 2021
3470b90
Adicionar estrutura nestjs limpa
LucasPereiraMiranda Jan 15, 2021
b217e99
Remover controller e service de app
LucasPereiraMiranda Jan 15, 2021
f8dcca2
Criar as typeorm migrations
LucasPereiraMiranda Jan 19, 2021
26376a7
Adicionar .editorconfig
LucasPereiraMiranda Jan 19, 2021
2d8e76f
Criar .env.example para o ambiente de dev
LucasPereiraMiranda Jan 19, 2021
849ef4b
Adicinionar .env e arquivos upload ao .gitignore
LucasPereiraMiranda Jan 19, 2021
51639ae
Docker-compose p o banco de dados em ambiente dev
LucasPereiraMiranda Jan 19, 2021
199f0fb
Adicionar DER desenvolvida para o projeto
LucasPereiraMiranda Jan 19, 2021
e4c0572
Remover e2e testes
LucasPereiraMiranda Jan 19, 2021
92a5d91
Adicionar gitkeep p/ falar que existe arquivos
LucasPereiraMiranda Jan 19, 2021
3a7f887
Adicionar novas dependências e configs no package
LucasPereiraMiranda Jan 19, 2021
ad951e8
Novas alterações no yarn.lock
LucasPereiraMiranda Jan 19, 2021
940b6d5
Adicionar novos recursos e configs ao app.module
LucasPereiraMiranda Jan 19, 2021
db4426d
Adicionar novas configurações ao main
LucasPereiraMiranda Jan 19, 2021
7979390
Adicionar arquivos de configuração
LucasPereiraMiranda Jan 19, 2021
fd962b2
Adicionar controller de countries
LucasPereiraMiranda Jan 19, 2021
cc75418
Adicionar module de countries
LucasPereiraMiranda Jan 19, 2021
aff3b2c
Adicionar service de countries
LucasPereiraMiranda Jan 19, 2021
53e4814
Criar entity de countries
LucasPereiraMiranda Jan 19, 2021
4d01105
Criar dto para a criação de novos countries
LucasPereiraMiranda Jan 19, 2021
cfd241d
Mudar caminho dos testes (os testes padrões do fw)
LucasPereiraMiranda Jan 19, 2021
b730e73
Criar entity para files
LucasPereiraMiranda Jan 19, 2021
3dfe765
Adicionar controller para files
LucasPereiraMiranda Jan 19, 2021
d934e98
Criar module para files
LucasPereiraMiranda Jan 19, 2021
0c35aaf
Adicionar dto de files
LucasPereiraMiranda Jan 19, 2021
d44ac91
Criar service para files (contendo as bandeiras)
LucasPereiraMiranda Jan 19, 2021
00b52a6
Merge pull request #1 from LucasPereiraMiranda/configs_iniciais_e_rec…
LucasPereiraMiranda Jan 19, 2021
11d0dc8
Adicionar volume ao service mysql docker-compose
LucasPereiraMiranda Jan 20, 2021
6a5d0a9
Adicionar módulo de locals ao módulo app
LucasPereiraMiranda Jan 20, 2021
3d48dec
Adicionar relação com Local em Country
LucasPereiraMiranda Jan 20, 2021
f466a42
Criar módulo para Locals
LucasPereiraMiranda Jan 20, 2021
f5523af
Criar estrutura para os resources de Locals
LucasPereiraMiranda Jan 20, 2021
f61180a
Adicionar testes padões em /tests
LucasPereiraMiranda Jan 20, 2021
47cc179
Criar entidate de Local
LucasPereiraMiranda Jan 20, 2021
7feb24a
Mover locals para o domínio de country (país)
LucasPereiraMiranda Jan 20, 2021
84b30a0
Remover LocalsModule de app.module
LucasPereiraMiranda Jan 20, 2021
bb49598
Remover trigger onDelete Cascade
LucasPereiraMiranda Jan 23, 2021
3decef9
Criar dto de atualização de locais
LucasPereiraMiranda Jan 23, 2021
1aab564
Chamar método ao invés do repository
LucasPereiraMiranda Jan 23, 2021
2d98c5a
Exportar FilesService
LucasPereiraMiranda Jan 23, 2021
f86bd46
Criar findLocalsByCountry
LucasPereiraMiranda Jan 23, 2021
8131aee
Contornar dependência circular com forwardRef
LucasPereiraMiranda Jan 23, 2021
1e37335
Criar novas funcionalidades em countries service
LucasPereiraMiranda Jan 23, 2021
c614ff2
Criar update-local dto
LucasPereiraMiranda Jan 23, 2021
b232e9e
Criar novas funcionalidades em locals service
LucasPereiraMiranda Jan 23, 2021
887c4e4
Desenvolver novos endpoints em locals controller
LucasPereiraMiranda Jan 23, 2021
85df071
Merge pull request #2 from LucasPereiraMiranda/desenvolver_recursos_p…
LucasPereiraMiranda Jan 23, 2021
768766a
Criar estrutura para metas
LucasPereiraMiranda Jan 23, 2021
216c2cc
Adicionar modulo de metas
LucasPereiraMiranda Jan 23, 2021
1f318b9
Adicionar date-fns as dependências
LucasPereiraMiranda Jan 24, 2021
421c145
Adicionar relação com Meta
LucasPereiraMiranda Jan 24, 2021
00f7eb2
Criar meta entity
LucasPereiraMiranda Jan 24, 2021
afeaa6a
Criar endpoints no controller de meta
LucasPereiraMiranda Jan 24, 2021
b66e8b8
Adicionar módulos em meta
LucasPereiraMiranda Jan 24, 2021
8c0c629
Criar lógica no metas service
LucasPereiraMiranda Jan 24, 2021
e49ce51
Adicionar função para comparar duas datas
LucasPereiraMiranda Jan 24, 2021
7de893c
Criar dtos de meta
LucasPereiraMiranda Jan 24, 2021
55ff955
Ordenar findAll pela data da meta (crescente)
LucasPereiraMiranda Jan 24, 2021
c4e0480
Adicionar lodash as dependências
LucasPereiraMiranda Jan 24, 2021
db6c736
Mudar de Error genérico para BadRequestException
LucasPereiraMiranda Jan 24, 2021
58db53b
Adicionar multerOptions ao FileInterceptor
LucasPereiraMiranda Jan 24, 2021
98a93cf
Remover MulterModule
LucasPereiraMiranda Jan 24, 2021
c99d195
Adicionar validações e renomear parâmetros
LucasPereiraMiranda Jan 24, 2021
6eb31cb
Merge pull request #3 from LucasPereiraMiranda/desenvolver_recursos_p…
LucasPereiraMiranda Jan 24, 2021
fca508c
Refatorar. Reaproveitar service ao invés de repo
LucasPereiraMiranda Jan 24, 2021
d323093
Desenvolver testes para FileService
LucasPereiraMiranda Jan 25, 2021
8eec94d
Colocar caminhos relativos na importação
LucasPereiraMiranda Jan 25, 2021
1ab9d7b
Remover testes automatizados vindos por padrão
LucasPereiraMiranda Jan 25, 2021
985080d
Adicionar segurança contra remoção de fk pai
LucasPereiraMiranda Jan 25, 2021
be17568
Adicionar env-cmd ao script start
LucasPereiraMiranda Jan 25, 2021
61dbe0e
Adicionar instruções de execução ao README.md
LucasPereiraMiranda Jan 25, 2021
1d2846d
Merge pull request #4 from LucasPereiraMiranda/refatoracao
LucasPereiraMiranda Jan 25, 2021
11ab798
Adicionar arquivos contendo imagens exemplo
LucasPereiraMiranda Jan 25, 2021
3173f6a
Adicionar alterações no README.md
LucasPereiraMiranda Jan 25, 2021
41f7c36
Alterar width das imagens exemplo
LucasPereiraMiranda Jan 25, 2021
657dce6
Atualizar dto de atualização de metas
LucasPereiraMiranda Jan 26, 2021
fc34b31
Evitar dependência circular entre locals e metas
LucasPereiraMiranda Jan 26, 2021
ac22d92
Evitar remoção de countries com chaves em filhos
LucasPereiraMiranda Jan 26, 2021
4ce5289
Resolver bug durante a atualização de metas
LucasPereiraMiranda Jan 26, 2021
ca2a127
Evitar prob. dep. circular e consertar validacao
LucasPereiraMiranda Jan 26, 2021
d6a7ba5
Atualizar README.md
LucasPereiraMiranda Jan 26, 2021
66157d4
Remover console.log
LucasPereiraMiranda Jan 26, 2021
64fbe61
Merge pull request #5 from LucasPereiraMiranda/resolver_bug_e_atualiz…
LucasPereiraMiranda Jan 26, 2021
a525387
Merge pull request #6 from LucasPereiraMiranda/dev
LucasPereiraMiranda Jan 26, 2021
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
10 changes: 10 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# EditorConfig is awesome: https://EditorConfig.org
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false
18 changes: 18 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# API configuration
API_BASE_URL=http://localhost
API_PORT=3000
API_PREFIX=/api/v1

# Database ORM configuration
DB_CONNECTION=mysql
DB_HOST=0.0.0.0
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=lucasdevpassword
DB_NAME=challenge_db

# TypeORM internals
TYPEORM_SYNCHRONIZE=

# Multer Options
MULTER_DESTINATION=
25 changes: 25 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
sourceType: 'module',
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: [
'plugin:@typescript-eslint/recommended',
'prettier/@typescript-eslint',
'plugin:prettier/recommended',
],
root: true,
env: {
node: true,
jest: true,
},
ignorePatterns: ['.eslintrc.js'],
rules: {
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-explicit-any': 'off',
},
};
Binary file added .github/diagram-entity-relationship/der.mwb
Binary file not shown.
Binary file added .github/diagram-entity-relationship/der.mwb.bak
Binary file not shown.
Binary file added .github/diagram-entity-relationship/der.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/example/criar-arquivo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/example/criar-local.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/example/criar-meta.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/example/criar-pais.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
File renamed without changes
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# compiled output
/dist
/node_modules

# Environment
.env

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# OS
.DS_Store

# Tests
/coverage
/.nyc_output

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json


# Uploads folder
uploads/*
!uploads/.gitkeep
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
170 changes: 168 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
# Desafio de Backend

<img src="./img/logo-clubpetro.png" style="margin-left: 100px"
<img src="./.github/img/logo-clubpetro.png" style="margin-left: 100px"
alt="Clubpetro" width="300">

- [Descrição](#descrição)
- [O Desafio](#o-desafio)
- [Requisitos Obrigatórios](#requisitos-obrigatórios)
- [Bônus](#bônus)
- [Submissão e Prazo de Entrega](#submissão-e-prazo-de-entrega)
- [Instruções de execução](#instruções-de-execução)
- [Requisitos para execução](#requisitos-para-execução)
- [Instalação das dependências](#instalação-das-dependências)
- [Variáveis de ambiente](#variáveis-de-ambiente)
- [Container Docker](#container-docker)
- [Migrações](#migrações)
- [Execução da aplicação](#execução-da-aplicação)
- [Endpoints disponíveis](endpoints-disponíveis)
- [Recursos para Files](#recursos-para-files)
- [Recursos para Countries](#recursos-para-countries)
- [Recursos para Locals](#recursos-para-locals)
- [Recursos para Metas](#recursos-para-metas)
- [Jornada de criações POST do cliente da API](#jornada-de-criações-post-do-cliente-da-api)



## Descrição

Expand All @@ -17,7 +32,7 @@ Este desafio tem como objetivo avaliar as habilidades técnicas do candidato a v

O desafio consiste em desenvolver uma API rest que permita o CRUD de lugares para se conhecer ao redor do mundo para alimentar o frontend que pode ser visto na imagem a seguir:

<img src="./img/challenge.png" alt="Desafio" >
<img src="./.github/img/challenge.png" alt="Desafio" >

Os dados a ser considerados são:

Expand Down Expand Up @@ -55,3 +70,154 @@ Os dados a ser considerados são:
- Em caso do deploy realizado, a url deverá ser adicionada no README;
- O prazo de entrega para este desafio é de 2 (duas) semanas, contando a partir do dia em que o canditado recebeu o email com o link do repositório;
- Ao finalizar o desafio, o candidato deverá enviar um email para [email protected] contendo o link do seu PR.


# Instruções de execução

## Requisitos para execução

Para executar a aplicação no ambiente de desenvolvimento, precisamos ter no ambiente:

- [Docker](https://www.docker.com/)
- [Docker Compose](https://docs.docker.com/compose/install/)
- [yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable)
- [nest-cli](https://docs.nestjs.com/cli/overview)

## Instalação das dependências

Dentro do diretório raiz do projeto, podemos executar

```bash
$ yarn
```
para instalar as dependências.

## Variáveis de ambiente

Duplique o arquivo .env.example presente na raiz do projeto e renomeie uma das cópias para apenas .env

O arquivo .env contém as variáveis de ambiente com informações secretas que serão utilizadas na API.

## Container Docker

Após instalar as dependências, podemor subir o container contendo o serviço MySQL.

O serviço relativo ao banco de dados MySQL está configurado para escutar a porta 3306. Caso essa porta já esteja sendo usada em seu ambiente, deixe ela disponível para o container, por favor.

Após esses detalhes, podemos executar:

```bash
$ docker-compose up
```

Esse processo pode demorar um pouco caso as imagens Docker não estejam disponíveis em seu ambiente local.

## Migrações

Após o container contendo o MySQL estiver disponível para conexões, execute o seguinte comando para executar as migrações no banco de dados:

```bash
$ yarn typeorm migration:run
```

## Execução da aplicação

Agora podemos iniciar a aplicação (modo de desenvolvimento) executando:

```bash
# development mode
$ yarn start
```

# Endpoints disponíveis

A URL base no ambiente de desenvolvimento é http://localhost:3000/api/v1/

***Obs***: As listagens utilizam [eager loading](https://orkhan.gitbook.io/typeorm/docs/eager-and-lazy-relations) para carregar os dados das relações.

## Recursos para Files

***Obs***: Files é o arquivo relativo a bandeira de um país.

- `POST /files`: Cria um novo arquivo enviado como multipart/form a chave `file`. O arquivo deve ser uma imagem com extensão `.png`, `.jpg` ou `.jpeg`

- `GET /files/:id`: O arquivo com `id` presente no parâmetro da rota deve ter seus dados retornados.

## Recursos para Countries

- `POST /countries`:
O endpoint deve receber `name` e `fileId` no corpo da requisição e registrar um novo país.

- `GET /countries`:
Rota que lista todos os países presentes no repositório.

- `GET /countries/:id`:
O país com `id` presente no parâmetro da rota deve ter seus dados retornados.

- `DELETE /countries/:id`:
O País com `id` presente no parâmetro da rota deve ser excluído.

- `GET /countries/:id/locals`:
Retorna os locais relacionados ao `id` do País presente no parâmetro da rota.


## Recursos para Locals

- `POST /locals`:
O endpoint deve receber `name` e `countryId` no corpo da requisição e registrar um novo local.

- `GET /locals`:
Rota que lista todos os locais presentes no repositório.

- `GET /locals/:id`:
O local com `id` presente no parâmetro da rota deve ter seus dados retornados.

- `DELETE /locals/:id`:
O local com `id` presente no parâmetro da rota deve ser excluído.

- `PUT /locals/:id`:
O endpoint pode receber `name` e `countryId` no corpo da requisição e alterar o local relativo ao `id` presente no parâmetro da rota.


## Recursos para Metas

- `POST /metas`:
O endpoint deve receber `date` (ISO-8601) e `localId` no corpo da requisição para registrar uma nova meta.

- `GET /metas`:
Rota que lista todas as metas presentes no repositório.

- `GET /metas/:id`:
A meta com `id` presente no parâmetro da rota deve ter seus dados retornados.

- `DELETE /metas/:id`:
A meta com `id` presente no parâmetro da rota deve ser excluída.

- `PUT /metas/:id`:
O endpoint pode receber `date` no corpo da requisição e alterar a meta relativa ao `id` presente no parâmetro da rota.


# Jornada de criações POST do cliente da API

Nesta seção temos um exemplo com requisições POST nos principais endpoints da API usando o [Insomnia](https://insomnia.rest/).
O objetivo é criar uma meta com todos os seus dados relacionados (bandeira, local e país)

1) Receber um arquivo (bandeira). Veja mais em [Recursos para Files](#recursos-para-files))

<img src="./.github/example/criar-arquivo.png" style="margin-left: 0px"
alt="Requisição POST para receber arquivo" width="700">

2) Criar um novo país. Veja mais em [Recursos para Countries](#recursos-para-countries)

<img src="./.github/example/criar-pais.png" style="margin-left: 0px"
alt="Requisição POST para criar país" width="700">

3) Criar um local "dentro" do país. Veja mais em [Recursos para Locals](#recursos-para-locals)

<img src="./.github/example/criar-local.png" style="margin-left: 0px"
alt="Requisição POST para criar um local" width="700">

4) Criar uma meta associada a um local. Veja mais em [Recursos para Metas](#recursos-para-metas)

<img src="./.github/example/criar-meta.png" style="margin-left: 0px"
alt="Requisição POST para criar uma meta associada a um local" width="700">
23 changes: 23 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: '3.7'

services:
mysql_db:
container_name: mysql_db
image: mysql:5.7
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
ports:
- ${DB_PORT}:${DB_PORT}
restart: always
volumes:
- dbdata:/var/lib/mysql

adminer:
image: adminer
restart: always
ports:
- 8080:8080

volumes:
dbdata:
4 changes: 4 additions & 0 deletions nest-cli.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"collection": "@nestjs/schematics",
"sourceRoot": "src"
}
Loading