Model - Uma breve introdução
Tags: javascript, beginners, architecture, braziliandevs
Published: 2022-03-24 21:41:28

## Aviso
Arquitetura de Software é um tema bem teórico e de certa forma abstrato _~~(ao menos para mim)~~_, então os tópicos abordados nesse artigo são a minha interpretação pessoal do conceito geral, sendo que essa interpretação é baseada na forma que utilizo esses conceitos em meus projetos.

___

## Model

### O que é?
É a camada do Software responsável pelo acesso, armazenamento e manipulação de qualquer informação, em qualquer tipo de entidade de armazenamento.

Essa entidade pode ser um arquivo de texto, memória, ou um banco de dados.

### O que faz?
Como vimos em sua definição, a camada Model __abstrai completamente os detalhes de acesso, manipulação e armazenamento__, fornecendo recursos de fácil utilização para as outras camadas do Software.

Além disso, essa camada também é responsável pelo mapeamento dos dados na entidade que estamos usando para armazenamento.

### _"Sintaxe"_
Por ser um conceito de arquitetura de Software, a camada Model não segue uma sintaxe padrão, porém há algumas regras que podemos respeitar, são elas:

1. Todos os recursos contidos na camada Model devem ser desacoplados do resto da aplicação.

2. Devemos definir e manipular nossos dados nesta camada, __exportando apenas uma abstração__ para o resto da aplicação

___

## Model com MySQL

### O que é?
Trata-se da conexão entre a camada Model e o banco de dados MySQL. Faremos essa conexão utilizando o pacote `mysql2`, para instalá-lo utilizamos o comando:

``` bash
npm i mysql2
```

### Como fazer?
Com o pacote instalado só precisamos definir a conexão utilizando o método `.createPool()`, disponibilizado pelo próprio pacote. Esse método deverá receber um objeto contendo todas as informações da conexão como: host, usuário, senha e o banco de dados que iremos trabalhar.

``` js
const mysql = require('mysql2/promise');

const connection = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'myPassword123',
  database: 'my_database',
});

module.exports = connection;
```

_* OBSERVAÇÃO: Podemos criar uma conexão através do método `.connect()`, porém essa conexão deverá ser gerenciada manualmente por nós._

___

## Queries no Model

### Query _constante_

#### O que é?
São Queries que não recebem parâmetros externos, ou seja, a Query sempre a mesma.

#### Sintaxe
Para executarmos esse tipo de Query utilizamos o método `.execute()` no objeto de conexão criado com o DB, recebendo por parâmetro a Query que queremos executar em formato de string.

Uma peculiaridade do método `.execute()`, é o fato dele retornar os resultados em um Array, onde os dados retornados da nossa Query ficam na primeira posição e na segunda ficam armazenados MetaDados da execução da Query.

``` js
const connection = require('./connection');

const [result] = await connection.execute('SELECT * FROM myDB');
```

### Query dinâmica

#### O que é?
São Queries que recebem algum tipo de parâmetro no momento de sua execução, as deixando dinâmicas, esse parâmetro pode ser um filtro para pesquisa, colunas a serem selecionadas ou qualquer outra _"personalização"_ que desejarmos fazer.

#### Sintaxe
Para interpolarmos os diferentes parâmetros à nossa Query utilizamos uma sintaxe especial do mysql2, com o método `.execute()`, ela consiste na utilização de marcações, feitas através de pontos de interrogação, e definição dos parâmetros ordenadamente dentro de um Array.

Em outras palavras, colocamos pontos de interrogação onde iremos passar os parâmetros e dentro do Array passamos essas informações, __sempre respeitando a ordem__.

``` js
const connection = require('./connection');

const [result] = await connection.execute(
  'SELECT * FROM myDB WHERE id = ?',
  [2]
);
```

_* OBSERVAÇÃO: Podemos utilizar outras formas de interpolação, como template literals ou concatenação, porém isso deixará nossa aplicação extremamente vulnerável a ataques de SQL Injection._