@heknon/node-webtop
Version:
A Backend for an unofficial WebTop (SmartSchool - Israel) API.
92 lines (91 loc) • 4.5 kB
JavaScript
;
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;
};