📦 NEW: Function linkShortener backend
This commit is contained in:
parent
f2be062754
commit
de44b1db98
12
api/app.js
12
api/app.js
@ -37,12 +37,12 @@ app.use((error, _req, res, _next) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* Database Relations */
|
/* Database Relations */
|
||||||
const Functions = require('./models/functions');
|
const Functions = require('./models/functions');
|
||||||
const Categories = require('./models/categories');
|
const Categories = require('./models/categories');
|
||||||
const Users = require('./models/users');
|
const Users = require('./models/users');
|
||||||
const Favorites = require('./models/favorites');
|
const Favorites = require('./models/favorites');
|
||||||
const Comments = require('./models/comments');
|
const Comments = require('./models/comments');
|
||||||
const Quotes = require('./models/quotes');
|
const Quotes = require('./models/quotes');
|
||||||
|
|
||||||
// A function has a category
|
// A function has a category
|
||||||
Categories.hasOne(Functions, { constraints: true, onDelete: 'CASCADE'});
|
Categories.hasOne(Functions, { constraints: true, onDelete: 'CASCADE'});
|
||||||
|
@ -9,6 +9,7 @@ const calculateAgeOutput = require('./main/calculateAge');
|
|||||||
const heapAlgorithmOutput = require('./main/heapAlgorithm');
|
const heapAlgorithmOutput = require('./main/heapAlgorithm');
|
||||||
const convertEncodingOutput = require('./main/convertEncoding');
|
const convertEncodingOutput = require('./main/convertEncoding');
|
||||||
const randomQuote = require('./main/randomQuote');
|
const randomQuote = require('./main/randomQuote');
|
||||||
|
const linkShortener = require('./main/linkShortener');
|
||||||
|
|
||||||
const functionObject = {
|
const functionObject = {
|
||||||
randomNumber : randomNumberOutput,
|
randomNumber : randomNumberOutput,
|
||||||
@ -22,6 +23,7 @@ const functionObject = {
|
|||||||
heapAlgorithm : heapAlgorithmOutput,
|
heapAlgorithm : heapAlgorithmOutput,
|
||||||
convertEncoding : convertEncodingOutput,
|
convertEncoding : convertEncodingOutput,
|
||||||
randomQuote : randomQuote,
|
randomQuote : randomQuote,
|
||||||
|
linkShortener : linkShortener,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Choisi la fonction à exécuter
|
// Choisi la fonction à exécuter
|
||||||
|
52
api/assets/functions/main/linkShortener.js
Normal file
52
api/assets/functions/main/linkShortener.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
const validator = require('validator');
|
||||||
|
const errorHandling = require('../../utils/errorHandling');
|
||||||
|
const { requiredFields, serverError } = require('../../config/errors');
|
||||||
|
const Short_links = require('../../../models/short_links');
|
||||||
|
|
||||||
|
module.exports = linkShortener = async ({ res, next }, argsObject) => {
|
||||||
|
let { url, shortcutName } = argsObject;
|
||||||
|
|
||||||
|
// S'il n'y a pas les champs obligatoire
|
||||||
|
if (!(url && shortcutName)) {
|
||||||
|
return errorHandling(next, requiredFields);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si ce n'est pas une url
|
||||||
|
if (!validator.isURL(url)) {
|
||||||
|
return errorHandling(next, { message: "Veuillez entré une URL valide.", statusCode: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si ce n'est pas de type slug
|
||||||
|
if (!validator.isSlug(shortcutName)) {
|
||||||
|
return errorHandling(next, { message: "Le nom de votre raccourci doit être de type slug (ne pas contenir d'espaces, ni de caractères spéciaux).", statusCode: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanitize shortcutName
|
||||||
|
shortcutName = validator.escape(shortcutName);
|
||||||
|
shortcutName = validator.trim(shortcutName);
|
||||||
|
shortcutName = validator.blacklist(shortcutName, ' ');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Si l'url a déjà été raccourcie
|
||||||
|
const urlInDatabase = await Short_links.findOne({ where: { url } });
|
||||||
|
if (urlInDatabase) {
|
||||||
|
const urlShort = `https://short-links.divlo.fr/?q=${urlInDatabase.shortcut}`;
|
||||||
|
return errorHandling(next, { message: `L'url a déjà été raccourcie... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si le nom du raccourci existe déjà
|
||||||
|
const shortcutInDatabase = await Short_links.findOne({ where: { shortcut: shortcutName } });
|
||||||
|
if (shortcutInDatabase) {
|
||||||
|
const urlShort = `https://short-links.divlo.fr/?q=${shortcutInDatabase.shortcut}`;
|
||||||
|
return errorHandling(next, { message: `Le nom du raccourci a déjà été utilisé... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ajout du lien raccourci
|
||||||
|
const result = await Short_links.create({ url, shortcut: shortcutName });
|
||||||
|
const shortcutLinkResult = `https://short-links.divlo.fr/?q=${result.shortcut}`;
|
||||||
|
return res.status(200).json({ resultHTML: `URL Raccourcie : <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${shortcutLinkResult}">${shortcutLinkResult}</a>`, result: shortcutLinkResult });
|
||||||
|
} catch {
|
||||||
|
console.log(error);
|
||||||
|
return errorHandling(next, serverError);
|
||||||
|
}
|
||||||
|
}
|
19
api/models/short_links.js
Normal file
19
api/models/short_links.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const Sequelize = require('sequelize');
|
||||||
|
const sequelize = require('../assets/utils/database');
|
||||||
|
|
||||||
|
module.exports = sequelize.define('short_link', {
|
||||||
|
id: {
|
||||||
|
type: Sequelize.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
autoIncrement: true,
|
||||||
|
primaryKey: true
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: Sequelize.TEXT,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
shortcut: {
|
||||||
|
type: Sequelize.TEXT,
|
||||||
|
allowNull: false,
|
||||||
|
}
|
||||||
|
});
|
11
api/package-lock.json
generated
11
api/package-lock.json
generated
@ -1545,6 +1545,11 @@
|
|||||||
"version": "3.4.0",
|
"version": "3.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
|
||||||
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
|
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
|
||||||
|
},
|
||||||
|
"validator": {
|
||||||
|
"version": "10.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
|
||||||
|
"integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1798,9 +1803,9 @@
|
|||||||
"integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw=="
|
"integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw=="
|
||||||
},
|
},
|
||||||
"validator": {
|
"validator": {
|
||||||
"version": "10.11.0",
|
"version": "13.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/validator/-/validator-13.0.0.tgz",
|
||||||
"integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw=="
|
"integrity": "sha512-anYx5fURbgF04lQV18nEQWZ/3wHGnxiKdG4aL8J+jEDsm98n/sU/bey+tYk6tnGJzm7ioh5FoqrAiQ6m03IgaA=="
|
||||||
},
|
},
|
||||||
"vary": {
|
"vary": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
|
@ -25,7 +25,8 @@
|
|||||||
"nodemailer": "^6.4.6",
|
"nodemailer": "^6.4.6",
|
||||||
"sequelize": "^5.21.5",
|
"sequelize": "^5.21.5",
|
||||||
"smart-request-balancer": "^2.1.1",
|
"smart-request-balancer": "^2.1.1",
|
||||||
"uuid": "^7.0.2"
|
"uuid": "^7.0.2",
|
||||||
|
"validator": "^13.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
|
Reference in New Issue
Block a user