-
Notifications
You must be signed in to change notification settings - Fork 0
/
transcript-db.js
119 lines (101 loc) · 3.5 KB
/
transcript-db.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
'use strict';
// import dayjs and sqlite3
const dayjs = require('dayjs');
const sqlite = require('sqlite3');
// the Exam object
function Exam(code, name, credits, date, score, laude=false) {
this.code = code;
this.name = name;
this.credits = credits;
this.score = score;
this.laude = laude;
this.date = dayjs(date);
this.toString = () => {
return `Code: ${this.code}, Course: ${this.name}, CFU: ${this.credits}, Grade: ${this.laude ? this.score + 'L' : this.score}, Date: ${this.date.format('YYYY-MM-DD')}`;
};
};
// the ExamList, with its methods
function ExamList() {
const db = new sqlite.Database('exams.sqlite', (err) => { if (err) throw err; });
this.add = (exam) => {
return new Promise((resolve, reject) => {
const sql = 'INSERT INTO score(coursecode, score, laude, datepassed) VALUES (?, ?, ?, DATE(?))';
db.run(sql, [exam.code, exam.score, exam.laude, exam.date.format('YYYY-MM-DD')], function(err) {
if (err)
reject(err);
else {
resolve(this.lastID);
}
});
});
};
this.getAll = () => {
return new Promise((resolve, reject) => {
const sql = 'SELECT * FROM course JOIN score ON course.code=score.coursecode' ;
db.all(sql, [], (err, rows) => {
if(err)
reject(err);
else {
const exams = rows.map(row => new Exam(row.code, row.name, row.CFU, row.datepassed, row.score, ((row.laude) ? true : false)));
resolve(exams);
}
});
});
};
this.find = (code) => {
const sql = 'SELECT * FROM course JOIN score ON course.code=score.coursecode WHERE score.coursecode=?';
db.get(sql, [code], (err, row) => {
if (err)
reject(err);
else
resolve(new Exam(row.code, row.name, row.CFU, row.datepassed, row.score, ((row.laude) ? true : false)))
});
};
this.afterDate = (date) => {
return new Promise((resolve, reject) => {
const sql = 'SELECT * FROM course JOIN score ON course.code=score.coursecode WHERE score.datepassed > ?' ;
db.all(sql, [date], (err, rows) => {
if(err)
reject(err);
else {
const exams = rows.map(row => new Exam(row.code, row.name, row.CFU, row.datepassed, row.score, ((row.laude) ? true : false)));
resolve(exams);
}
});
});
};
/* ALTERNATIVE
this.afterDate = async (date) => {
const exams = await this.getAll();
return exams.filter(course => course.date.isAfter(date));
}; */
this.getWorst = async (num) => {
const exams = await this.getAll();
return exams.sort((a,b) => a.score - b.score).splice(0, num);
};
};
/* TESTING */
const main = async () => {
const examList = new ExamList();
// creating a few Exams
const wa1 = new Exam('01TXYOV', 'Web Applications I', 6, '2021-06-01', 30, true);
const sec = new Exam('01TYMOV', 'Information systems security', 6, '2021-06-10', 22);
const ds = new Exam('01SQJOV', 'Data Science and Database Technology', 8, '2021-07-02', 28);
const myNewExams = [wa1, sec, ds];
// calling some methods -- insert the 3 new exams
for(const exam of myNewExams) {
try {
const result = await examList.add(exam);
console.log(`'${exam.name}' inserted!`)
} catch (err) {
console.error(err);
}
}
// get all the Exams
const exams = await examList.getAll();
console.log(`${exams}`);
// get the 2 worst Exams
const worstExams = await examList.getWorst(2);
console.log('Worst 2 exams: ' + worstExams);
}
main();