forked from ClubPetro/backend-challenge
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a924e11
commit 68fd9ae
Showing
82 changed files
with
10,906 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
node_modules | ||
.git | ||
.vscode |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
node_modules |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
FROM node | ||
|
||
WORKDIR /usr/app | ||
|
||
COPY package.json ./ | ||
|
||
RUN npm install | ||
|
||
COPY . . | ||
|
||
EXPOSE 3333 | ||
|
||
CMD ["npm","run", "dev"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,58 +1,45 @@ | ||
# Desafio de Backend | ||
|
||
<img src="./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) | ||
# Backend-challenge | ||
|
||
## Descrição | ||
|
||
Este desafio tem como objetivo avaliar as habilidades técnicas do candidato a vaga de desenvolvedor backend no Clubpetro. | ||
O objetivo deste projeto é criar uma API para gerenciar lugares e suas metas, onde é possível criar, listar, atualizar e excluir lugares, bem como atualizar suas metas. | ||
|
||
#### O Desafio | ||
## Tecnologias Utilizadas | ||
|
||
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: | ||
- Node.js | ||
- Express.js | ||
- TypeScript | ||
- TypeORM | ||
- Jest | ||
- Docker Compose | ||
|
||
<img src="./img/challenge.png" alt="Desafio" > | ||
## Como Rodar o Projeto | ||
|
||
Os dados a ser considerados são: | ||
### Pré-requisitos | ||
|
||
- País: O país escolhido; | ||
- Local: O local dentro do país escolhido; | ||
- Meta: O mês e o ano que o usuário pretende visitar o local; | ||
- Url da bandeira do país; | ||
- Data de criação do registro; | ||
- Data de atualização do registro. | ||
- Node.js (versão 14 ou superior) | ||
- Docker (versão 20 ou superior) | ||
- Docker Compose (versão 1.28 ou superior) | ||
|
||
#### Requisitos Obrigatórios | ||
### Passo a Passo | ||
|
||
> Requisitos que serão avaliados no desafio. | ||
1. Clone o repositório em sua máquina | ||
2. Instale as dependências do projeto com o comando `yar install` | ||
3. Inicie o banco de dados e o servidor com o Docker Compose, executando o comando `docker-compose up -d` | ||
4. Execute o projeto com o comando `yarn dev` | ||
|
||
- A API deverá ser desenvolvida com Node.js e Express; | ||
- Apenas o Local e a Meta poderão ser editados; | ||
- O mesmo local em determinado país não poderá ser adicionado de forma duplicada; | ||
- A listagem dos dados deverá ser ordenada de forma crescente pela meta; | ||
- O candidato deverá adicionar ao projeto uma explicação de como executar a aplicação. | ||
Após seguir esses passos, o seu projeto deverá estar rodando em `http://localhost:3333`. | ||
|
||
#### Bônus | ||
## Rotas | ||
|
||
> Requisitos que não são obrigatórios mas podem te deixar em vantagem com relação aos outros candidatos. | ||
Abaixo estão as rotas disponíveis na API: | ||
|
||
- Utilização do framework [NestJS](https://nestjs.com/); | ||
- Typescript; | ||
- Testes automatizados; | ||
- [TypeORM](https://typeorm.io/#/); | ||
- [Docker](https://www.docker.com/); | ||
- Deploy para [Google Cloud Platform](https://cloud.google.com/) (ao criar conta é possível receber um bonus para teste). | ||
- `POST /country` - Cria um país | ||
- `POST /place` - Cria um lugar | ||
- `GET /` - Lista todos os lugares | ||
- `PATCH /place/update/:id` - Atualiza um lugar ou sua meta | ||
- `DELETE /place/delete/:id` - Exclui um lugar | ||
|
||
### Submissão e Prazo de entrega | ||
## Como Rodar os Testes | ||
|
||
- O canditado deverá realizar um fork deste repositório e submeter o código no mesmo; | ||
- 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 candidato recebeu o email com o link do repositório; | ||
- Ao finalizar o desafio, o candidato deverá submeter o desafio no questionário disponível na sua área de candidato na plataforma(https://menvievagas.com.br/vagas/fam%C3%8Dliapires/) do Processo Seletivo. É só clicar em RESPONDER no questionário e inserir o link do seu PR. | ||
Em caso de dúvidas, enviar um e-mail para [email protected] | ||
Para executar os testes, execute o comando `yarn test`. Os testes serão executados utilizando o Jest e serão exibidos no console. |
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,224 @@ | ||
body, html { | ||
margin:0; padding: 0; | ||
height: 100%; | ||
} | ||
body { | ||
font-family: Helvetica Neue, Helvetica, Arial; | ||
font-size: 14px; | ||
color:#333; | ||
} | ||
.small { font-size: 12px; } | ||
*, *:after, *:before { | ||
-webkit-box-sizing:border-box; | ||
-moz-box-sizing:border-box; | ||
box-sizing:border-box; | ||
} | ||
h1 { font-size: 20px; margin: 0;} | ||
h2 { font-size: 14px; } | ||
pre { | ||
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||
margin: 0; | ||
padding: 0; | ||
-moz-tab-size: 2; | ||
-o-tab-size: 2; | ||
tab-size: 2; | ||
} | ||
a { color:#0074D9; text-decoration:none; } | ||
a:hover { text-decoration:underline; } | ||
.strong { font-weight: bold; } | ||
.space-top1 { padding: 10px 0 0 0; } | ||
.pad2y { padding: 20px 0; } | ||
.pad1y { padding: 10px 0; } | ||
.pad2x { padding: 0 20px; } | ||
.pad2 { padding: 20px; } | ||
.pad1 { padding: 10px; } | ||
.space-left2 { padding-left:55px; } | ||
.space-right2 { padding-right:20px; } | ||
.center { text-align:center; } | ||
.clearfix { display:block; } | ||
.clearfix:after { | ||
content:''; | ||
display:block; | ||
height:0; | ||
clear:both; | ||
visibility:hidden; | ||
} | ||
.fl { float: left; } | ||
@media only screen and (max-width:640px) { | ||
.col3 { width:100%; max-width:100%; } | ||
.hide-mobile { display:none!important; } | ||
} | ||
|
||
.quiet { | ||
color: #7f7f7f; | ||
color: rgba(0,0,0,0.5); | ||
} | ||
.quiet a { opacity: 0.7; } | ||
|
||
.fraction { | ||
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; | ||
font-size: 10px; | ||
color: #555; | ||
background: #E8E8E8; | ||
padding: 4px 5px; | ||
border-radius: 3px; | ||
vertical-align: middle; | ||
} | ||
|
||
div.path a:link, div.path a:visited { color: #333; } | ||
table.coverage { | ||
border-collapse: collapse; | ||
margin: 10px 0 0 0; | ||
padding: 0; | ||
} | ||
|
||
table.coverage td { | ||
margin: 0; | ||
padding: 0; | ||
vertical-align: top; | ||
} | ||
table.coverage td.line-count { | ||
text-align: right; | ||
padding: 0 5px 0 20px; | ||
} | ||
table.coverage td.line-coverage { | ||
text-align: right; | ||
padding-right: 10px; | ||
min-width:20px; | ||
} | ||
|
||
table.coverage td span.cline-any { | ||
display: inline-block; | ||
padding: 0 5px; | ||
width: 100%; | ||
} | ||
.missing-if-branch { | ||
display: inline-block; | ||
margin-right: 5px; | ||
border-radius: 3px; | ||
position: relative; | ||
padding: 0 4px; | ||
background: #333; | ||
color: yellow; | ||
} | ||
|
||
.skip-if-branch { | ||
display: none; | ||
margin-right: 10px; | ||
position: relative; | ||
padding: 0 4px; | ||
background: #ccc; | ||
color: white; | ||
} | ||
.missing-if-branch .typ, .skip-if-branch .typ { | ||
color: inherit !important; | ||
} | ||
.coverage-summary { | ||
border-collapse: collapse; | ||
width: 100%; | ||
} | ||
.coverage-summary tr { border-bottom: 1px solid #bbb; } | ||
.keyline-all { border: 1px solid #ddd; } | ||
.coverage-summary td, .coverage-summary th { padding: 10px; } | ||
.coverage-summary tbody { border: 1px solid #bbb; } | ||
.coverage-summary td { border-right: 1px solid #bbb; } | ||
.coverage-summary td:last-child { border-right: none; } | ||
.coverage-summary th { | ||
text-align: left; | ||
font-weight: normal; | ||
white-space: nowrap; | ||
} | ||
.coverage-summary th.file { border-right: none !important; } | ||
.coverage-summary th.pct { } | ||
.coverage-summary th.pic, | ||
.coverage-summary th.abs, | ||
.coverage-summary td.pct, | ||
.coverage-summary td.abs { text-align: right; } | ||
.coverage-summary td.file { white-space: nowrap; } | ||
.coverage-summary td.pic { min-width: 120px !important; } | ||
.coverage-summary tfoot td { } | ||
|
||
.coverage-summary .sorter { | ||
height: 10px; | ||
width: 7px; | ||
display: inline-block; | ||
margin-left: 0.5em; | ||
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; | ||
} | ||
.coverage-summary .sorted .sorter { | ||
background-position: 0 -20px; | ||
} | ||
.coverage-summary .sorted-desc .sorter { | ||
background-position: 0 -10px; | ||
} | ||
.status-line { height: 10px; } | ||
/* yellow */ | ||
.cbranch-no { background: yellow !important; color: #111; } | ||
/* dark red */ | ||
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } | ||
.low .chart { border:1px solid #C21F39 } | ||
.highlighted, | ||
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ | ||
background: #C21F39 !important; | ||
} | ||
/* medium red */ | ||
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } | ||
/* light red */ | ||
.low, .cline-no { background:#FCE1E5 } | ||
/* light green */ | ||
.high, .cline-yes { background:rgb(230,245,208) } | ||
/* medium green */ | ||
.cstat-yes { background:rgb(161,215,106) } | ||
/* dark green */ | ||
.status-line.high, .high .cover-fill { background:rgb(77,146,33) } | ||
.high .chart { border:1px solid rgb(77,146,33) } | ||
/* dark yellow (gold) */ | ||
.status-line.medium, .medium .cover-fill { background: #f9cd0b; } | ||
.medium .chart { border:1px solid #f9cd0b; } | ||
/* light yellow */ | ||
.medium { background: #fff4c2; } | ||
|
||
.cstat-skip { background: #ddd; color: #111; } | ||
.fstat-skip { background: #ddd; color: #111 !important; } | ||
.cbranch-skip { background: #ddd !important; color: #111; } | ||
|
||
span.cline-neutral { background: #eaeaea; } | ||
|
||
.coverage-summary td.empty { | ||
opacity: .5; | ||
padding-top: 4px; | ||
padding-bottom: 4px; | ||
line-height: 1; | ||
color: #888; | ||
} | ||
|
||
.cover-fill, .cover-empty { | ||
display:inline-block; | ||
height: 12px; | ||
} | ||
.chart { | ||
line-height: 0; | ||
} | ||
.cover-empty { | ||
background: white; | ||
} | ||
.cover-full { | ||
border-right: none !important; | ||
} | ||
pre.prettyprint { | ||
border: none !important; | ||
padding: 0 !important; | ||
margin: 0 !important; | ||
} | ||
.com { color: #999 !important; } | ||
.ignore-none { color: #999; font-weight: normal; } | ||
|
||
.wrapper { | ||
min-height: 100%; | ||
height: auto !important; | ||
height: 100%; | ||
margin: 0 auto -48px; | ||
} | ||
.footer, .push { | ||
height: 48px; | ||
} |
Oops, something went wrong.