GeovaneSchmitz / sigaa-api

Unofficial high performance API for SIGAA (Sistema Integrado de Gestão de Atividades Acadêmicas) using web scraping.
MIT License
40 stars 11 forks source link

Ao usar requests em paralelo API retorna paginas diferentes #46

Closed Diassisfilho closed 8 months ago

Diassisfilho commented 8 months ago

Problema

No arquivo de exemplo da API no repositorio "get-grades-simultaneously.js" quando é testado funciona perfeitamente. Porém quando é utilizado o recurso Promise.all com outras partes da API como pegar as lessons ou absences dos cursos é dado o erro de "API Error: Sigaa: using the old page coused the change to the last accessed course instead of the resquested course". No codigo esse erro ocorre quando uma pagina não é a que foi informada. Em seguida tem um codigo que gera esse erro.

Exemplo

Tentei deixar o mais parecido com o exemplo do repositorio para não haver duvidas que é um bug de verdade.

const { Sigaa } = require("sigaa-api");

const username = "";
const passwd = "";
const options = {
  url: "",
  institution: "",
};

async function getCoursesObject(courses) {
  const coursesResult = await Promise.all(
    courses.map(async (course) => {
      const sigaaInstanceOfCourse = new Sigaa(options);
      // pega as notas de cada turma simultaneamente
      console.log("Logando para a turma: " + course.title);
      const account = await sigaaInstanceOfCourse.login(username, passwd); // login
      const bonds = await account.getActiveBonds();
      const bondOfCourse = bonds.filter((b) => b.type === "student")[0]; // pega o vinculo da turma
      const courses = await bondOfCourse.getCourses(true);
      const courseSelected = courses.filter((c) => c.id === course.id)[0]; // pega a turma especificada

      var topics = [];
      const topicsArray = await courseSelected.getLessons();
      for (const topic of topicsArray) {
        const subitems = [];

        for (const attachment of topic.attachments) {
          subitems.push({
            title: attachment.title,
            type: attachment.type,
          });
        }

        const topicData = {
          title: topic.title,
          date: topic.startDate.toString() + " - " + topic.endDate.toString(),
          content: topic.contentText,
          subitems: subitems,
        };
        topics.push(topicData);
      }

      const absencesCourse = await course.getAbsence();
      account.logoff();

      return {
        info: {
          title: course.title,
          code: course.code,
          students: String(course.numberOfStudents),
          schedule: course.schedule.split(" ")[0],
        },
        topics,
        absences: {
          totalAbsences: absencesCourse.totalAbsences,
          maxAbsences: absencesCourse.maxAbsences,
        },
      };
    })
  );

  return coursesResult;
}

async function main() {
  const sigaa = new Sigaa(options);

  console.log("Logging...");
  const account = await sigaa.login(username, passwd);
  console.log("Loged");
  const studentBond = (await account.getActiveBonds()).filter(
    (bond) => bond.type === "student"
  )[0];
  const allCourses = await studentBond.getCourses(true);

  console.log("Getting course infos...");
  const results = await getCoursesObject(allCourses);
  console.log(results);
}

main().then(() => {
  process.exit(0);
});

Tentativas e Comportamentos

Este bug ja foi mencionado em um commit que resolvia esses bug. Eu tentei debugar um pouco o código e suspeitei do cache tentei fazer poucas alterações, mas pouco surgiu efeito. No decorator sharedReturn a variavel de cache de paginas __sharedReturn... que fica dentro da instância da API está armazenando somente uma pagina de curso e o resto de undefined na Map do cache. Não tenho certeza, mas acho que era para ter mais de uma pagina em cache no momento do código que verifiquei. Talvez seja a stack de promises, porém não verifiquei.

Parece que qualquer método async que é utilizado dentro da Promise.all tirando o método grades da este erro, exceto quando é utilizado somente 2 cursos, porem com 3 ou mais é dado esse erro.

dduartee commented 8 months ago

Olá, o erro ocorre ao chamar qual função? getLessons ou getAbsence? fiz um teste aqui como eu pude, e não retornou o erro das páginas trocadas

Diassisfilho commented 8 months ago

Olá, obrigado por responder. Olhando aqui na arvore de chamada do erro esta que a getAbsence que esta causando o erro. O uso do getLessons não esta dando o erro (apesar de me eu e meu amigo lembrar que dava erro). Agora estou com suspeita que algo que modifiquei para a versão da UNILAB está causando isso.