Minha rota
router.post(
"/upload-motorista-admin",
upload.single("file"),
[jwtMiddleware],
controller.uploadMotorista
);
Meu controller
uploadMotorista: async (req, res) => {
const arquivo = req.file;
console.log(arquivo);
if (arquivo === undefined) {
res.status(400).json({ error: "Deve selecionar um arquivo !" });
} else {
if (arquivo.mimetype !== "application/vnd.ms-excel") {
res.status(400).json({ error: "O arquivo deve ser um CSV !" });
} else {
let nomesNaoImportados = [];
fs.createReadStream(await arquivo.path)
.pipe(csv({ delimiter: ":" }))
.on("data", async function (row) {
let achou = false;
if (row.booking_status === "ACTIVE") {
let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
await Model.findAll({
where: {
[Op.And]: Sequelize.where(
Sequelize.fn("lower", Sequelize.col("email")),
{ [Op.eq]: row.cus_mail.toLowerCase() }
),
},
}).then((result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row.cus_name, (tipo = "email"));
}
});
if (!achou) {
Model.findAll({
where: {
cpf,
},
}).then((result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row[1], (tipo = "cpf"));
}
});
if (!achou) {
let end_numero = 0;
if (row.cus_streetnum !== "NaN") {
end_numero = Number(row.cus_streetnum);
}
let data = {
codigoImportacao: row.cus_mail,
nome: row.cus_name,
cpf,
end_logradouro: row.cus_street,
end_numero,
end_cep: Number(row.cus_zip),
end_cidade: row.cus_city,
email: row.cus_mail,
tel_celular: row.cus_phone.substring(2),
end_uf: "SP",
end_pais: "1058",
senha: "123456",
idc_status: 1,
idc_termo_aceito: 3,
idc_equipamento: 3,
};
Model.create(data).then(async (result) => {
logger.info(
"Motorista.upload :: " +
result.email +
" : SUCESSO : cd_motorista : " +
result.cd_motorista
);
await MotoristaComplementoController.createMotoristaAdmin(
result.cd_motorista,
req,
res
);
});
}
}
}
})
.on("end", async () => {
console.log("end1: " + nomesNaoImportados.length);
});
console.log("end2: " + nomesNaoImportados.length);
res.send({ upload: true });
}
}
},
Ele importou e salvou a primeira vez.
Na segunda vez, ele não salvou, porque existe o email no banco, assim ele mudou a variável para achou = true;, e preencheu a lista em nomesNaoImportados.push(row.cus_name, (tipo = “email”));
Mas não consigo fazer a validação desta lista
logs
O que está faltando ?
Esse Model.findAll({
está sendo executado de forma assíncrona, ou seja, o IF que tem em seguida if (!achou) {
já será executado antes mesmo do then referente ao Model.findAll
. Bom, analisando o código, foi o que consegui perceber. Para testar, tu pode colocar um console log dentro do then e antes do IF para ver a ordem em que eles serão apresentados.
1 curtida
Acaba que é uma função assíncrona msm. Capaz que deve ser por isso que a lógica está quebrando.
Para testar tente executar seu código dessa forma:
uploadMotorista: async (req, res) => {
const arquivo = req.file;
console.log(arquivo);
if (arquivo === undefined) {
res.status(400).json({ error: "Deve selecionar um arquivo !" });
} else {
if (arquivo.mimetype !== "application/vnd.ms-excel") {
res.status(400).json({ error: "O arquivo deve ser um CSV !" });
} else {
let nomesNaoImportados = [];
fs.createReadStream(await arquivo.path)
.pipe(csv({ delimiter: ":" }))
.on("data", async function (row) {
let achou = false;
if (row.booking_status === "ACTIVE") {
let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
await Model.findAll({
where: {
[Op.And]: Sequelize.where(
Sequelize.fn("lower", Sequelize.col("email")),
{ [Op.eq]: row.cus_mail.toLowerCase() }
),
},
}).then((result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row.cus_name, (tipo = "email"));
}
if (!achou) {
Model.findAll({
where: {
cpf,
},
}).then((result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row[1], (tipo = "cpf"));
}
});
if (!achou) {
let end_numero = 0;
if (row.cus_streetnum !== "NaN") {
end_numero = Number(row.cus_streetnum);
}
let data = {
codigoImportacao: row.cus_mail,
nome: row.cus_name,
cpf,
end_logradouro: row.cus_street,
end_numero,
end_cep: Number(row.cus_zip),
end_cidade: row.cus_city,
email: row.cus_mail,
tel_celular: row.cus_phone.substring(2),
end_uf: "SP",
end_pais: "1058",
senha: "123456",
idc_status: 1,
idc_termo_aceito: 3,
idc_equipamento: 3,
};
Model.create(data).then(async (result) => {
logger.info(
"Motorista.upload :: " +
result.email +
" : SUCESSO : cd_motorista : " +
result.cd_motorista
);
await MotoristaComplementoController.createMotoristaAdmin(
result.cd_motorista,
req,
res
);
});
}
}
});
}
})
.on("end", async () => {
console.log("end1: " + nomesNaoImportados.length);
});
console.log("end2: " + nomesNaoImportados.length);
res.send({ upload: true });
}
}
},
A única mudança que fiz foi jogar o bloco do IF para dentro do when do Model.findAll
1 curtida
Não funcionou
uploadMotorista: async (req, res) => {
const arquivo = req.file;
console.log(arquivo);
if (arquivo === undefined) {
res.status(400).json({ error: "Deve selecionar um arquivo !" });
} else {
if (arquivo.mimetype !== "application/vnd.ms-excel") {
res.status(400).json({ error: "O arquivo deve ser um CSV !" });
} else {
let nomesNaoImportados = [];
fs.createReadStream(arquivo.path)
.pipe(csv({ delimiter: ":" }))
.on("data", async function (row) {
let achou = false;
if (row.booking_status === "ACTIVE") {
let cpf = String(row.cus_cpf).match(/[\d]+/g).join("");
await Model.findAll({
where: {
[Op.And]: Sequelize.where(
Sequelize.fn("lower", Sequelize.col("email")),
{ [Op.eq]: row.cus_mail.toLowerCase() }
),
},
}).then(async (result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row.cus_name, (tipo = "email"));
console.log("nomesNaoImportados" + nomesNaoImportados.length);
} else {
await Model.findAll({
where: {
cpf,
},
}).then((result) => {
if (result && result.length > 0) {
achou = true;
nomesNaoImportados.push(row[1], (tipo = "cpf"));
} else {
let end_numero = 0;
if (row.cus_streetnum !== "NaN") {
end_numero = Number(row.cus_streetnum);
}
let data = {
codigoImportacao: row.cus_mail,
nome: row.cus_name,
cpf,
end_logradouro: row.cus_street,
end_numero,
end_cep: Number(row.cus_zip),
end_cidade: row.cus_city,
email: row.cus_mail,
tel_celular: row.cus_phone.substring(2),
end_uf: "SP",
end_pais: "1058",
senha: "Zanzar@2021",
idc_status: 1,
idc_termo_aceito: 3,
idc_equipamento: 3,
};
Model.create(data).then(async (result) => {
logger.info(
"Motorista.upload :: " +
result.email +
" : SUCESSO : cd_motorista : " +
result.cd_motorista
);
await MotoristaComplementoController.createMotoristaAdmin(
result.cd_motorista,
req,
res
);
});
}
});
}
});
}
})
.on("end", async () => {
console.log("end1: " + nomesNaoImportados.length);
});
console.log("end2: " + nomesNaoImportados.length);
res.send({ upload: true });
}
},
Ele imprimi end2 e end2 antes do gerar o select