ÿØÿà JFIF ` ` ÿþ
|
Server : Apache System : Linux cloud.heroica.com.br 4.18.0-553.36.1.el8_10.x86_64 #1 SMP Wed Jan 22 03:07:54 EST 2025 x86_64 User : farolpborg ( 1053) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /var/www/node_services/apicentralquestoes/src/services/ |
Upload File : |
const Desempenho = require("../models/Desempenho");
const Questao = require("../models/Questao");
const Assinatura = require("../models/Assinatura");
const Resposta = require("../models/Resposta");
const sequelize = require("../database");
const User = require("../models/User");
const MENSAGENS_ERRO = require("../utils/mensagensErro");
const desempenhoValidations = require("../validations/desempenhoValidations");
const { Op, Sequelize } = require("sequelize");
const desempenhoService = {
registrarDesempenho: async (user_id, questao_id, resposta) => {
const erroValidacao = desempenhoValidations.validarEntradaDesempenho(
questao_id,
resposta
);
if (erroValidacao) return erroValidacao;
try {
const userExiste = await User.findByPk(user_id);
if (!userExiste)
return { erro: 404, mensagem: MENSAGENS_ERRO.USUARIO_NAO_ENCONTRADO };
const assinatura = await Assinatura.findOne({
where: { user_id },
order: [["expires_at", "DESC"]],
});
// if (!assinatura || assinatura.plano_id === 1) {
// return {
// erro: 403,
// mensagem: MENSAGENS_ERRO.PLANO_NAO_PERMITE_RESPOSTAS,
// };
// }
const questao = await Questao.findByPk(questao_id);
if (!questao) {
console.error(`Questão com ID ${questao_id} não encontrada.`);
return { erro: 404, mensagem: MENSAGENS_ERRO.QUESTAO_NAO_ENCONTRADA };
}
const correta = questao.resposta === resposta;
try {
await Resposta.create({
user_id: Number(user_id),
questao_id,
disciplina: questao.disciplina,
correta,
});
} catch (erro) {
console.error("Erro ao registrar a resposta:", erro);
return { erro: 500, mensagem: "Erro ao registrar a resposta." };
}
let desempenho = await Desempenho.findOne({
where: { user_id, questao_id },
});
if (!desempenho) {
desempenho = await Desempenho.create({
user_id,
questao_id,
disciplina: questao.disciplina,
total_questoes: 1,
total_acertos: correta ? 1 : 0,
});
} else {
desempenho.total_questoes += 1;
if (correta) {
desempenho.total_acertos += 1;
}
await desempenho.save();
}
return desempenho;
} catch (erro) {
return { erro: 500, mensagem: erro.message };
}
},
obterDesempenho: async (user_id, filtro) => {
try {
const userExiste = await User.findByPk(user_id);
if (!userExiste) {
return { erro: 404, mensagem: "Usuário não encontrado." };
}
const assinatura = await Assinatura.findOne({
where: { user_id },
order: [["expires_at", "DESC"]],
});
if (!assinatura || assinatura.plano_id != 3) {
return {
erro: 403,
mensagem: "Seu plano atual não permite visualizar o desempenho.",
};
}
let whereClause = { user_id };
const agora = new Date();
const inicioDia = new Date(agora.setHours(0, 0, 0, 0));
const fimDia = new Date(agora.setHours(23, 59, 59, 999));
switch (filtro) {
case "dia":
whereClause.created_at = {
[Op.between]: [inicioDia, fimDia],
};
break;
case "semana":
whereClause.created_at = {
[Op.gte]: new Date(inicioDia.getTime() - 7 * 24 * 60 * 60 * 1000),
};
break;
case "mes":
whereClause.created_at = {
[Op.gte]: new Date(inicioDia.getTime() - 30 * 24 * 60 * 60 * 1000),
};
break;
case "sempre":
break;
default:
return { erro: 400, mensagem: "Filtro inválido." };
}
const respostas = await Resposta.findAll({
where: whereClause,
attributes: [
"disciplina",
[sequelize.fn("COUNT", sequelize.col("id")), "total_questoes"],
[
sequelize.fn(
"SUM",
sequelize.literal("CASE WHEN correta THEN 1 ELSE 0 END")
),
"total_acertos",
],
],
group: ["disciplina"],
});
// Calcular totais gerais
const totalQuestoesGeral = respostas.reduce(
(sum, r) => sum + Number(r.dataValues.total_questoes),
0
);
const totalAcertosGeral = respostas.reduce(
(sum, r) => sum + Number(r.dataValues.total_acertos),
0
);
// Retornar o desempenho
return {
totalQuestoesGeral,
totalAcertosGeral,
desempenhoPorDisciplina: respostas.map((resposta) => ({
disciplina: resposta.disciplina,
totalQuestoes: Number(resposta.dataValues.total_questoes),
totalAcertos: Number(resposta.dataValues.total_acertos),
})),
};
} catch (erro) {
console.error("Erro ao obter desempenho:", erro);
return { erro: 500, mensagem: "Erro ao obter desempenho." };
}
},
};
module.exports = desempenhoService;