🎨 Configure standardJS
This commit is contained in:
@ -1,320 +1,319 @@
|
||||
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 getPagesHelper = require('../assets/utils/getPagesHelper');
|
||||
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 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 getPagesHelper = require('../assets/utils/getPagesHelper')
|
||||
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;
|
||||
resultFunction.slug = slug;
|
||||
resultFunction.description = description;
|
||||
resultFunction.type = type;
|
||||
resultFunction.categorieId = categorieId;
|
||||
resultFunction.isOnline = isOnline;
|
||||
if (imageName) {
|
||||
resultFunction.image = `/images/functions/${imageName}`;
|
||||
}
|
||||
const result = await resultFunction.save();
|
||||
res.status(200).json({ message: "La fonction a bien été modifié!", result });
|
||||
resultFunction.title = title
|
||||
resultFunction.slug = slug
|
||||
resultFunction.description = description
|
||||
resultFunction.type = type
|
||||
resultFunction.categorieId = categorieId
|
||||
resultFunction.isOnline = isOnline
|
||||
if (imageName) {
|
||||
resultFunction.image = `/images/functions/${imageName}`
|
||||
}
|
||||
const result = await resultFunction.save()
|
||||
res.status(200).json({ message: 'La fonction a bien été modifié!', result })
|
||||
}
|
||||
|
||||
exports.getFunctions = async (req, res, next) => {
|
||||
const categoryId = helperQueryNumber(req.query.categoryId, 0);
|
||||
let search = req.query.search;
|
||||
try { search = search.toLowerCase(); } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
// Trie par catégorie
|
||||
... (categoryId !== 0) && { categorieId: categoryId },
|
||||
// Recherche
|
||||
... (search != undefined) && {
|
||||
[Sequelize.Op.or]: [
|
||||
{ title: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('title')), 'LIKE', `%${search}%`) },
|
||||
{ slug: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('slug')), 'LIKE', `%${search}%`) },
|
||||
{ description: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('description')), 'LIKE', `%${search}%`) }
|
||||
]
|
||||
}
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ["name", "color"] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "utilizationForm", "article", "isOnline"]
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Functions, options);
|
||||
const categoryId = helperQueryNumber(req.query.categoryId, 0)
|
||||
let search = req.query.search
|
||||
try { search = search.toLowerCase() } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
// Trie par catégorie
|
||||
...(categoryId !== 0) && { categorieId: categoryId },
|
||||
// Recherche
|
||||
...(search != null) && {
|
||||
[Sequelize.Op.or]: [
|
||||
{ title: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('title')), 'LIKE', `%${search}%`) },
|
||||
{ slug: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('slug')), 'LIKE', `%${search}%`) },
|
||||
{ description: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('description')), 'LIKE', `%${search}%`) }
|
||||
]
|
||||
}
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ['name', 'color'] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'utilizationForm', 'article', 'isOnline']
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Functions, options)
|
||||
}
|
||||
|
||||
exports.getFunctionBySlug = (req, res, next) => {
|
||||
const { slug } = req.params;
|
||||
Functions.findOne({
|
||||
where: { slug },
|
||||
include: [
|
||||
{ model: Categories, attributes: ["name", "color"] }
|
||||
]
|
||||
const { slug } = req.params
|
||||
Functions.findOne({
|
||||
where: { slug },
|
||||
include: [
|
||||
{ model: Categories, attributes: ['name', 'color'] }
|
||||
]
|
||||
})
|
||||
.then((result) => {
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
try { result.utilizationForm = JSON.parse(result.utilizationForm) } catch {}
|
||||
return res.status(200).json(result)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
})
|
||||
.then((result) => {
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
try { result.utilizationForm = JSON.parse(result.utilizationForm); } catch {}
|
||||
return res.status(200).json(result);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
});
|
||||
}
|
||||
|
||||
exports.postFunction = (req, res, next) => {
|
||||
const { title, slug, description, type, categorieId } = req.body;
|
||||
const image = req.files.image;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
}
|
||||
if (!image || image.truncated && (
|
||||
image.mimetype !== 'image/png' ||
|
||||
image.mimetype !== 'image/jpg' ||
|
||||
const { title, slug, description, type, categorieId } = req.body
|
||||
const image = req.files.image
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
if ((!image || image.truncated) && (
|
||||
image.mimetype !== 'image/png' ||
|
||||
image.mimetype !== 'image/jpg' ||
|
||||
image.mimetype !== 'image/jpeg'
|
||||
)) {
|
||||
return errorHandling(next, { message:"La fonction doit avoir une image valide.", statusCode: 400 });
|
||||
)) {
|
||||
return errorHandling(next, { message: 'La fonction doit avoir une image valide.', statusCode: 400 })
|
||||
}
|
||||
const splitedImageName = image.name.split('.')
|
||||
if (splitedImageName.length !== 2) return errorHandling(next, serverError)
|
||||
const imageName = slug + '.' + splitedImageName[1]
|
||||
image.mv(path.join(__dirname, '..', 'assets', 'images', 'functions') + '/' + imageName, async (error) => {
|
||||
if (error) return errorHandling(next, serverError)
|
||||
try {
|
||||
const result = await Functions.create({ title, slug, description, type, categorieId, image: `/images/functions/${imageName}` })
|
||||
return res.status(201).json({ message: 'La fonction a été correctement ajouté!', result })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
const splitedImageName = image.name.split('.');
|
||||
if (splitedImageName.length !== 2) return errorHandling(next, serverError);
|
||||
const imageName = slug + '.' + splitedImageName[1];
|
||||
image.mv(path.join(__dirname, '..', 'assets', 'images', 'functions') + '/' + imageName, async (error) => {
|
||||
if (error) return errorHandling(next, serverError);
|
||||
try {
|
||||
const result = await Functions.create({ title, slug, description, type, categorieId, image: `/images/functions/${imageName}` });
|
||||
return res.status(201).json({ message: "La fonction a été correctement ajouté!", result });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
exports.putFunction = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
const { title, slug, description, type, categorieId, isOnline } = req.body;
|
||||
const image = req.files.image;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
const { id } = req.params
|
||||
const { title, slug, description, type, categorieId, isOnline } = req.body
|
||||
const image = req.files.image
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
|
||||
// Vérifie si le slug existe déjà
|
||||
const FunctionSlug = await Functions.findOne({ where: { slug } });
|
||||
if (!FunctionSlug && FunctionSlug.id != resultFunction.id) {
|
||||
return errorHandling(next, { message: "Le slug existe déjà...", statusCode: 404 });
|
||||
}
|
||||
// Vérifie si le slug existe déjà
|
||||
const FunctionSlug = await Functions.findOne({ where: { slug } })
|
||||
if (!FunctionSlug && FunctionSlug.id !== resultFunction.id) {
|
||||
return errorHandling(next, { message: 'Le slug existe déjà...', statusCode: 404 })
|
||||
}
|
||||
|
||||
// Sauvegarde de la fonction
|
||||
if (image != undefined) {
|
||||
if (image.truncated && (
|
||||
image.mimetype !== 'image/png' ||
|
||||
image.mimetype !== 'image/jpg' ||
|
||||
// Sauvegarde de la fonction
|
||||
if (image != null) {
|
||||
if (image.truncated && (
|
||||
image.mimetype !== 'image/png' ||
|
||||
image.mimetype !== 'image/jpg' ||
|
||||
image.mimetype !== 'image/jpeg'
|
||||
)) {
|
||||
return errorHandling(next, { message:"La fonction doit avoir une image valide.", statusCode: 400 });
|
||||
}
|
||||
const splitedImageName = image.name.split('.');
|
||||
if (splitedImageName.length !== 2) return errorHandling(next, serverError);
|
||||
const imageName = slug + '.' + splitedImageName[1];
|
||||
// Supprime les anciennes images
|
||||
const functionPath = path.join(__dirname, '..', 'assets', 'images', 'functions');
|
||||
deleteFilesNameStartWith(slug, functionPath, () => {
|
||||
image.mv(path.join(functionPath, imageName), async (error) => {
|
||||
if (error) return errorHandling(next, serverError);
|
||||
return await handleEditFunction(res, resultFunction, { title, slug, description, type, categorieId, isOnline }, imageName);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return await handleEditFunction(res, resultFunction, { title, slug, description, type, categorieId, isOnline });
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
)) {
|
||||
return errorHandling(next, { message: 'La fonction doit avoir une image valide.', statusCode: 400 })
|
||||
}
|
||||
const splitedImageName = image.name.split('.')
|
||||
if (splitedImageName.length !== 2) return errorHandling(next, serverError)
|
||||
const imageName = slug + '.' + splitedImageName[1]
|
||||
// Supprime les anciennes images
|
||||
const functionPath = path.join(__dirname, '..', 'assets', 'images', 'functions')
|
||||
deleteFilesNameStartWith(slug, functionPath, () => {
|
||||
image.mv(path.join(functionPath, imageName), async (error) => {
|
||||
if (error) return errorHandling(next, serverError)
|
||||
return await handleEditFunction(res, resultFunction, { title, slug, description, type, categorieId, isOnline }, imageName)
|
||||
})
|
||||
})
|
||||
} else {
|
||||
return await handleEditFunction(res, resultFunction, { title, slug, description, type, categorieId, isOnline })
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.putFunctionArticle = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
const { article } = req.body;
|
||||
const { id } = req.params
|
||||
const { article } = req.body
|
||||
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
resultFunction.article = article;
|
||||
const result = await resultFunction.save();
|
||||
return res.status(200).json(result);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
resultFunction.article = article
|
||||
const result = await resultFunction.save()
|
||||
return res.status(200).json(result)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.putFunctionForm = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
const { form } = req.body;
|
||||
const { id } = req.params
|
||||
const { form } = req.body
|
||||
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
resultFunction.utilizationForm = JSON.stringify(form);
|
||||
const result = await resultFunction.save();
|
||||
return res.status(200).json(result);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
try {
|
||||
// Vérifie si la fonction existe
|
||||
const resultFunction = await Functions.findOne({ where: { id } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
resultFunction.utilizationForm = JSON.stringify(form)
|
||||
const result = await resultFunction.save()
|
||||
return res.status(200).json(result)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.deleteFunction = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
try {
|
||||
const result = await Functions.findOne({ where: { id } });
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
if (result.image !== "/images/functions/default.png") {
|
||||
const filePath = path.join(__dirname, '..', 'assets', result.image);
|
||||
fs.unlinkSync(filePath); // supprime le fichier
|
||||
}
|
||||
await result.destroy();
|
||||
res.status(200).json({ message: "La fonction a été correctement supprimé!"});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { id } = req.params
|
||||
try {
|
||||
const result = await Functions.findOne({ where: { id } })
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
if (result.image !== '/images/functions/default.png') {
|
||||
const filePath = path.join(__dirname, '..', 'assets', result.image)
|
||||
fs.unlinkSync(filePath) // supprime le fichier
|
||||
}
|
||||
await result.destroy()
|
||||
res.status(200).json({ message: 'La fonction a été correctement supprimé!' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.postCategory = async (req, res, next) => {
|
||||
const { name, color } = req.body;
|
||||
if (!(name && color)) {
|
||||
return errorHandling(next, { message: "La catégorie doit avoir un nom et une couleur." });
|
||||
}
|
||||
try {
|
||||
const result = await Categories.create({ name, color });
|
||||
return res.status(201).json({ message: "La catégorie a bien été crée!", result });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
const { name, color } = req.body
|
||||
if (!(name && color)) {
|
||||
return errorHandling(next, { message: 'La catégorie doit avoir un nom et une couleur.' })
|
||||
}
|
||||
try {
|
||||
const result = await Categories.create({ name, color })
|
||||
return res.status(201).json({ message: 'La catégorie a bien été crée!', result })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.putCategory = async (req, res, next) => {
|
||||
const { name, color } = req.body;
|
||||
const { id } = req.params;
|
||||
if (!(name && color && id)) {
|
||||
return errorHandling(next, { message: "La catégorie doit avoir un nom, une couleur et un id." });
|
||||
}
|
||||
try {
|
||||
const category = await Categories.findOne({ where: { id } });
|
||||
if (!category) {
|
||||
return errorHandling(next, { message: "La catégorie n'existe pas." });
|
||||
}
|
||||
category.name = name;
|
||||
category.color = color;
|
||||
const result = await category.save();
|
||||
return res.status(200).json({ message: "La catégorie a bien été modifiée!", result });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { name, color } = req.body
|
||||
const { id } = req.params
|
||||
if (!(name && color && id)) {
|
||||
return errorHandling(next, { message: 'La catégorie doit avoir un nom, une couleur et un id.' })
|
||||
}
|
||||
try {
|
||||
const category = await Categories.findOne({ where: { id } })
|
||||
if (!category) {
|
||||
return errorHandling(next, { message: "La catégorie n'existe pas." })
|
||||
}
|
||||
category.name = name
|
||||
category.color = color
|
||||
const result = await category.save()
|
||||
return res.status(200).json({ message: 'La catégorie a bien été modifiée!', result })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.deleteCategory = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
try {
|
||||
const category = await Categories.findOne({ where: { id } });
|
||||
if (!category) {
|
||||
return errorHandling(next, { message: "La catégorie n'existe pas." });
|
||||
}
|
||||
await category.destroy();
|
||||
return res.status(200).json({ message: "La catégorie a bien été supprimée!" });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { id } = req.params
|
||||
try {
|
||||
const category = await Categories.findOne({ where: { id } })
|
||||
if (!category) {
|
||||
return errorHandling(next, { message: "La catégorie n'existe pas." })
|
||||
}
|
||||
await category.destroy()
|
||||
return res.status(200).json({ message: 'La catégorie a bien été supprimée!' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.getQuotes = async (req, res, next) => {
|
||||
const options = {
|
||||
where: {
|
||||
isValidated: 0,
|
||||
},
|
||||
include: [
|
||||
{ model: Users, attributes: ["name", "logo"] }
|
||||
],
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Quotes, options);
|
||||
const options = {
|
||||
where: {
|
||||
isValidated: 0
|
||||
},
|
||||
include: [
|
||||
{ model: Users, attributes: ['name', 'logo'] }
|
||||
],
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Quotes, options)
|
||||
}
|
||||
|
||||
exports.putQuote = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
const { isValid } = req.body;
|
||||
try {
|
||||
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
|
||||
},
|
||||
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;
|
||||
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);
|
||||
const { id } = req.params
|
||||
const { isValid } = req.body
|
||||
try {
|
||||
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
|
||||
},
|
||||
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
|
||||
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,14 +1,14 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const Categories = require('../models/categories');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const Categories = require('../models/categories')
|
||||
const { serverError } = require('../assets/config/errors')
|
||||
|
||||
exports.getCategories = (_req, res, next) => {
|
||||
Categories.findAll()
|
||||
.then((result) => {
|
||||
res.status(200).json(result);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
});
|
||||
}
|
||||
Categories.findAll()
|
||||
.then((result) => {
|
||||
res.status(200).json(result)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
})
|
||||
}
|
||||
|
@ -1,72 +1,72 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const Comments = require('../models/comments');
|
||||
const Users = require('../models/users');
|
||||
const Functions = require('../models/functions');
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const Comments = require('../models/comments')
|
||||
const Users = require('../models/users')
|
||||
const Functions = require('../models/functions')
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper')
|
||||
const { serverError } = require('../assets/config/errors')
|
||||
|
||||
exports.getCommentsByFunctionId = async (req, res, next) => {
|
||||
const { functionId } = req.params;
|
||||
const options = {
|
||||
where: { functionId },
|
||||
include: [
|
||||
{ model: Users, attributes: ["name", "logo"] }
|
||||
],
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Comments, options);
|
||||
const { functionId } = req.params
|
||||
const options = {
|
||||
where: { functionId },
|
||||
include: [
|
||||
{ model: Users, attributes: ['name', 'logo'] }
|
||||
],
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Comments, options)
|
||||
}
|
||||
|
||||
exports.postCommentsByFunctionId = async (req, res, next) => {
|
||||
const { functionId } = req.params;
|
||||
const { message } = req.body;
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
if (!message) {
|
||||
return errorHandling(next, { message: "Vous ne pouvez pas poster de commentaire vide.", statusCode: 400 });
|
||||
}
|
||||
const comment = await Comments.create({ message, userId: req.userId, functionId });
|
||||
return res.status(201).json(comment);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { functionId } = req.params
|
||||
const { message } = req.body
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
if (!message) {
|
||||
return errorHandling(next, { message: 'Vous ne pouvez pas poster de commentaire vide.', statusCode: 400 })
|
||||
}
|
||||
const comment = await Comments.create({ message, userId: req.userId, functionId })
|
||||
return res.status(201).json(comment)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.deleteCommentById = async (req, res, next) => {
|
||||
const { commentId } = req.params;
|
||||
try {
|
||||
const comment = await Comments.findOne({ where: { userId: req.userId, id: parseInt(commentId) } });
|
||||
if (!comment) {
|
||||
return errorHandling(next, { message: "Le commentaire n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
await comment.destroy();
|
||||
return res.status(200).json({ message: "Le commentaire a bien été supprimé." });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { commentId } = req.params
|
||||
try {
|
||||
const comment = await Comments.findOne({ where: { userId: req.userId, id: parseInt(commentId) } })
|
||||
if (!comment) {
|
||||
return errorHandling(next, { message: "Le commentaire n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
await comment.destroy()
|
||||
return res.status(200).json({ message: 'Le commentaire a bien été supprimé.' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.putCommentsById = async (req, res, next) => {
|
||||
const { commentId } = req.params;
|
||||
const { message } = req.body;
|
||||
if (!message) {
|
||||
return errorHandling(next, { message: "Vous ne pouvez pas poster de commentaire vide.", statusCode: 400 });
|
||||
const { commentId } = req.params
|
||||
const { message } = req.body
|
||||
if (!message) {
|
||||
return errorHandling(next, { message: 'Vous ne pouvez pas poster de commentaire vide.', statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const comment = await Comments.findOne({ where: { userId: req.userId, id: parseInt(commentId) } })
|
||||
if (!comment) {
|
||||
return errorHandling(next, { message: "Le commentaire n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
try {
|
||||
const comment = await Comments.findOne({ where: { userId: req.userId, id: parseInt(commentId) } });
|
||||
if (!comment) {
|
||||
return errorHandling(next, { message: "Le commentaire n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
comment.message = message;
|
||||
await comment.save();
|
||||
return res.status(200).json({ message: "Le commentaire a bien été modifié." });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
}
|
||||
comment.message = message
|
||||
await comment.save()
|
||||
return res.status(200).json({ message: 'Le commentaire a bien été modifié.' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
@ -1,74 +1,74 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const Favorites = require('../models/favorites');
|
||||
const Functions = require('../models/functions');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const { serverError } = require('../assets/config/errors')
|
||||
const Favorites = require('../models/favorites')
|
||||
const Functions = require('../models/functions')
|
||||
|
||||
exports.getFavoriteByFunctionId = async (req, res, next) => {
|
||||
const { functionId } = req.params;
|
||||
const { userId } = req;
|
||||
try {
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
});
|
||||
if (!favorite) {
|
||||
return res.status(200).json({ isFavorite: false });
|
||||
}
|
||||
return res.status(200).json({ isFavorite: true });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { functionId } = req.params
|
||||
const { userId } = req
|
||||
try {
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
})
|
||||
if (!favorite) {
|
||||
return res.status(200).json({ isFavorite: false })
|
||||
}
|
||||
return res.status(200).json({ isFavorite: true })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.postFavoriteByFunctionId = async (req, res, next) => {
|
||||
const { functionId } = req.params;
|
||||
const { userId } = req;
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
});
|
||||
if (!favorite) {
|
||||
await Favorites.create({ userId, functionId });
|
||||
return res.status(201).json({ result: "Le favoris a bien été ajouté!" });
|
||||
}
|
||||
return errorHandling(next, { message: "La fonction est déjà en favoris.", statusCode: 400 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { functionId } = req.params
|
||||
const { userId } = req
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
})
|
||||
if (!favorite) {
|
||||
await Favorites.create({ userId, functionId })
|
||||
return res.status(201).json({ result: 'Le favoris a bien été ajouté!' })
|
||||
}
|
||||
return errorHandling(next, { message: 'La fonction est déjà en favoris.', statusCode: 400 })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.deleteFavoriteByFunctionId = async (req, res, next) => {
|
||||
const { functionId } = req.params;
|
||||
const { userId } = req;
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } });
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
});
|
||||
if (!favorite) {
|
||||
return errorHandling(next, { message: "Le fonction n'est pas en favoris.", statusCode: 400 });
|
||||
}
|
||||
await favorite.destroy();
|
||||
return res.status(200).json({ message: "Le fonction a bien été supprimé des favoris." });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { functionId } = req.params
|
||||
const { userId } = req
|
||||
try {
|
||||
const resultFunction = await Functions.findOne({ where: { id: functionId } })
|
||||
if (!resultFunction) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
}
|
||||
const favorite = await Favorites.findOne({
|
||||
where: {
|
||||
userId,
|
||||
functionId
|
||||
}
|
||||
})
|
||||
if (!favorite) {
|
||||
return errorHandling(next, { message: "Le fonction n'est pas en favoris.", statusCode: 400 })
|
||||
}
|
||||
await favorite.destroy()
|
||||
return res.status(200).json({ message: 'Le fonction a bien été supprimé des favoris.' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
@ -1,69 +1,69 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError } = require('../assets/config/errors');
|
||||
const Functions = require('../models/functions');
|
||||
const Categories = require('../models/categories');
|
||||
const functionToExecute = require('../assets/functions/functionObject');
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber');
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper');
|
||||
const Sequelize = require('sequelize');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const { serverError } = require('../assets/config/errors')
|
||||
const Functions = require('../models/functions')
|
||||
const Categories = require('../models/categories')
|
||||
const functionToExecute = require('../assets/functions/functionObject')
|
||||
const helperQueryNumber = require('../assets/utils/helperQueryNumber')
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper')
|
||||
const Sequelize = require('sequelize')
|
||||
|
||||
exports.getFunctions = async (req, res, next) => {
|
||||
const categoryId = helperQueryNumber(req.query.categoryId, 0);
|
||||
let { search } = req.query;
|
||||
try { search = search.toLowerCase(); } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
isOnline: 1,
|
||||
// Trie par catégorie
|
||||
... (categoryId !== 0) && { categorieId: categoryId },
|
||||
// Recherche
|
||||
... (search != undefined) && {
|
||||
[Sequelize.Op.or]: [
|
||||
{ title: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('title')), 'LIKE', `%${search}%`) },
|
||||
{ slug: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('slug')), 'LIKE', `%${search}%`) },
|
||||
{ description: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('description')), 'LIKE', `%${search}%`) }
|
||||
]
|
||||
}
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ["name", "color"] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "utilizationForm", "article", "isOnline"]
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Functions, options);
|
||||
const categoryId = helperQueryNumber(req.query.categoryId, 0)
|
||||
let { search } = req.query
|
||||
try { search = search.toLowerCase() } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
isOnline: 1,
|
||||
// Trie par catégorie
|
||||
...(categoryId !== 0) && { categorieId: categoryId },
|
||||
// Recherche
|
||||
...(search != null) && {
|
||||
[Sequelize.Op.or]: [
|
||||
{ title: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('title')), 'LIKE', `%${search}%`) },
|
||||
{ slug: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('slug')), 'LIKE', `%${search}%`) },
|
||||
{ description: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('description')), 'LIKE', `%${search}%`) }
|
||||
]
|
||||
}
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ['name', 'color'] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'utilizationForm', 'article', 'isOnline']
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Functions, options)
|
||||
}
|
||||
|
||||
exports.getFunctionBySlug = (req, res, next) => {
|
||||
const { slug } = req.params;
|
||||
Functions.findOne({
|
||||
where: { slug, isOnline: 1 },
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "isOnline"]
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ["name", "color"] }
|
||||
]
|
||||
const { slug } = req.params
|
||||
Functions.findOne({
|
||||
where: { slug, isOnline: 1 },
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'isOnline']
|
||||
},
|
||||
include: [
|
||||
{ model: Categories, attributes: ['name', 'color'] }
|
||||
]
|
||||
})
|
||||
.then((result) => {
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
try { result.utilizationForm = JSON.parse(result.utilizationForm) } catch {}
|
||||
return res.status(200).json(result)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
})
|
||||
.then((result) => {
|
||||
if (!result) {
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
try { result.utilizationForm = JSON.parse(result.utilizationForm); } catch {}
|
||||
return res.status(200).json(result);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
});
|
||||
}
|
||||
|
||||
exports.executeFunctionBySlug = (req, res, next) => {
|
||||
const functionOutput = functionToExecute(req.params.slug);
|
||||
if (functionOutput !== undefined) {
|
||||
return functionOutput({ res, next }, req.body);
|
||||
}
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
const functionOutput = functionToExecute(req.params.slug)
|
||||
if (functionOutput !== undefined) {
|
||||
return functionOutput({ res, next }, req.body)
|
||||
}
|
||||
return errorHandling(next, { message: "La fonction n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
|
@ -1,37 +1,37 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError, requiredFields } = require('../assets/config/errors');
|
||||
const Quotes = require('../models/quotes');
|
||||
const Users = require('../models/users');
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const { serverError, requiredFields } = require('../assets/config/errors')
|
||||
const Quotes = require('../models/quotes')
|
||||
const Users = require('../models/users')
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper')
|
||||
|
||||
exports.getQuotes = async (req, res, next) => {
|
||||
const options = {
|
||||
where: {
|
||||
isValidated: 1,
|
||||
},
|
||||
include: [
|
||||
{ model: Users, attributes: ["name", "logo"] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ["isValidated"]
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Quotes, options);
|
||||
const options = {
|
||||
where: {
|
||||
isValidated: 1
|
||||
},
|
||||
include: [
|
||||
{ model: Users, attributes: ['name', 'logo'] }
|
||||
],
|
||||
attributes: {
|
||||
exclude: ['isValidated']
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Quotes, options)
|
||||
}
|
||||
|
||||
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." });
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
});
|
||||
}
|
||||
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." })
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
})
|
||||
}
|
||||
|
@ -1,68 +1,68 @@
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
const { serverError, requiredFields } = require('../assets/config/errors');
|
||||
const Tasks = require('../models/tasks');
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
const { serverError, requiredFields } = require('../assets/config/errors')
|
||||
const Tasks = require('../models/tasks')
|
||||
|
||||
exports.getTasks = async (req, res, next) => {
|
||||
try {
|
||||
const tasks = await Tasks.findAll({
|
||||
where: {
|
||||
userId: req.userId
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
});
|
||||
return res.status(200).json(tasks);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
try {
|
||||
const tasks = await Tasks.findAll({
|
||||
where: {
|
||||
userId: req.userId
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
})
|
||||
return res.status(200).json(tasks)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.postTask = async (req, res, next) => {
|
||||
const { task } = req.body;
|
||||
try {
|
||||
if (!task) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
const taskResult = await Tasks.create({ task, userId: req.userId });
|
||||
return res.status(201).json(taskResult);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { task } = req.body
|
||||
try {
|
||||
if (!task) {
|
||||
return errorHandling(next, requiredFields)
|
||||
}
|
||||
const taskResult = await Tasks.create({ task, userId: req.userId })
|
||||
return res.status(201).json(taskResult)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.putTask = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
const { isCompleted } = req.body;
|
||||
try {
|
||||
if (typeof isCompleted !== 'boolean') {
|
||||
return errorHandling(next, { message: "isCompleted doit être un booléen.", statusCode: 400 });
|
||||
}
|
||||
|
||||
const taskResult = await Tasks.findOne({ where: { id, userId: req.userId } });
|
||||
if (!taskResult) {
|
||||
return errorHandling(next, { message: `La "tâche à faire" n'existe pas.`, statusCode: 404 });
|
||||
}
|
||||
taskResult.isCompleted = isCompleted;
|
||||
const taskSaved = await taskResult.save();
|
||||
return res.status(200).json(taskSaved);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { id } = req.params
|
||||
const { isCompleted } = req.body
|
||||
try {
|
||||
if (typeof isCompleted !== 'boolean') {
|
||||
return errorHandling(next, { message: 'isCompleted doit être un booléen.', statusCode: 400 })
|
||||
}
|
||||
|
||||
const taskResult = await Tasks.findOne({ where: { id, userId: req.userId } })
|
||||
if (!taskResult) {
|
||||
return errorHandling(next, { message: 'La "tâche à faire" n\'existe pas.', statusCode: 404 })
|
||||
}
|
||||
taskResult.isCompleted = isCompleted
|
||||
const taskSaved = await taskResult.save()
|
||||
return res.status(200).json(taskSaved)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.deleteTask = async (req, res, next) => {
|
||||
const { id } = req.params;
|
||||
try {
|
||||
const taskResult = await Tasks.findOne({ where: { id, userId: req.userId } });
|
||||
if (!taskResult) {
|
||||
return errorHandling(next, { message: `La "tâche à faire" n'existe pas.`, statusCode: 404 });
|
||||
}
|
||||
await taskResult.destroy();
|
||||
return res.status(200).json({ message: `La "tâche à faire" a bien été supprimée!` });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { id } = req.params
|
||||
try {
|
||||
const taskResult = await Tasks.findOne({ where: { id, userId: req.userId } })
|
||||
if (!taskResult) {
|
||||
return errorHandling(next, { message: 'La "tâche à faire" n\'existe pas.', statusCode: 404 })
|
||||
}
|
||||
}
|
||||
await taskResult.destroy()
|
||||
return res.status(200).json({ message: 'La "tâche à faire" a bien été supprimée!' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
@ -1,292 +1,292 @@
|
||||
const path = require('path');
|
||||
const { validationResult } = require('express-validator');
|
||||
const bcrypt = require('bcryptjs');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const ms = require('ms');
|
||||
const uuid = require('uuid');
|
||||
const Sequelize = require('sequelize');
|
||||
const errorHandling = require('../assets/utils/errorHandling');
|
||||
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 { emailUserTemplate } = require('../assets/config/emails');
|
||||
const Users = require('../models/users');
|
||||
const Favorites = require('../models/favorites');
|
||||
const Functions = require('../models/functions');
|
||||
const Categories = require('../models/categories');
|
||||
const Comments = require('../models/comments');
|
||||
const Quotes = require('../models/quotes');
|
||||
const deleteFilesNameStartWith = require('../assets/utils/deleteFilesNameStartWith');
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper');
|
||||
const path = require('path')
|
||||
const { validationResult } = require('express-validator')
|
||||
const bcrypt = require('bcryptjs')
|
||||
const jwt = require('jsonwebtoken')
|
||||
const ms = require('ms')
|
||||
const uuid = require('uuid')
|
||||
const Sequelize = require('sequelize')
|
||||
const errorHandling = require('../assets/utils/errorHandling')
|
||||
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 { emailUserTemplate } = require('../assets/config/emails')
|
||||
const Users = require('../models/users')
|
||||
const Favorites = require('../models/favorites')
|
||||
const Functions = require('../models/functions')
|
||||
const Categories = require('../models/categories')
|
||||
const Comments = require('../models/comments')
|
||||
const Quotes = require('../models/quotes')
|
||||
const deleteFilesNameStartWith = require('../assets/utils/deleteFilesNameStartWith')
|
||||
const getPagesHelper = require('../assets/utils/getPagesHelper')
|
||||
|
||||
async function handleEditUser(res, { name, email, biography, isPublicEmail }, userId, logoName) {
|
||||
const user = await Users.findOne({ where: { id: userId } });
|
||||
user.name = name;
|
||||
if (user.email !== email) {
|
||||
const tempToken = uuid.v4();
|
||||
user.email = email;
|
||||
user.isConfirmed = false;
|
||||
user.tempToken = tempToken;
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'email",
|
||||
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) {
|
||||
user.biography = biography;
|
||||
}
|
||||
user.isPublicEmail = isPublicEmail;
|
||||
if (logoName != undefined && `/images/users/${logoName}` !== user.logo) {
|
||||
user.logo = `/images/users/${logoName}`;
|
||||
}
|
||||
await user.save();
|
||||
return res.status(200).json({ id: user.id, name: user.name, email: user.email, biography: user.biography, logo: user.logo, isPublicEmail: user.isPublicEmail, isAdmin: user.isAdmin, createdAt: user.createdAt });
|
||||
async function handleEditUser (res, { name, email, biography, isPublicEmail }, userId, logoName) {
|
||||
const user = await Users.findOne({ where: { id: userId } })
|
||||
user.name = name
|
||||
if (user.email !== email) {
|
||||
const tempToken = uuid.v4()
|
||||
user.email = email
|
||||
user.isConfirmed = false
|
||||
user.tempToken = tempToken
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'email",
|
||||
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 != null) {
|
||||
user.biography = biography
|
||||
}
|
||||
user.isPublicEmail = isPublicEmail
|
||||
if (logoName != null && `/images/users/${logoName}` !== user.logo) {
|
||||
user.logo = `/images/users/${logoName}`
|
||||
}
|
||||
await user.save()
|
||||
return res.status(200).json({ id: user.id, name: user.name, email: user.email, biography: user.biography, logo: user.logo, isPublicEmail: user.isPublicEmail, isAdmin: user.isAdmin, createdAt: user.createdAt })
|
||||
}
|
||||
|
||||
exports.getUsers = async (req, res, next) => {
|
||||
let { search } = req.query;
|
||||
try { search = search.toLowerCase(); } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
isConfirmed: true,
|
||||
// Recherche
|
||||
...(search != undefined) && {
|
||||
name: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('name')), 'LIKE', `%${search}%`)
|
||||
}
|
||||
},
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "isAdmin", "isConfirmed", "password", "tempToken", "tempExpirationToken", "isPublicEmail", "email"]
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
};
|
||||
return await getPagesHelper({ req, res, next }, Users, options);
|
||||
let { search } = req.query
|
||||
try { search = search.toLowerCase() } catch {};
|
||||
const options = {
|
||||
where: {
|
||||
isConfirmed: true,
|
||||
// Recherche
|
||||
...(search != null) && {
|
||||
name: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('name')), 'LIKE', `%${search}%`)
|
||||
}
|
||||
},
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'isAdmin', 'isConfirmed', 'password', 'tempToken', 'tempExpirationToken', 'isPublicEmail', 'email']
|
||||
},
|
||||
order: [['createdAt', 'DESC']]
|
||||
}
|
||||
return await getPagesHelper({ req, res, next }, Users, options)
|
||||
}
|
||||
|
||||
exports.putUser = async (req, res, next) => {
|
||||
const { name, email, biography, isPublicEmail } = req.body;
|
||||
const logo = req.files.logo;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
}
|
||||
if (logo != undefined) {
|
||||
if (!logo || logo.truncated && (
|
||||
logo.mimetype !== 'image/png' ||
|
||||
logo.mimetype !== 'image/jpg' ||
|
||||
const { name, email, biography, isPublicEmail } = req.body
|
||||
const logo = req.files.logo
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
if (logo != null) {
|
||||
if ((!logo || logo.truncated) && (
|
||||
logo.mimetype !== 'image/png' ||
|
||||
logo.mimetype !== 'image/jpg' ||
|
||||
logo.mimetype !== 'image/jpeg' ||
|
||||
logo.mimetype !== 'image/gif'
|
||||
)) {
|
||||
return errorHandling(next, { message:"Le profil doit avoir une image valide (PNG, JPG, GIF) et moins de 5mo.", statusCode: 400 });
|
||||
}
|
||||
const splitedLogoName = logo.name.split('.');
|
||||
if (splitedLogoName.length !== 2) return errorHandling(next, serverError);
|
||||
const logoName = name + req.userId + '.' + splitedLogoName[1];
|
||||
// Supprime les anciens logo
|
||||
try {
|
||||
deleteFilesNameStartWith(`${name + req.userId}`, path.join(__dirname, '..', 'assets', 'images', 'users'), async () => {
|
||||
logo.mv(path.join(__dirname, '..', 'assets', 'images', 'users', logoName), async (error) => {
|
||||
if (error) return errorHandling(next, serverError);
|
||||
return await handleEditUser(res, { name, email, biography, isPublicEmail }, req.userId, logoName);
|
||||
});
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
return await handleEditUser(res, { name, email, biography, isPublicEmail }, req.userId, null);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
)) {
|
||||
return errorHandling(next, { message: 'Le profil doit avoir une image valide (PNG, JPG, GIF) et moins de 5mo.', statusCode: 400 })
|
||||
}
|
||||
const splitedLogoName = logo.name.split('.')
|
||||
if (splitedLogoName.length !== 2) return errorHandling(next, serverError)
|
||||
const logoName = name + req.userId + '.' + splitedLogoName[1]
|
||||
// Supprime les anciens logo
|
||||
try {
|
||||
deleteFilesNameStartWith(`${name + req.userId}`, path.join(__dirname, '..', 'assets', 'images', 'users'), async () => {
|
||||
logo.mv(path.join(__dirname, '..', 'assets', 'images', 'users', logoName), async (error) => {
|
||||
if (error) return errorHandling(next, serverError)
|
||||
return await handleEditUser(res, { name, email, biography, isPublicEmail }, req.userId, logoName)
|
||||
})
|
||||
})
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
return await handleEditUser(res, { name, email, biography, isPublicEmail }, req.userId, null)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.register = async (req, res, next) => {
|
||||
const { name, email, password } = req.body;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
}
|
||||
try {
|
||||
const hashedPassword = await bcrypt.hash(password, 12);
|
||||
const tempToken = uuid.v4();
|
||||
await Users.create({ email, name, password: hashedPassword, tempToken });
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'inscription",
|
||||
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) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
}
|
||||
const { name, email, password } = req.body
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const hashedPassword = await bcrypt.hash(password, 12)
|
||||
const tempToken = uuid.v4()
|
||||
await Users.create({ email, name, password: hashedPassword, tempToken })
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Confirmer l'inscription",
|
||||
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) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.login = async (req, res, next) => {
|
||||
const { email, password } = req.body;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
const { email, password } = req.body
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { email } })
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "Le mot de passe ou l'adresse email n'est pas valide.", statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { email } });
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "Le mot de passe ou l'adresse email n'est pas valide.", statusCode: 400 });
|
||||
}
|
||||
const isEqual = await bcrypt.compare(password, user.password);
|
||||
if (!isEqual) {
|
||||
return errorHandling(next, { message: "Le mot de passe ou l'adresse email n'est pas valide.", statusCode: 400 });
|
||||
}
|
||||
if (!user.isConfirmed) {
|
||||
return errorHandling(next, { message: "Vous devez valider votre adresse email pour votre première connexion.", statusCode: 400 });
|
||||
}
|
||||
const token = jwt.sign({
|
||||
email: user.email, userId: user.id
|
||||
}, JWT_SECRET, { expiresIn: TOKEN_LIFE });
|
||||
return res.status(200).json({ token, id: user.id, name: user.name, email: user.email, biography: user.biography, logo: user.logo, isPublicEmail: user.isPublicEmail, isAdmin: user.isAdmin, createdAt: user.createdAt, expiresIn: Math.round(ms(TOKEN_LIFE) / 1000) });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const isEqual = await bcrypt.compare(password, user.password)
|
||||
if (!isEqual) {
|
||||
return errorHandling(next, { message: "Le mot de passe ou l'adresse email n'est pas valide.", statusCode: 400 })
|
||||
}
|
||||
if (!user.isConfirmed) {
|
||||
return errorHandling(next, { message: 'Vous devez valider votre adresse email pour votre première connexion.', statusCode: 400 })
|
||||
}
|
||||
const token = jwt.sign({
|
||||
email: user.email, userId: user.id
|
||||
}, JWT_SECRET, { expiresIn: TOKEN_LIFE })
|
||||
return res.status(200).json({ token, id: user.id, name: user.name, email: user.email, biography: user.biography, logo: user.logo, isPublicEmail: user.isPublicEmail, isAdmin: user.isAdmin, createdAt: user.createdAt, expiresIn: Math.round(ms(TOKEN_LIFE) / 1000) })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.confirmEmail = async (req, res, next) => {
|
||||
const { tempToken } = req.params;
|
||||
if (!tempToken) {
|
||||
return errorHandling(next, generalError);
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { tempToken, isConfirmed: false } });
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "Le token n'est pas valide.", statusCode: 400 });
|
||||
}
|
||||
user.tempToken = null;
|
||||
user.isConfirmed = true;
|
||||
await user.save();
|
||||
return res.redirect(`${FRONT_END_HOST}/users/login?isConfirmed=true`);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { tempToken } = req.params
|
||||
if (!tempToken) {
|
||||
return errorHandling(next, generalError)
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { tempToken, isConfirmed: false } })
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "Le token n'est pas valide.", statusCode: 400 })
|
||||
}
|
||||
user.tempToken = null
|
||||
user.isConfirmed = true
|
||||
await user.save()
|
||||
return res.redirect(`${FRONT_END_HOST}/users/login?isConfirmed=true`)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.resetPassword = async (req, res, next) => {
|
||||
const { email } = req.body;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { email, tempToken: null } });
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "L'adresse email n'existe pas ou une demande est déjà en cours.", statusCode: 400 });
|
||||
}
|
||||
const tempToken = uuid.v4();
|
||||
user.tempExpirationToken = Date.now() + 3600000; // 1 heure
|
||||
user.tempToken = tempToken;
|
||||
await user.save();
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: "FunctionProject - Réinitialisation du mot de passe",
|
||||
html: emailUserTemplate("Veuillez confirmer la réinitialisation du mot de passe", "Oui, je change mon mot de passe.", `${FRONT_END_HOST}/users/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) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { email } = req.body
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { email, tempToken: null } })
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "L'adresse email n'existe pas ou une demande est déjà en cours.", statusCode: 400 })
|
||||
}
|
||||
const tempToken = uuid.v4()
|
||||
user.tempExpirationToken = Date.now() + 3600000 // 1 heure
|
||||
user.tempToken = tempToken
|
||||
await user.save()
|
||||
await transporter.sendMail({
|
||||
from: `"FunctionProject" <${EMAIL_INFO.auth.user}>`,
|
||||
to: email,
|
||||
subject: 'FunctionProject - Réinitialisation du mot de passe',
|
||||
html: emailUserTemplate('Veuillez confirmer la réinitialisation du mot de passe', 'Oui, je change mon mot de passe.', `${FRONT_END_HOST}/users/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) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.newPassword = async (req, res, next) => {
|
||||
const { tempToken, password } = req.body;
|
||||
const errors = validationResult(req);
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 });
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { tempToken } });
|
||||
if (!user && parseInt(tempExpirationToken) < Date.now()) {
|
||||
return errorHandling(next, { message: "Le token n'est pas valide.", statusCode: 400 });
|
||||
}
|
||||
const hashedPassword = await bcrypt.hash(password, 12);
|
||||
user.password = hashedPassword;
|
||||
user.tempToken = null;
|
||||
user.tempExpirationToken = null;
|
||||
await user.save();
|
||||
return res.status(200).json({ result: "Le mot de passe a bien été modifié!" });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { tempToken, password } = req.body
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return errorHandling(next, { message: errors.array()[0].msg, statusCode: 400 })
|
||||
}
|
||||
try {
|
||||
const user = await Users.findOne({ where: { tempToken } })
|
||||
if (!user && parseInt(user.tempExpirationToken) < Date.now()) {
|
||||
return errorHandling(next, { message: "Le token n'est pas valide.", statusCode: 400 })
|
||||
}
|
||||
const hashedPassword = await bcrypt.hash(password, 12)
|
||||
user.password = hashedPassword
|
||||
user.tempToken = null
|
||||
user.tempExpirationToken = null
|
||||
await user.save()
|
||||
return res.status(200).json({ result: 'Le mot de passe a bien été modifié!' })
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
||||
exports.getUserInfo = async (req, res, next) => {
|
||||
const { name } = req.params;
|
||||
try {
|
||||
const user = await Users.findOne({
|
||||
where: { name, isConfirmed: true },
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "isAdmin", "isConfirmed", "password", "tempToken", "tempExpirationToken"]
|
||||
},
|
||||
});
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "L'utilisateur n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
const favorites = await Favorites.findAll({
|
||||
where: { userId: user.id },
|
||||
include: [
|
||||
{ model: Functions, attributes: { exclude: ["updatedAt", "utilizationForm", "article", "isOnline"] }, include: { model: Categories, attributes: ["name", "color"] } }
|
||||
],
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5
|
||||
});
|
||||
const favoritesArray = favorites.map((favorite) => favorite.function);
|
||||
const comments = await Comments.findAll({
|
||||
where: { userId: user.id },
|
||||
include: [
|
||||
{ model: Functions, attributes: { exclude: ["updatedAt", "utilizationForm", "article", "isOnline"] } }
|
||||
],
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5
|
||||
});
|
||||
const commentsArray = comments.map((commentObject) => {
|
||||
return {
|
||||
id: commentObject.id,
|
||||
message: commentObject.message,
|
||||
createdAt: commentObject.createdAt,
|
||||
function: commentObject.function.dataValues
|
||||
};
|
||||
});
|
||||
const quotesArray = await Quotes.findAll({
|
||||
where: { userId: user.id },
|
||||
attributes: {
|
||||
exclude: ["updatedAt", "createdAt", "isValidated", "userId", "id"]
|
||||
},
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5,
|
||||
});
|
||||
const userObject = {
|
||||
// Si Public Email
|
||||
... (user.isPublicEmail) && { email: user.email },
|
||||
isPublicEmail: user.isPublicEmail,
|
||||
name: user.name,
|
||||
biography: user.biography,
|
||||
logo: user.logo,
|
||||
createdAt: user.createdAt,
|
||||
favoritesArray,
|
||||
commentsArray,
|
||||
quotesArray
|
||||
};
|
||||
return res.status(200).json(userObject);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return errorHandling(next, serverError);
|
||||
const { name } = req.params
|
||||
try {
|
||||
const user = await Users.findOne({
|
||||
where: { name, isConfirmed: true },
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'isAdmin', 'isConfirmed', 'password', 'tempToken', 'tempExpirationToken']
|
||||
}
|
||||
})
|
||||
if (!user) {
|
||||
return errorHandling(next, { message: "L'utilisateur n'existe pas.", statusCode: 404 })
|
||||
}
|
||||
}
|
||||
const favorites = await Favorites.findAll({
|
||||
where: { userId: user.id },
|
||||
include: [
|
||||
{ model: Functions, attributes: { exclude: ['updatedAt', 'utilizationForm', 'article', 'isOnline'] }, include: { model: Categories, attributes: ['name', 'color'] } }
|
||||
],
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5
|
||||
})
|
||||
const favoritesArray = favorites.map((favorite) => favorite.function)
|
||||
const comments = await Comments.findAll({
|
||||
where: { userId: user.id },
|
||||
include: [
|
||||
{ model: Functions, attributes: { exclude: ['updatedAt', 'utilizationForm', 'article', 'isOnline'] } }
|
||||
],
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5
|
||||
})
|
||||
const commentsArray = comments.map((commentObject) => {
|
||||
return {
|
||||
id: commentObject.id,
|
||||
message: commentObject.message,
|
||||
createdAt: commentObject.createdAt,
|
||||
function: commentObject.function.dataValues
|
||||
}
|
||||
})
|
||||
const quotesArray = await Quotes.findAll({
|
||||
where: { userId: user.id },
|
||||
attributes: {
|
||||
exclude: ['updatedAt', 'createdAt', 'isValidated', 'userId', 'id']
|
||||
},
|
||||
order: [['createdAt', 'DESC']],
|
||||
limit: 5
|
||||
})
|
||||
const userObject = {
|
||||
// Si Public Email
|
||||
...(user.isPublicEmail) && { email: user.email },
|
||||
isPublicEmail: user.isPublicEmail,
|
||||
name: user.name,
|
||||
biography: user.biography,
|
||||
logo: user.logo,
|
||||
createdAt: user.createdAt,
|
||||
favoritesArray,
|
||||
commentsArray,
|
||||
quotesArray
|
||||
}
|
||||
return res.status(200).json(userObject)
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return errorHandling(next, serverError)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user