Teste backend pokémon pt 2
Published: 2020-11-23 21:59:49

Teste back-end pokémon pt 2

Bom no ultimo artigo, finalizamos a estrutura padrão do nosso projeto, pra quem não viu vou deixar o link, pois é essencial ter lido ele para avançar nesse artigo.

[Teste backend pokémon pt 1 - DEV](https://dev.to/renato_zero6/teste-backend-pokemon-pt-1-2nlc)

Vou partir do principio que você já leu o ultimo artigo e seu projeto está igual o meu, agora vamos iniciar nossa estrutura de rotas para podermos criar nossa primeira controler.

Na raiz do seu projeto crie um arquivo `routes.js`, nele vamos colocar o código a baixo:

```javascript
const bodyParser = require("body-parser");

module.exports = (app) => {
  // usamos o body-parser para lidar com as requisiçoes json
  app.use(bodyParser.json());


   // o primeiro parametro fa função get é a rota que iremos 
   // chamar na url o segundo já é uma função anônima, mas
   // nada impede de ser passado uma função  já criada
  app.get("/", (req, res) => {
    res.status(200).send({ message: "boas-vindas a API Pokémon GO" });
  });

};
```

Vamos voltar agora para nosso primeiro arquivo criado o `index.js` nele vamos informar o express que iremos usar nosso arquivo de rotas

```javascript
// infromamos o path do nosse arquivo de rotas
const routes = require("./routes");

//nosso arquivo ficara assim logo depois de instanciar as 
//depêndencias nele


app.use(cors());
app.use(express.json());

const port = 3333;

// disponibiliza as rotas no arquivo base
routes(app);

app.listen(port, () => {
  console.log(`Servidor rodando na porta: ${port}`);
});
```

Agora criaremos nossa primeira controller para isso crie uma pasta chamada `controller` e dentro dela um arquivo chamado `CsvController.js`.

Antes vamos instalar uma depencia para manipularmos arquivos csv ou xlsx, para isso digitamos em nosso terminal o seguinte comando:

```bash
npm i node-xlsx
```

Voltando na nossa controller vamos criar uma classe e importar a biblioteca instalada

```javascript
const xlsx = require("node-xlsx");
class ApiController{
    
}

// nessa linha exportamos nossa classe como módulo para que 
// ela possa ser acessada de outros lugares
module.exports = ApiController;
```

Dentro da nossa classe iremos criar uma função chamada `importCsv`

```javascript
static async importCsv(req, res) {
  // essa variavel indica o local que esta o arquivo csv, deixei
  // o meu de exemplo mais depois do ${__dirname} passe o seu caminho
  // vou deixar logo a baixo o repositório novamente com o xlsx
    const plan = xlsx.parse(`${__dirname}/../api/PokemonGo.xlsx`);
    
   // Agora que ja temos nosso arquivo mapeado basta percorrermos ele
   // com um map e criarmos um objeto novo pois os nomes no arquivo
   // contem espaços e caracteres especiais depios batas tertornar ele 
  // e termos acesso deles na variavel readPlan

    const readPlan = plan[0].data.map((data, index) => {
   
      let dados = {
        row: data[0],
        name: data[1],
        pokedexNumber: data[3],
        imgName: data[4],
        generation: data[5],
        evolutionStage: data[6],
        evolved: data[7],
        familyID: data[8],
        crossGen: data[9],
        type1: data[10],
        type2: data[11],
        weather1: data[12],
        weather2: data[13],
        staTotal: data[14],
        atk: data[15],
        def: data[16],
        sta: data[17],
        legendary: data[18],
        spawns: data[21],
        regional: data[22],
        raidable: data[23],
        hatchable: data[24],
        Shiny: data[25],
        nest: data[26],
        new: data[27],
        notGettable: data[28],
        futureEvolve: data[29],
        CP40: data[30],
        CP39: data[31],
      };
      return dados
    });
   // deletamos o primeir registro do objeto pois ele só 
   //contem o nome das colunas da planilha
    delete readPlan[0];
    
    // Agora finalmente retornamos os dados para api
    return res.status(200).send(readPlan);
  }
```

[Repositótio do projeto](https://github.com/renatoReboucas/teste-backend-pokemon)

Nosso código ainda não esta funcionando pois não criamos uma rota para acessar ele, para isso vamos voltar no nosso arquivo que usamos para definilas `routes.js`

```javascript
// dentro dele vamos importar nossa controller primeiro
// a minha está no caminho a baixo, mais subistitua por um a sua escolha

const CsvController = require('../Controller/CsvController')

// agora nosso arquivo de rotas ficara assim
module.exports = (app) => {
  app.use(bodyParser.json());
  app.get("/", (req, res) => {
    res.status(200).send({ message: "boas-vindas a API Pokémon GO" });
  });

  // nessa linha adicionaremos nossa nossa nova rota,
  // indicando que ela deverá usar a controller criada anteriormente
  app.get("/import", CsvController.importCsv);

};
```

Agora basta chamarmos nossa rota, bom como essa é uma rota do tipo get podemos chamar ela pelo navegador pelo endereço https://localhost:3333 , porem eu recomendo o uso do [insomnia](https://insomnia.rest/download/).

A imagem abaixo é o resultado da nossa requisição.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0mlyy46u9iv871fa8mtr.png)