Boa noite Henrique, tudo certo?
Vamos pegar esse código passo a passo e destrinchar o que vai acontecendo:
roteador.put('/:idFornecedor', async (requisicao, resposta, proximo) => {
try {
const id = requisicao.params.idFornecedor
const dadosRecebidos = requisicao.body
const dados = Object.assign({}, dadosRecebidos, { id:id })
const fornecedor = new Fornecedor(dados)
await fornecedor.atualizar()
resposta.status(204)
resposta.end()
}
catch (erro) {
proximo(erro)
}
})
Essa é a rota de put
, que atualiza os dados de um objeto do tipo Fornecedor
.
A requisição passa um id
que vai ser o identificador único dos nossos fornecedores.
Nós criamos a variável dadosRecebidos
e atribuímos os valores atualizados passados pela requisição que queremos colocar no fornecedor.
Em seguida colocamos essas informações novas junto do id
em um objeto e chamamos essa variável de dados
.
Usamos essa variável com informações relevantes de um fornecedor para criar uma nova instância de Fornecedor
e depois chamamos o método fornecedor.atualiza()
Olhando por essa chamada, o que sabemos? Sabemos que essa instância de fornecedor contém todas as informações que queremos atualizar do fornecedor no banco de dados. Vamos entrar no método atualiza()
para ver o que está rolando:
async atualizar () {
await FornecedorController.findById(this.id);
A primeira coisa que é feita nesse método é achar a instância do Sequelize, ou seja, a representação no banco de dados desse fornecedor com o id
que providenciamos.
const campos = ['empresa', 'email', 'categoria']
Aqui nós estamos definindo quais campos que podem ser atualizados.
const dadosParaAtualizar = {}
Estamos criando uma variável para guardar um objeto com os campos populados com os valores que podem ser atualizados.
Agora nós vamos chamar uma função para cada valor no Array campos
, ou seja, vamos chamar uma função com a variável campo
valendo 'empresa'
, 'email'
e 'categoria'
, nessa ordem:
campos.forEach( (campo) => {
const valor = this[campo]
if (typeof valor === 'string' && valor.length > 0){
dadosParaAtualizar[campo] = valor
}
})
Na segunda linha desse bloco a variável valor está recebendo o valor do campo no this
, que era aquele Fornecedor
instanciado dentro da rota put
. Ou seja: é o valor atualizado que deve ir para o banco de dados.
Esse valor passa por um teste para ver se é do tipo certo (string
) e se não está vazio.
E na linha dadosParaAtualizar[campo] = valor
nós passamos esse valor validado para dentro desse novo objeto que estava vazio. Repetimos esse processo para os 3 campos que podem ser validados nesse caso.
if(Object.keys(dadosParaAtualizar).length === 0){
throw new DadosNaoFornecidos()
}
await TabelaFornecedor.atualizar(this.id, dadosParaAtualizar)
Agora fazemos uma última validação para checar se foi fornecido algum dado para essa chamada e nós mandamos esse objeto novo junto da identificação do fornecedor para a instância do Sequelize que foi invocada no começo da função atualiza()
.
Espero que isso tenha esclarecido de onde veio o this
e como esses valores foram passados, mas qualquer dúvida é só perguntar aqui que estarei no aguardo.
Bons estudos!