-
Notifications
You must be signed in to change notification settings - Fork 0
/
transcript-db.js
executable file
·159 lines (137 loc) · 3.96 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"use strict";
// importazione delle librerie: modulo dayjs per gestire le date e sqlite3 per il db
const dayjs = require("dayjs");
const sqlite3 = require("sqlite3");
// creo la funzione costruttrice dell'oggetto Exam
// di default la loude = false in quanto questa condizione si verifica sempre per valori di score tra 18 a 29
// la laude = true solo in alcuni casi dove score = 30
function Exam(code, name, credits, date, score, laude = false) {
this.code = code;
this.name = name;
this.credits = credits;
this.date = dayjs(date);
this.score = score;
this.laude = laude;
this.toString = () => {
return `${this.code} - ${this.name}: ${this.score} \n`;
};
}
// creo la funzione costruttrice dell'oggetto ExamList
function ExamList() {
const db = new sqlite3.Database("exams.sqlite", (err) => {
if (err) throw err;
});
// add - il metodo add deve essere gestito in modo asincrono per cui il metodo deve ritornare una promise
// se non gestiremmo il metodo in modo asincrono, metodi successivi come getAll() potrebbero visualizzare
// i risultati prima che i metodi db.run() ultimerebbero il loro inserimento
this.add = (exam) => {
return new Promise((resolve, reject) => {
// query sql
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")],
// se dovessimo usare una Arrow Function non sarebbe possibile ottenere il lastID
// in quanto le Arrow Fuction ridefiniscono il this localmente e non riferito al db.run
function (err) {
if (err) reject(err);
else resolve(this.lastID);
}
);
});
};
// get.All
this.getAll = () => {
return new Promise((resolve, reject) => {
// query sql
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 == 1
)
);
resolve(exams);
}
});
});
};
// find
this.find = (code) => {};
// afterDate
this.afterDate = (date) => {};
// getWorst
this.getWorst = (num) => {};
}
/* Trattamento con ASYNC / AWAIT */
const main = async () => {
const aw1 = new Exam(
"01TXYOV",
"Applicazioni Web I",
6,
"2021-07-01",
30,
true
);
// istanza sw dell'oggetto Exam
const ds = new Exam(
"02aaa",
"Data Science and Database Technology",
6,
"2021-06-15",
28
);
// console.log(aw1);
const exams = new ExamList();
try {
// const id = await exams.add(aw1);
// console.log(id);
const myExams = await exams.getAll();
// console.log(myExams); così non funziona il metodo this.toString che utilizza i template literals - per farlo funzionare
console.log(`${myExams}`);
} catch (error) {
console.log(error);
}
};
main();
/* Trattamento con le PROMISE */
/*
// istanza aw1 dell'oggetto Exam
const aw1 = new Exam(
"01TXYOV",
"Applicazioni Web I",
6,
"2021-07-01",
30,
true
);
// istanza sw dell'oggetto Exam
const ds = new Exam(
"02aaa",
"Data Science and Database Technology",
6,
"2021-06-15",
28
);
// console.log(aw1);
const exams = new ExamList();
// con il then ci assicuriamo che il metodo add restituisce una promise fulfilled, solo allora sarà eseguito il metodo getAll()
exams
.add(aw1)
.then((id) => {
console.log(id);
exams.getAll().then((exams) => console.log(exams));
})
.catch((err) => console.log(err));
// exams.add(ds);
*/