1
resposta

Não entendi como a lista de campos se ligou com os campos do JSON

Olá, próximo dos 8:15 do vídeo, eu não entendi como que a lista de campos se ligou com os campos do JSON. Também não entendi como pode ter sido alimentado no forEach e como foi possível verificar se os campos do JSON tinham valores para poder atualizar.

async atualizar () {
        await FornecedorController.findById(this.id);
        const campos = ['nomeEmpresa', 'email', 'categoria'];
        const dadosParaAtualizar = {};

        campos.forEach((campo) => {
            const valor = this[campo]

            if (typeof valor === 'string' && valor.length > 0) {
                dadosParaAtualizar[campo] = valor
            }
        });

        // Object keys retorna uma lista com o nome das chaves que o objeto possui
        if (Object.keys(dadosParaAtualizar).length === 0) {
            throw new Error('Não foram fornecidos dados para atualizar!');
        }

        await FornecedorController.atualizar(this.id, dadosParaAtualizar);
    }
1 resposta

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software