UNPKG

@heknon/node-webtop

Version:

A Backend for an unofficial WebTop (SmartSchool - Israel) API.

92 lines (91 loc) 4.5 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const apiConfig_1 = require("../apiConfig"); const cheerio_1 = __importDefault(require("cheerio")); const moment_1 = __importDefault(require("moment")); exports.constructGradeSemester = (axios, studentYear, semester, onlyFilledGrades) => __awaiter(void 0, void 0, void 0, function* () { const req = yield axios.post(apiConfig_1.defaultApiRoutes.grades(studentYear, semester === 1)); const $ = cheerio_1.default.load(req.data); if ($($('div .center')[3]).text() === 'לא נמצאו נתונים') throw new Error("Couldn't find grade data for this year."); const grades = constructGradesFromHTML($, onlyFilledGrades); return { semester, latest: grades[0], oldest: grades[grades.length - 1], grades }; }); exports.constructGradeYear = (axios, studentYear, onlyFilledGrades) => __awaiter(void 0, void 0, void 0, function* () { const sem1 = yield exports.constructGradeSemester(axios, studentYear, 1, onlyFilledGrades); const sem2 = yield exports.constructGradeSemester(axios, studentYear, 2, onlyFilledGrades); const grades = [sem1, sem2]; return { studentYear, latest: grades[1].latest, oldest: grades[0].oldest, grades }; }); exports.constructGrades = (axios, onlyFilledGrades) => __awaiter(void 0, void 0, void 0, function* () { const grades = []; try { yield exports.constructGradeYear(axios, 0, onlyFilledGrades).then(yr => grades.push(yr)); yield exports.constructGradeYear(axios, 1, onlyFilledGrades).then(yr => grades.push(yr)); yield exports.constructGradeYear(axios, 2, onlyFilledGrades).then(yr => grades.push(yr)); } catch (e) { return { latest: grades[grades.length - 1].latest, oldest: grades[0].oldest, grades }; } return { latest: grades[grades.length - 1].latest, oldest: grades[0].oldest, grades }; }); const constructGradesFromHTML = ($, onlyFilledGrades) => { const grades = []; const gradeCards = $('.pupil-card-item'); gradeCards.each((i, gradeCard) => { if (gradeCard.children[0].children.length === 1 && onlyFilledGrades) return; const grade = {}; const gradeNum = gradeCard.children[0].children.length === 1 ? -1 : Number.parseInt($(gradeCard.children[0].children[1]).text().match(/\d+/)[0]); const gradeDate = $(gradeCard.parent.prev).text().match(/\d+/g); const gradeDetails = $(gradeCard.children[1].children[0]).text().match(/^[^ \(]+|\(([^)]+)\)/g); grade.title = $(gradeCard.children[0].children[0]).text(); grade.grade = gradeNum; grade.date = moment_1.default({ year: Number.parseInt(gradeDate[2]), month: Number.parseInt(gradeDate[1]), day: Number.parseInt(gradeDate[0]), }); const gradeDetailsLengthBiggerThan2 = gradeDetails.length > 2; grade.lesson = { subjectName: gradeDetails[0], teacherName: gradeDetailsLengthBiggerThan2 ? gradeDetails[2].replace(/\(|\)/g, '') : gradeDetails[1].replace(/\(|\)/g, '') }; if (gradeDetailsLengthBiggerThan2) grade.lesson.level = Number.parseInt(/\d+/.exec(gradeDetails[1])[0]); if (gradeCard.children[1].children.length > 1) grade.weight = Number.parseInt(/\d+/.exec($(gradeCard.children[1].children[1]).text())[0]); grades.push(grade); }); return grades; };