# Ambiente DEV - KOVI
Seja bem vindo a KOVI, dev! Que você curta a jornada com a gente!
Para isso, vamos preparar o ambiente de desenvolvimento, ok ?
Lembrando que nosso ambiente vive em constantes mudanças. **Por favor reporte qualquer problema que vier a encontrar**.
<br />
## :wrench: FERRAMENTAS
Sim, você VAI PRECISAR destas ferramentas. Providencie em seu MAC/PC (OSX ou Linux).
- [x] [GIT](https://www.atlassian.com/br/git/tutorials/install-git)
- [x] [GITHUB SSH Key](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- [x] [Docker](https://docs.docker.com/docker-for-mac/)
- [x] [VSCode](https://code.visualstudio.com/download)
- [x] [Insomnia](https://insomnia.rest/download/) ou [PostMan](https://www.postman.com/downloads/)
- [x] [Discord](https://discord.com/)
- [x] [Slack](https://kovihq.slack.com/)
:::info
:pushpin: WebStorm e DataGrip podem ser ofertados, converse com seu tech-lead ➜ [JetBrains](https://www.jetbrains.com/pt-br/products.html)
:::
Nosso repositório é um **MONOREPO** e para tal gerenciamento vamos fazer uso de LERNA, NVM para controle de versões do NODEJS e NPM e YARN para gerenciar pacotes.
- [ ] [YARN](https://classic.yarnpkg.com/en/docs/install/#mac-stable)
- [ ] [NPM](https://treehouse.github.io/installation-guides/mac/node-mac.html)
- [ ] [NVM](https://nodesource.com/blog/installing-node-js-tutorial-using-nvm-on-mac-os-x-and-ubuntu/)
- [ ] [LERNA](https://lerna.js.org/) (instale de forma global)
:::info
:pushpin: Certifique-se de que todos as ferramentas estejam OK antes de continuar
:::
<br />
## :computer: PREPARAÇÃO DO AMBIENTE
### 1: :key: Credenciais AWS
Nossa stack se baseia em serviços AWS (Lambda, S3, SQS, RDS...) e para tal você vai precisar de credenciais para desenvolvimento local e futuros deploys em nossos ambientes. Solicite acesso a AWS ao teu tech-lead.
:::info
:pushpin: Feito isso, acesse o console da AWS ➜ [AWS CONSOLE](https://console.aws.amazon.com/)
:::
➜ Efetue login com seus dados de acesso:

➜ Vá até seu menu de IAM e clique em **My Security Credentials**

➜ Vá até ACCESS KEYS e clique em CREATE ACCESS KEY

Siga os procedimentos, anote e salve sua key em seu home directory
```bash=
~/.aws/credentials
```
Dentro do arquivo **credentials**, contendo:
```bash=1
[default]
aws_access_key_id=SUA_KEY_AQUI
aws_secret_access_key=SEU_SECRET_ACCESS_KEY_AQUI
```
:::info
:pushpin: Utilize o VI/VIM ou qualquer outro editor modo texto que queira para tais procedimentos em Terminal
:::
OK ?
:rocket: Feito!!
<br />
### 2: :wrench: Repositórios GITHUB
Todo nosso código fica versionado no Github. Solicite acesso aos mesmos repositórios ao teu tech-lead. Para exemplificação aqui, vamos utilizar o repositório **RENTAL-API**, do squad **PLATFORM**.
Clonar Repositório:
```bash=1
git clone git@github.com:kovihq/rental-api.git
```

:::info
:pushpin: Uma boa prática é sempre ler o README.MD de cada repositório para seguir as indicações particulares de preparação
:::
Vai existir contextos de outros repositórios (frontend, mobile) de outros squads. Alinhe esse papo com seu tech-lead para saber em qual você irá trabalhar. :+1:
<br />
### 3: :lock: Containers DOCKER
Seguindo o contexto do **RENTAL-API** (backend do Platform), vamos levantar o containers:
MySQL, Dynamo, Redis, SQS...
```bash=
docker-compose up -d
```

:::info
:pushpin: A primeira vez que o conteiner for gerado, será feito o download e configuração automaticamente das imagens
:::

Com isso, os services SQS, REDIS, MYSQL, KINESIS e DYNAMO serão montados em containers.
<br />
### 4: :construction: Migrations & Seed
:construction: **(WIP)**: Work In Progress
<br />
### 5: :floppy_disk: MySQL DUMP Import

Enquanto não sai o refactor de MIGRATIONS e SEEDS do nosso monorepo, você terá que importar uma dump para seu MySQL local (em container) para poder simular o ambiente. Solicite uma dump com seu tech-lead e/ou companheiros de squad e siga os passos:
Arquivos necessários
- structure_dev.sql (dump de estrutura)
- data_dev.sql (dump de data)
Com o banco já levantado, execute a seguinte sequência de comandos:
→ acessar o bash do seu container mysql
```bash=1
docker exec -it mysql bash
```
→ acessar o mysql como root
```bash=2
mysql -u root
```
→ listar as databases já existentes, caso não houver kovi_development, criar.
```bash=3
show databases;
#create database kovi_development;
```
→ dá privilégios para execução dos scripts.
```bash=5
grant all privileges on kovi_development.* to 'costa'@'%' identified by '';
grant all privileges on *.* to 'rds-connector'@'%' identified by '';
flush privileges;
exit;
```
→ no terminal do container, saia para o seu bash de origem
```bash=8
exit
```
→ Já no terminal de sua máquina local, e vá onde você fez o download dos arquivos referenciados acima, e execute os seguintes comandos
```bash=9
docker exec -i mysql mysql -u root kovi_development < structure_dev.sql
# aguarde finalizar
docker exec -i mysql mysql -u root kovi_development < data_dev.sql
```
:::info
:pushpin: Toda vez que você zerar o container e/ou existir uma alteração grande de DB, esse processo será necessário. Caso tenha dúvidas de como proceder entre bancos de branchs e/ou projetos diferentes, procure alguem de sua squad.
:::
<br />
### 6: :pencil2: Instalação de Packages
Aqui vamos rodar os scripts para a instalação geral dos packages. Entre no diretório do repositório e rode os comandos:
→ LERNA
```bash=
yarn bootstrap
```

### 7: Levantar RENTAL-API (Serverless)
#### MÉTODO 1 - Rental FORA do container
Com os principais serviços já ***up and running*** nos containers, a maneira mais **suave** de rodar o RENTAL é a execução do script de start, segue:
```bash=1
export $(grep -v '^#' .env | xargs -0) && yarn start
```
###### **powered by Heitor & Tadeu**

<br />
### 8: :microscope: Teste do Ambiente (GraphQL)
Com todos os serviços do ambiente ***up and running***, vamos criar uma query que lista carros disponíveis. Abra teu Insomnia ou Postman e crie o seguinte post:
→ URL
```bash
http://localhost:4000/graphql
```
→ Query GraphQL
```graphql=1
query CarListAvailable {
cars(status: "AVAILABLE") {
items {
id
license_plate
brand {
id
name
}
model {
id
name
}
}
count
}
}
```
→ Query Variables
```graphql=1
{}
```
E clique em **SEND**

:::info
:pushpin: Se tudo correr bem, você terá o retorno da imagem acima. Com isso, seu ambiente está ok e pronto para desenvolvimento local.
:::
<br />
### 9: :trophy: Boas Práticas
Agora que você já levantou o ambiente, segue algumas boas práticas para ajudar ainda mais teu dia a dia de desenvolvimento.
#### DOCKER
→ Baixar/Desligar Containers
```bash=
# no diretório da branch atual, rodar
docker-compose down
```
:::info
:pushpin: Antes de trocar de branchs de trabalho, recomenda-se desligar os containers do docker e levanta-los novamente na nova branch de trabalho. Exemplo: Você estava na master testando uma feature e agora precisa trabalhar uma nova feature em uma nova branch... baixe os containers antes de criar e trabalhar com a nova branch.
:::
→ Listar Containers
```bash=
docker ps
```
→ Limpeza geral de Containers
```bash=
# remover containers
docker rm -vf $(docker ps -a -q)
# remover imagens
docker rmi -f $(docker images -a -q)
# prune geral
docker system prune -a --volumes
```
#### BRANCHS
→ Limpeza dos packages
```bash
yarn purge
```

:::info
:pushpin: Limpeza dos packages é interessante em caso de troca de branchs. Pra cada contexto de tasks/histories os packages podem sofrer alteração. Recomenda-se fazer caso encontrar problemas para levantar o ambiente entre uma branch e outra.
:::
#### GITHUB
→ [Padrões GITHUB KOVI](https://github.com/kovihq/example-commits-prs)
:::info
:pushpin: Nessa URL segue exemplos e boas práticas de padrões github seguidos pela KOVI. Leia com atenção e procure sempre seguir os padrões.
:::
#### DISCORD
Discord é o nosso canal de comunicação diário. É como se estivessemos um ao lado do outro no HQ da Kovi. Dividido por salas de squads, a equipe fica sabendo em tempo real quem está disponível, e ao um simples clique, conseguimos conversar com qualquer membro.
[Acesso Direto ao Discord](https://discord.gg/eNW96pv)

:::info
:pushpin: Faça uso dessa ferramenta essencial para nossa comunicação. Em pouco tempo de uso temos notado uma significante melhora na performance dos engenheiros da Kovi.
:::
<br />
#### 👤 Autores
Carlos Massucato, aka **Carlaum**
Tadeu Tupinambá, aka **tupizz**
Glauber Monteiro, aka **Glubs**