Skip to content

Commit afdd8e0

Browse files
authored
Merge pull request #95 from ProyectoIntegrador2018/dev
HU009, HU010, HU018
2 parents 327c05b + a02d193 commit afdd8e0

35 files changed

+1513
-83
lines changed

back/package-lock.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

back/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
"express-jwt": "^5.3.3",
2525
"handlebars": "^4.7.6",
2626
"jsonwebtoken": "^8.5.1",
27+
"moment-timezone": "^0.5.31",
2728
"mongoose": "^5.9.6",
2829
"mongoose-beautiful-unique-validation": "^7.1.1",
2930
"multer": "^1.4.2",
31+
"node-cron": "^2.0.3",
3032
"nodemailer": "^6.4.6",
3133
"pretty-error": "^2.1.1"
3234
},
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as EventLogic from "@/logics/event.logic";
2+
import { send } from "@/utils/errors";
3+
4+
export const searchEvent = (request, response) => {
5+
send(response, async () => {
6+
const query = request.query;
7+
return await EventLogic.searchEvent(query);
8+
});
9+
};
10+
11+
export const getEventById = (request, response) => {
12+
send(response, async () => {
13+
const id = request.params.id;
14+
return await EventLogic.getEventById(id);
15+
});
16+
};
17+
18+
export const createEvent = (request, response) => {
19+
send(response, async () => {
20+
const event = request.body;
21+
return await EventLogic.createEvent(event);
22+
});
23+
};
24+
25+
export const updateEvent = (request, response) => {
26+
send(response, async () => {
27+
const event = request.body;
28+
const id = request.params.id;
29+
return await EventLogic.updateEvent(id, event);
30+
});
31+
};
32+
33+
export const deleteEvent = (request, response) => {
34+
send(response, async () => {
35+
const id = request.params.id;
36+
return await EventLogic.deleteEvent(id);
37+
});
38+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as PointOfSaleLogic from "@/logics/pointOfSale.logic";
2+
import { send } from "@/utils/errors";
3+
4+
export const searchPoS = (request, response) => {
5+
send(response, async () => {
6+
const query = request.query;
7+
return await PointOfSaleLogic.searchPoS(query);
8+
});
9+
};
10+
11+
export const getPoSById = (request, response) => {
12+
send(response, async () => {
13+
const id = request.params.id;
14+
return await PointOfSaleLogic.getPoSById(id);
15+
});
16+
};
17+
18+
export const createPoS = (request, response) => {
19+
send(response, async () => {
20+
const poS = request.body;
21+
return await PointOfSaleLogic.createPoS(poS);
22+
});
23+
};
24+
25+
export const updatePoS = (request, response) => {
26+
send(response, async () => {
27+
const poS = request.body;
28+
const id = request.params.id;
29+
return await PointOfSaleLogic.updatePoS(id, poS);
30+
});
31+
};
32+
33+
export const deletePoS = (request, response) => {
34+
send(response, async () => {
35+
const id = request.params.id;
36+
return await PointOfSaleLogic.deletePoS(id);
37+
});
38+
};

back/src/controllers/suggestion.controller.js

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { SuggestionModel } from "@/models/suggestion.model";
33
import { TextModel } from "@/models/text.model";
44
import { sendEmail } from "@/utils/mailSender";
55
import { send } from "@/utils/errors";
6+
import { UserModel } from "@/models/user.model";
67

78
//Asigna X cantindad de lectores a un libro
89
export const assignReaders = async (text, amount) => {
@@ -192,14 +193,20 @@ export const calculateBetweenDatesPoints = async (initialDate, finalDate) => {
192193
};
193194

194195
//Funcion que modifica el status de la sugerencia de un lector a un libro
195-
export const changeSuggestionStatus = async (id, newStatus, previousStatus) => {
196+
export const changeSuggestionStatus = async (
197+
id,
198+
newStatus,
199+
previousStatus,
200+
session
201+
) => {
196202
const suggestion = await SuggestionModel.findById(id).populate("text");
197203
if (!suggestion) throw { error: `Suggestion with id: ${id} not found` };
198204
if (suggestion.suggestionStatus === previousStatus) {
199205
suggestion.suggestionStatus = newStatus;
200206
await SuggestionModel.updateOne(
201207
{ _id: suggestion._id },
202-
{ suggestionStatus: newStatus, ...suggestion._doc }
208+
{ suggestionStatus: newStatus, ...suggestion._doc },
209+
{ session }
203210
);
204211
return suggestion;
205212
} else {
@@ -211,26 +218,58 @@ export const changeSuggestionStatus = async (id, newStatus, previousStatus) => {
211218

212219
//Funcion que rechaza la sugerencia a un libro por parte de un lector
213220
export const rejectSuggestion = (request, response) => {
214-
send(response, async () => {
221+
send(response, async (session) => {
215222
const { id } = request.params;
216-
var suggestion = await SuggestionModel.findById(id);
217-
var text = await TextModel.findById(suggestion.text);
223+
const suggestion = await SuggestionModel.findById(id);
224+
const textPromise = TextModel.findById(suggestion.text);
225+
const readerPromise = ReaderModel.findById(suggestion.reader);
226+
const [text, reader] = await Promise.all([textPromise, readerPromise]);
227+
const user = await UserModel.findById(reader.user);
218228
await assignReaders(text, 1);
219229
const newSuggestion = await changeSuggestionStatus(
220230
id,
221231
"Rejected",
222-
"Pending"
232+
"Pending",
233+
session
223234
);
235+
// Update reader rejects in a row
236+
reader.rejectsInARow++;
237+
await reader.save({ session });
238+
239+
// If reader has rejected over five suggestions, send mail
240+
if (reader.rejectsInARow > 5) {
241+
const emailData = {
242+
email: user.email,
243+
subject: "Rechazo de lecturas"
244+
};
245+
await sendEmail(emailData, "reading_rejects", { readerName: user.name });
246+
console.log(`EMAIL SENT TO USER ${user.name}`);
247+
}
248+
224249
return newSuggestion;
225250
});
226251
};
227252

228253
//Funcion que acepta la sugerencia a un libro por parte de un lector
229254
export const acceptSuggestion = (request, response) => {
230-
send(response, async () => {
255+
send(response, async (session) => {
231256
const { id } = request.params;
232-
const suggestion = await changeSuggestionStatus(id, "Accepted", "Pending");
233-
return suggestion;
257+
const suggestion = await SuggestionModel.findById(id);
258+
const newSuggestionPromise = changeSuggestionStatus(
259+
id,
260+
"Accepted",
261+
"Pending",
262+
session
263+
);
264+
const readerPromise = ReaderModel.findById(suggestion.reader);
265+
const [newSuggestion, reader] = await Promise.all([
266+
newSuggestionPromise,
267+
readerPromise
268+
]);
269+
// Set rejects in a row to 0
270+
reader.rejectsInARow = 0;
271+
await reader.save();
272+
return newSuggestion;
234273
});
235274
};
236275

@@ -241,7 +280,8 @@ export const completeSuggestion = (request, response) => {
241280
const suggestion = await changeSuggestionStatus(
242281
id,
243282
"Completed",
244-
"Accepted"
283+
"Accepted",
284+
session
245285
);
246286
return suggestion;
247287
});
@@ -366,7 +406,7 @@ export const getReadersWithoutSuggestion = (request, response) => {
366406
occupiedReaders.forEach((element) => {
367407
idOccupied.push(element.reader.toString());
368408
});
369-
var finalArr = readers.filter(function(item) {
409+
var finalArr = readers.filter(function (item) {
370410
return idOccupied.indexOf(item._id.toString()) === -1;
371411
});
372412
return finalArr;
@@ -377,9 +417,7 @@ export const getReadersWithoutSuggestion = (request, response) => {
377417
export const deleteSuggestionAdmin = (request, response) => {
378418
send(response, async () => {
379419
const { id } = request.params;
380-
SuggestionModel.findOne({ _id: id })
381-
.deleteOne()
382-
.exec();
420+
SuggestionModel.findOne({ _id: id }).deleteOne().exec();
383421
});
384422
};
385423

back/src/controllers/text.controller.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const getAllTexts = (request, response) => {
1818
export const getText = (request, response) => {
1919
send(response, async () => {
2020
const { id } = request.params;
21-
const reader = await TextModel.findById(id).populate("genres");
21+
const reader = await TextModel.find({_id:id}).populate("genres");
2222
return reader;
2323
});
2424
};

back/src/controllers/user.controller.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,20 @@ export const getUser = (request, response) => {
5050
export const getUsers = (req, res) => {
5151
send(res, async () => {
5252
const users = await UserModel.find();
53-
return users;
53+
const readerUsersPromises = users
54+
.filter((user) => user.roles.some((x) => x === "reader"))
55+
.map(async (userReader) => {
56+
const userReaderJSON = userReader.toJSON();
57+
const reader = await ReaderModel.findOne({ user: userReader._id });
58+
return {
59+
...userReaderJSON,
60+
reader
61+
};
62+
});
63+
const readerUsers = await Promise.all(readerUsersPromises);
64+
return users
65+
.filter((user) => !user.roles.some((x) => x === "reader"))
66+
.concat(readerUsers);
5467
});
5568
};
5669

@@ -78,7 +91,16 @@ export const createUser = async (request, response, role) => {
7891
// Response with all the genres.
7992
export const getAllGenres = (request, response) => {
8093
send(response, async () => {
81-
const genres = await GenreModel.find();
94+
const genres = await GenreModel.aggregate([
95+
{
96+
$lookup: {
97+
from: "subgenres",
98+
localField: "_id",
99+
foreignField: "genre",
100+
as: 'children'
101+
}
102+
}
103+
]);
82104
return genres;
83105
});
84106
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<div>
2+
<div>Hola, {{ readerName }}</div>
3+
<br>
4+
<div>
5+
Esperamos que estés teniendo un buen día. Hemos notado que has rechazado las anteriores cinco peticiones
6+
para ser lector beta de nuestras obras. Entendemos que la semana puede ser muy pesada entre la escuela o el
7+
trabajo (¡o los dos!), así que queríamos saber si deseas permanecer en nuestra lista de lectores y seguir
8+
recibiendo nuestros correos. Si es así, ¡excelente! Ojalá las estrellas se alineen pronto para que puedas
9+
participar con nosotros. Si no, te agradecemos la confianza en darnos tus datos en primer lugar y que hallamos
10+
coincidido en nuestro amor por las letras.
11+
</div>
12+
<br>
13+
<div>¿Puedes responder a este correo con tu respuesta? Así las hadas sabrán qué hacer a continuación.</div>
14+
<br>
15+
<div>¡Ten un buen día!</div>
16+
</div>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<div>
2+
<div>Hola, {{ readerName }}.</div>
3+
<br>
4+
<div>
5+
Un gusto saludarte. Mandamos este mensaje para recordarte que quedan cinco días para que
6+
entregues tu opinión sobre la lectura de {{ book }}.
7+
</div>
8+
<br>
9+
<div>¡Esperamos que estés disfrutando tu lectura y gracias de nuevo por tu ayuda!</div>
10+
<br>
11+
<div>Equipo Silma</div>
12+
</div>

0 commit comments

Comments
 (0)