WikiLerni/controllers/link.js

144 lines
4.8 KiB
JavaScript

const config = require("../config/main.js");
const configLinks = require("../config/links.js");
const tool = require("../tools/main");
const toolError = require("../tools/error");
const questionnaireCtrl = require("./questionnaire");
const txt = require("../lang/"+config.adminLang+"/link");
const txtGeneral = require("../lang/"+config.adminLang+"/general");
exports.create = async (req, res, next) =>
{
try
{
const db = require("../models/index");
const questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId);
if(!questionnaire)
throw { message: txt.needQuestionnaire };
else if(configLinks.nbLinksMax!==0 && questionnaire.Links.length>=configLinks.nbLinksMax)
res.status(400).json({ errors: txt.needMaxLinksForQuestionnaire });
else
{
const link=await db["Link"].create({ ...req.body }, { fields: ["url","anchor", "QuestionnaireId"] });
questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId);
const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher
res.status(201).json({ message: txt.addedOkMessage, questionnaire: questionnaireDatas });
}
next();
}
catch(e)
{
const returnAPI=toolError.returnSequelize(e);
if(returnAPI.messages)
{
res.status(returnAPI.status).json({ errors : returnAPI.messages });
next();
}
else
next(e);
}
}
exports.modify = async (req, res, next) =>
{
try
{
const db = require("../models/index");
const link=await searchLinkById(req.params.id);
if(!link)
res.status(404).json({ errors: txt.notFound });
else
{
const questionnaire=await questionnaireCtrl.searchQuestionnaireById(link.QuestionnaireId);
if(!questionnaire)
throw { message: txt.needQuestionnaire };
else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId)
res.status(401).json({ errors: txtGeneral.notAllowed });
else
{
await db["Link"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["url","anchor"], limit:1 });
const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(link.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher
res.status(200).json({ message: txt.updatedOkMessage, questionnaire: questionnaireDatas });
}
}
next();
}
catch(e)
{
const returnAPI=toolError.returnSequelize(e);
if(returnAPI.messages)
{
res.status(returnAPI.status).json({ errors : returnAPI.messages });
next();
}
else
next(e);
}
}
exports.delete = async (req, res, next) =>
{
try
{
const db = require("../models/index");
const link=await searchLinkById(req.params.id);
if(!link)
res.status(404).json({ errors: txt.notFound });
else
{
const questionnaire=await questionnaireCtrl.searchQuestionnaireById(link.QuestionnaireId);
if(!questionnaire)
throw { message: txt.needQuestionnaire };
else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId)
res.status(401).json({ errors: txtGeneral.notAllowed });
else
{
const nb=await db["Link"].destroy( { where: { id : req.params.id }, limit:1 });
if(nb===1)
{
const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(link.QuestionnaireId);
res.status(200).json({ message: txt.deletedOkMessage, questionnaire: questionnaireDatas });
}
else // ne devrait pas être possible, car déjà testé + haut !
throw { message: txt.needQuestionnaire };
}
}
next();
}
catch(e)
{
next(e);
}
}
exports.getOneById = async (req, res, next) =>
{
try
{
const link=await searchLinkById(req.params.id);
if(link)
res.status(200).json(link);
else
res.status(404).json(null);
next();
}
catch(e)
{
next(e);
}
}
// FONCTIONS UTILITAIRES
const searchLinkById = async (id) =>
{
const db = require("../models/index");
const link = await db["Link"].findByPk(id);
if(link)
return link;
else
return false;
}