-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.js
184 lines (152 loc) · 4.3 KB
/
model.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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
const fs = require("fs");
// Nombre del fichero donde se guardan las preguntas.
// Es un fichero de texto con el JSON de quizzes.
const DB_FILENAME = "quizzes.json";
// Modelo de datos.
//
// En esta variable se mantienen todos los quizzes existentes.
// Es un array de objetos, donde cada objeto tiene los atributos question
// y answer para guardar el texto de la pregunta y el de la respuesta.
//
// Al arrancar la aplicación, esta variable contiene estas cuatro preguntas,
// pero al final del módulo se llama a load() para la cargar las preguntas
// guardadas en el fichero DB_FILENAME.
let quizzes = [
{
question: "Capital de Italia",
answer: "Roma"
},
{
question: "Capital de Francia",
answer: "París"
},
{
question: "Capital de España",
answer: "Madrid"
},
{
question: "Capital de Portugal",
answer: "Lisboa"
}
];
/**
* Carga las preguntas guardadas en el fichero.
*
* Este método carga el contenido del fichero DB_FILENAME en la variable
* quizzes. El contenido de ese fichero está en formato JSON.
* La primera vez que se ejecute este método, el fichero DB_FILENAME no
* existe, y se producirá el errro ENOENT. En este caso se salva el
* contenido inicial almacenado en quizzes.
* Si se produce otro tipo de error, se lanza una excepción que abortará
* la ejecución del programa.
*/
const load = () => {
fs.readFile(DB_FILENAME, (err, data) => {
if (err) {
// La primera vez no existe el fichero
if (err.code === "ENOENT") {
save(); // valores iniciales
return;
}
throw err;
}
let json = JSON.parse(data);
if (json) {
quizzes = json;
}
});
};
/**
* Guarda las preguntas en el fichero.
*
* Guarda en formatro JSON el valor de quizzes en el fichero DB_FILENAME.
* Si se produce algún tipo de error, se lanza una excepción que abortará
* la ejecución del programa.
*/
const save = () => {
fs.writeFile(DB_FILENAME,
JSON.stringify(quizzes),
err => {
if (err) throw err;
});
};
//
/**
* Devuelve el número total de preguntas existentes.
*
* @returns {number} número total de preguntas existentes.
*/
exports.count = () => quizzes.length;
/**
* Añade un nuevo quiz.
*
* @param question String con la pregunta.
* @param answer String con la respuesta.
*/
exports.add = (question, answer) => {
quizzes.push({
question: (question || "").trim(),
answer: (answer || "").trim()
});
save();
};
/**
* Actualiza el quiz situado en la posicion index.
*
* @param id Clave que identifica el quiz a actualizar.
* @param question String con la pregunta.
* @param answer String con la respuesta.
*/
exports.update = (id, question, answer) => {
const quiz = quizzes[id];
if (typeof quiz === "undefined") {
throw new Error(`El valor del parámetro id no es válido.`);
}
quizzes.splice(id, 1, {
question: (question || "").trim(),
answer: (answer || "").trim()
});
save();
};
/**
* Devuelve todos los quizzes existentes.
*
* Devuelve un clon del valor guardado en la variable quizzes, es decir devuelve un
* objeto nuevo con todas las preguntas existentes.
* Para clonar quizzes se usa stringify + parse.
*
* @returns {any}
*/
exports.getAll = () => JSON.parse(JSON.stringify(quizzes));
/**
* Devuelve un clon del quiz almacenado en la posición dada.
*
* Para clonar el quiz se usa stringify + parse.
*
* @param id Clave que identifica el quiz a devolver.
*
* @returns {question, answer} Devuelve el objeto quiz de la posición dada
*/
exports.getByIndex = id => {
const quiz = quizzes[id];
if (typeof quiz === "undefined") {
throw new Error(`El valor del parámetro id no es válido.`);
}
return JSON.parse(JSON.stringify(quiz));
};
//
/**
* Elimina el quiz situado en la posición dada.
*
* @param id Clave que identifica el quiz a borrar.
*/
exports.deleteByIndex = id => {
const quiz = quizzes[id];
if (typeof quiz === "undefined") {
throw new Error(`El valor del parámetro id no es válido.`);
}
quizzes.splice(id, 1);
save();
};
// Carga los quizzes almacenados en el fichero.
load();