📦 NEW: randomQuote page personnalisée
This commit is contained in:
@@ -1,4 +1,65 @@
|
||||
exports.emailTemplate = (subtitle, buttonText, url, footerText) => `
|
||||
exports.emailQuoteTemplate = (isValid, quote, frontendLink) => `
|
||||
<center>
|
||||
<table border="0" cellpadding="20" cellspacing="0" height="100%" width="100%" style="background-color:#181818">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:600px;border-radius:6px">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:600px">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<h1 style="font-family:Arial, Helvetica, sans-serif;color:#ffd800;font-size:28px;line-height:110%;margin-bottom:30px;margin-top:0;padding:0">FunctionProject</h1>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:600px;border-radius:6px;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="left" valign="top" style="line-height:150%;font-family:Helvetica;font-size:14px;color:rgb(222, 222, 222);padding:30px;box-shadow: 0px 0px 6px 6px rgba(0, 0, 0, .25);border: 1px solid black;border-radius: 1rem;">
|
||||
<h2 style="font-size:22px;line-height:28px;margin:0 0 12px 0;">
|
||||
La citation que vous avez proposée a été ${(isValid) ? "validée" : "supprimée"}.
|
||||
</h2>
|
||||
<p style="margin: 0 0 12px 0;">
|
||||
<a style="color: #ffd800;" href="${frontendLink}/functions/randomQuote">Lien vers la fonction randomQuote de FunctionProject.</a>
|
||||
</p>
|
||||
${(!isValid) ? `
|
||||
<p style="margin: 0 0 12px 0;">
|
||||
Si votre citation a été supprimée et vous pensez que c'est une erreur, contactez-moi à cette adresse email : <a style="color: #ffd800;" href="mailto:contact@divlo.fr">contact@divlo.fr</a>.
|
||||
</p>
|
||||
` : ""}
|
||||
<div>
|
||||
<p style="padding:0 0 10px 0">
|
||||
La citation en question : <br/>
|
||||
" ${quote.quote} "
|
||||
<br/>
|
||||
- ${quote.author}
|
||||
</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</center>
|
||||
`;
|
||||
|
||||
exports.emailUserTemplate = (subtitle, buttonText, url, footerText) => `
|
||||
<center>
|
||||
<table border="0" cellpadding="20" cellspacing="0" height="100%" width="100%" style="background-color:#181818">
|
||||
<tbody>
|
||||
|
@@ -14,6 +14,9 @@ module.exports = randomQuote = async ({ res, next }, _argsObject) => {
|
||||
attributes: {
|
||||
exclude: ["isValidated"]
|
||||
},
|
||||
where: {
|
||||
isValidated: 1,
|
||||
}
|
||||
});
|
||||
return res.status(200).json(quote);
|
||||
} catch (error) {
|
||||
|
@@ -1,15 +1,18 @@
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { validationResult } = require('express-validator');
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const Functions = require('../models/functions');
|
||||
const Categories = require('../models/categories');
|
||||
const Quotes = require('../models/quotes');
|
||||
const Users = require('../models/users');
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber');
|
||||
const Sequelize = require('sequelize');
|
||||
const deleteFilesNameStartWith = require('../assets/utils/deleteFilesNameStartWith');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { validationResult } = require('express-validator');
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const Functions = require('../models/functions');
|
||||
const Categories = require('../models/categories');
|
||||
const Quotes = require('../models/quotes');
|
||||
const Users = require('../models/users');
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber');
|
||||
const Sequelize = require('sequelize');
|
||||
const deleteFilesNameStartWith = require('../assets/utils/deleteFilesNameStartWith');
|
||||
const { EMAIL_INFO, FRONT_END_HOST } = require('../assets/config/config');
|
||||
const transporter = require('../assets/config/transporter');
|
||||
const { emailQuoteTemplate } = require('../assets/config/emails');
|
||||
|
||||
const handleEditFunction = async (res, resultFunction, { title, slug, description, type, categorieId, isOnline }, imageName = false) => {
|
||||
resultFunction.title = title;
|
||||
@@ -305,18 +308,35 @@ exports.putQuote = async (req, res, next) => {
|
||||
if (typeof isValid !== 'boolean') {
|
||||
return errorHandling(next, { message: "isValid doit être un booléen.", statusCode: 400 });
|
||||
}
|
||||
const quote = await Quotes.findOne({ where: { id, isValidated: 0 } });
|
||||
const quote = await Quotes.findOne({
|
||||
where: {
|
||||
id,
|
||||
isValidated: 0
|
||||
},
|
||||
include: [
|
||||
{ model: Users, attributes: ["name", "email"] }
|
||||
]
|
||||
});
|
||||
if (!quote) {
|
||||
return errorHandling(next, { message: "La citation n'existe pas (ou est déjà validé).", statusCode: 404 });
|
||||
}
|
||||
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: quote.user.email,
|
||||
subject: "FunctionProject - Citation proposée",
|
||||
html: emailQuoteTemplate(isValid, quote, FRONT_END_HOST)
|
||||
});
|
||||
|
||||
if (isValid) {
|
||||
quote.isValidated = true;
|
||||
const result = await quote.save();
|
||||
return res.status(200).json({ isValidated: true, message: "La citation a bien été validée!", result });
|
||||
}
|
||||
|
||||
await quote.destroy();
|
||||
return res.status(200).json({ isValidated: false, message: "La citation a bien été supprimée!" });
|
||||
await quote.save();
|
||||
return res.status(200).json({ message: "La citation a bien été validée!" });
|
||||
} else {
|
||||
await quote.destroy();
|
||||
return res.status(200).json({ imessage: "La citation a bien été supprimée!" });
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
|
@@ -1,8 +1,8 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const Quotes = require('../models/quotes');
|
||||
const Users = require('../models/users');
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber');
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError, requiredFields } = require('../assets/config/errors');
|
||||
const Quotes = require('../models/quotes');
|
||||
const Users = require('../models/users');
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber');
|
||||
|
||||
exports.getQuotes = (req, res, next) => {
|
||||
const page = helperQueryNumber(req.query.page, 1);
|
||||
@@ -35,6 +35,10 @@ exports.getQuotes = (req, res, next) => {
|
||||
|
||||
exports.postQuote = (req, res, next) => {
|
||||
const { quote, author } = req.body;
|
||||
// S'il n'y a pas les champs obligatoire
|
||||
if (!(quote && author)) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
Quotes.create({ quote, author, userId: req.userId })
|
||||
.then((_result) => {
|
||||
return res.status(200).json({ message: "La citation a bien été ajoutée, elle est en attente de confirmation d'un administrateur." });
|
||||
|
@@ -8,7 +8,7 @@ const errorHandling = require('..
|
||||
const { serverError, generalError } = require('../assets/config/errors');
|
||||
const { JWT_SECRET, FRONT_END_HOST, EMAIL_INFO, HOST, TOKEN_LIFE } = require('../assets/config/config');
|
||||
const transporter = require('../assets/config/transporter');
|
||||
const { emailTemplate } = require('../assets/config/emails');
|
||||
const { emailUserTemplate } = require('../assets/config/emails');
|
||||
const Users = require('../models/users');
|
||||
const Favorites = require('../models/favorites');
|
||||
const Functions = require('../models/functions');
|
||||
@@ -28,7 +28,7 @@ async function handleEditUser(res, { name, email, biography, isPublicEmail }, us
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'email",
|
||||
html: emailTemplate("Veuillez confirmer l'email", "Oui, je confirme.", `${HOST}/users/confirm-email/${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Votre email ne serez pas confirmé si vous ne cliquez pas sur le lien de confirmation ci-dessus.")
|
||||
html: emailUserTemplate("Veuillez confirmer l'email", "Oui, je confirme.", `${HOST}/users/confirm-email/${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Votre email ne serez pas confirmé si vous ne cliquez pas sur le lien de confirmation ci-dessus.")
|
||||
});
|
||||
}
|
||||
if (biography != undefined) {
|
||||
@@ -97,7 +97,7 @@ exports.register = async (req, res, next) => {
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'inscription",
|
||||
html: emailTemplate("Veuillez confirmer l'inscription", "Oui, je m'inscris.", `${HOST}/users/confirm-email/${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Vous ne serez pas inscrit si vous ne cliquez pas sur le lien de confirmation ci-dessus.")
|
||||
html: emailUserTemplate("Veuillez confirmer l'inscription", "Oui, je m'inscris.", `${HOST}/users/confirm-email/${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Vous ne serez pas inscrit si vous ne cliquez pas sur le lien de confirmation ci-dessus.")
|
||||
});
|
||||
return res.status(201).json({ result: "Vous y êtes presque, veuillez vérifier vos emails pour confirmer l'inscription." });
|
||||
} catch (error) {
|
||||
@@ -173,7 +173,7 @@ exports.resetPassword = async (req, res, next) => {
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Réinitialisation du mot de passe",
|
||||
html: emailTemplate("Veuillez confirmer la réinitialisation du mot de passe", "Oui, je change mon mot de passe.", `${FRONT_END_HOST}/newPassword?token=${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Votre mot de passe ne sera pas réinitialiser si vous ne cliquez pas sur le lien ci-dessus. Par ailleurs, pour la sécurité de votre compte, la réinitialisation du mot de passe est disponible pendant un délai de 1 heure, passez ce temps, la réinitialisation ne sera plus valide.")
|
||||
html: emailUserTemplate("Veuillez confirmer la réinitialisation du mot de passe", "Oui, je change mon mot de passe.", `${FRONT_END_HOST}/newPassword?token=${tempToken}`, "Si vous avez reçu ce message par erreur, il suffit de le supprimer. Votre mot de passe ne sera pas réinitialiser si vous ne cliquez pas sur le lien ci-dessus. Par ailleurs, pour la sécurité de votre compte, la réinitialisation du mot de passe est disponible pendant un délai de 1 heure, passez ce temps, la réinitialisation ne sera plus valide.")
|
||||
});
|
||||
return res.status(200).json({ result: "Demande de réinitialisation du mot de passe réussi, veuillez vérifier vos emails!" });
|
||||
} catch (error) {
|
||||
|
Reference in New Issue
Block a user