✨ s.divlo.fr : linkShortener
This commit is contained in:
parent
653068c9c7
commit
fbfd8899e9
@ -5,7 +5,7 @@ const express = require('express')
|
|||||||
const helmet = require('helmet')
|
const helmet = require('helmet')
|
||||||
const cors = require('cors')
|
const cors = require('cors')
|
||||||
const morgan = require('morgan')
|
const morgan = require('morgan')
|
||||||
const redirectToHTTPS = require('express-http-to-https').redirectToHTTPS
|
const { redirectToHTTPS } = require('express-http-to-https')
|
||||||
|
|
||||||
/* Files Imports & Variables */
|
/* Files Imports & Variables */
|
||||||
const sequelize = require('./assets/utils/database')
|
const sequelize = require('./assets/utils/database')
|
||||||
|
@ -3,6 +3,8 @@ const errorHandling = require('../../utils/errorHandling')
|
|||||||
const { requiredFields, serverError } = require('../../config/errors')
|
const { requiredFields, serverError } = require('../../config/errors')
|
||||||
const shortLinks = require('../../../models/short_links')
|
const shortLinks = require('../../../models/short_links')
|
||||||
|
|
||||||
|
const shortLinkBaseURL = 'https://s.divlo.fr'
|
||||||
|
|
||||||
module.exports = async ({ res, next }, argsObject) => {
|
module.exports = async ({ res, next }, argsObject) => {
|
||||||
let { url, shortcutName } = argsObject
|
let { url, shortcutName } = argsObject
|
||||||
|
|
||||||
@ -37,7 +39,7 @@ module.exports = async ({ res, next }, argsObject) => {
|
|||||||
// Si l'url a déjà été raccourcie
|
// Si l'url a déjà été raccourcie
|
||||||
const urlInDatabase = await shortLinks.findOne({ where: { url } })
|
const urlInDatabase = await shortLinks.findOne({ where: { url } })
|
||||||
if (urlInDatabase) {
|
if (urlInDatabase) {
|
||||||
const urlShort = `https://short-links.divlo.fr/?q=${urlInDatabase.shortcut}`
|
const urlShort = `${shortLinkBaseURL}/${urlInDatabase.shortcut}`
|
||||||
return errorHandling(next, {
|
return errorHandling(next, {
|
||||||
message: `L'url a déjà été raccourcie... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`,
|
message: `L'url a déjà été raccourcie... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`,
|
||||||
statusCode: 400
|
statusCode: 400
|
||||||
@ -49,7 +51,7 @@ module.exports = async ({ res, next }, argsObject) => {
|
|||||||
where: { shortcut: shortcutName }
|
where: { shortcut: shortcutName }
|
||||||
})
|
})
|
||||||
if (shortcutInDatabase) {
|
if (shortcutInDatabase) {
|
||||||
const urlShort = `https://short-links.divlo.fr/?q=${shortcutInDatabase.shortcut}`
|
const urlShort = `${shortLinkBaseURL}/${shortcutInDatabase.shortcut}`
|
||||||
return errorHandling(next, {
|
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>`,
|
message: `Le nom du raccourci a déjà été utilisé... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`,
|
||||||
statusCode: 400
|
statusCode: 400
|
||||||
@ -58,10 +60,8 @@ module.exports = async ({ res, next }, argsObject) => {
|
|||||||
|
|
||||||
// Ajout du lien raccourci
|
// Ajout du lien raccourci
|
||||||
const result = await shortLinks.create({ url, shortcut: shortcutName })
|
const result = await shortLinks.create({ url, shortcut: shortcutName })
|
||||||
const shortcutLinkResult = `https://short-links.divlo.fr/?q=${result.shortcut}`
|
const shortcutLinkResult = `${shortLinkBaseURL}/${result.shortcut}`
|
||||||
return res
|
return res.status(200).json({
|
||||||
.status(200)
|
|
||||||
.json({
|
|
||||||
resultHTML: `URL Raccourcie : <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${shortcutLinkResult}">${shortcutLinkResult}</a>`,
|
resultHTML: `URL Raccourcie : <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${shortcutLinkResult}">${shortcutLinkResult}</a>`,
|
||||||
result: shortcutLinkResult
|
result: shortcutLinkResult
|
||||||
})
|
})
|
||||||
|
4
s.divlo.fr/.env.example
Normal file
4
s.divlo.fr/.env.example
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
DB_HOST = ""
|
||||||
|
DB_NAME = ""
|
||||||
|
DB_USER = ""
|
||||||
|
DB_PASS = ""
|
2
s.divlo.fr/.gitignore
vendored
Normal file
2
s.divlo.fr/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules
|
||||||
|
.env
|
3
s.divlo.fr/README.md
Normal file
3
s.divlo.fr/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# s.divlo.fr
|
||||||
|
|
||||||
|
Site web qui permet de rediriger les utilisateurs vers leurs liens raccourcis sur [function.divlo.fr](https://function.divlo.fr/).
|
72
s.divlo.fr/app.js
Normal file
72
s.divlo.fr/app.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* Modules */
|
||||||
|
require('dotenv').config()
|
||||||
|
const path = require('path')
|
||||||
|
const express = require('express')
|
||||||
|
const helmet = require('helmet')
|
||||||
|
const morgan = require('morgan')
|
||||||
|
const { redirectToHTTPS } = require('express-http-to-https')
|
||||||
|
const mysql = require('mysql')
|
||||||
|
|
||||||
|
/* Files Imports & Variables */
|
||||||
|
const app = express()
|
||||||
|
const database = mysql.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASS,
|
||||||
|
database: process.env.DB_NAME,
|
||||||
|
port: process.env.DB_PORT
|
||||||
|
})
|
||||||
|
|
||||||
|
/* Middlewares */
|
||||||
|
app.use(helmet())
|
||||||
|
app.use(morgan('dev'))
|
||||||
|
app.use(express.json())
|
||||||
|
app.use(redirectToHTTPS([/localhost:(\d{4})/]))
|
||||||
|
|
||||||
|
/* EJS Template Engines */
|
||||||
|
app.set('view engine', 'ejs')
|
||||||
|
app.set('views', path.join(__dirname, 'views'))
|
||||||
|
|
||||||
|
/* Routes */
|
||||||
|
app.use(express.static(path.join(__dirname, 'public')))
|
||||||
|
|
||||||
|
app.get('/', (_req, res) => {
|
||||||
|
return res.render('index')
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get('/:shortcut', (req, res, next) => {
|
||||||
|
const { shortcut } = req.params
|
||||||
|
if (shortcut == null) {
|
||||||
|
return res.redirect('/errors/404')
|
||||||
|
}
|
||||||
|
database.query(
|
||||||
|
'SELECT * FROM short_links WHERE shortcut = ?',
|
||||||
|
[shortcut],
|
||||||
|
(error, [result]) => {
|
||||||
|
if (error != null) {
|
||||||
|
return next(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == null) {
|
||||||
|
return res.redirect('/error/404')
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.redirect(result.url)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
/* Errors */
|
||||||
|
app.use((_req, res) => {
|
||||||
|
return res.status(404).render('errors')
|
||||||
|
})
|
||||||
|
app.use((error, _req, res) => {
|
||||||
|
console.log(error)
|
||||||
|
return res.status(500).render('errors')
|
||||||
|
})
|
||||||
|
|
||||||
|
/* Server */
|
||||||
|
const PORT = process.env.PORT || 8000
|
||||||
|
app.listen(PORT, () => {
|
||||||
|
console.log('\x1b[36m%s\x1b[0m', `Started on port ${PORT}.`)
|
||||||
|
})
|
3497
s.divlo.fr/package-lock.json
generated
Normal file
3497
s.divlo.fr/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
24
s.divlo.fr/package.json
Normal file
24
s.divlo.fr/package.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "short.divlo.fr",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Link shortener for FunctionProject",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node app.js",
|
||||||
|
"dev": "nodemon app.js",
|
||||||
|
"format": "standard \"./**/*.js\" --fix | snazzy || exit 0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^8.2.0",
|
||||||
|
"ejs": "^3.1.3",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"express-http-to-https": "^1.1.4",
|
||||||
|
"helmet": "^4.0.0",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"mysql": "^2.18.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^2.0.4",
|
||||||
|
"snazzy": "^8.0.0",
|
||||||
|
"standard": "^14.3.4"
|
||||||
|
}
|
||||||
|
}
|
BIN
s.divlo.fr/public/images/error404.png
Normal file
BIN
s.divlo.fr/public/images/error404.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 168 KiB |
BIN
s.divlo.fr/public/images/linkShortener.png
Normal file
BIN
s.divlo.fr/public/images/linkShortener.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 KiB |
20
s.divlo.fr/views/errors.ejs
Normal file
20
s.divlo.fr/views/errors.ejs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||||
|
<title>Short-links</title>
|
||||||
|
<link rel="icon" type="image/png" href="/images/error404.png" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<style type="text/css">
|
||||||
|
* {
|
||||||
|
font-family: Arial;
|
||||||
|
color: #fff;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<p>Adresse url non connue</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
19
s.divlo.fr/views/index.ejs
Normal file
19
s.divlo.fr/views/index.ejs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||||
|
<title>Short-links</title>
|
||||||
|
<link rel="icon" type="image/png" href="/images/linkShortener.png" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<style type="text/css">
|
||||||
|
* {
|
||||||
|
font-family: Arial;
|
||||||
|
color: #fff;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</body>
|
||||||
|
</html>
|
Reference in New Issue
Block a user