UNPKG

@rahmatsaeedi/miniurl

Version:

A full stack, light-weight, simplified, & minified version of bit.ly, that allows users to shorten long URLs

292 lines (262 loc) 8.93 kB
const express = require("express"); const bodyParser = require("body-parser"); const cookieParser = require("cookie-parser"); const { generateRandomString } = require("./generateRandomString"); const { addURL, removeURL, updateURL, getURL } = require('./lookupURL'); const { initSessions, authenticateSession, createSession, destroySession, extendSession, getSessionUserID, getUserEmailByID, getSessionExpires, registerNewUser, isRegistered, addToURI, deleteFromURI, getURI } = require('./lookupUser'); const PORT = 80; const app = express(); initSessions(); app.use(bodyParser.urlencoded({extended: true})); app.use(cookieParser()); app.set("view engine", 'ejs'); const updateCookie = (resp, sessionID) => { sessionID = typeof(sessionID) === 'string' ? sessionID : false; if (sessionID && extendSession(sessionID)) { resp.cookie('session_id', sessionID,{ expires: getSessionExpires(sessionID) }); return resp; } else { return resp; } }; const destroyCookie = (resp, sessionID = false) => { destroySession(sessionID); resp.cookie('session_id', '', { expires: new Date(Date.now()) }); }; app.get('/', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { resp.redirect('/urls'); } else { resp.redirect("/login"); } }); app.get('/clean', (req, resp) => { destroyCookie(resp, req.cookies.session_id); resp.send('Cleaned'); }); app.get('/login', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { resp.redirect("/urls"); } else { resp.render("urls_login"); } }); app.get('/register', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { resp.redirect("/"); } else { resp.render("urls_register"); } }); app.get('/logout', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { destroyCookie(resp, req.cookies.session_id); resp.redirect('/'); } else { resp.redirect('/'); } }); app.get('/urls', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { updateCookie(resp, req.cookies.session_id); let urls = {}; for (let shortCode of getURI('urls', req.cookies.session_id)) { let URL = getURL(shortCode); if (URL) { urls[shortCode] = URL; } } resp.render("urls_index", { 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)), 'urls': urls }); } else { resp.render("urls_errors", { errorMessage : "Please Login First" }); } }); app.get('/urls.json', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { updateCookie(resp, req.cookies.session_id); let urls = {}; for (let shortCode of getURI('urls', req.cookies.session_id)) { let URL = getURL(shortCode); if (URL) { urls[shortCode] = URL; } } resp.json(urls); } else { resp.statusCode = 404; resp.json({ "Error" : 404, "Info" : "Please login first!" }); } }); app.get('/urls/new', (req, resp) => { if (authenticateSession(req.cookies.session_id)) { updateCookie(resp, req.cookies.session_id); resp.render("urls_new", { 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } else { resp.redirect('/login'); } }); app.get('/urls/:shortURL', (req, resp) => { const url = getURL(req.params.shortURL); if (!url) { resp.render("urls_errors", { errorMessage : "Unknown short code", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } else if (!authenticateSession(req.cookies.session_id)) { resp.render("urls_errors", { errorMessage : "Please Login First", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } else if (authenticateSession(req.cookies.session_id) && url && getSessionUserID(req.cookies.session_id) === url.userID) { updateCookie(resp, req.cookies.session_id); resp.render("urls_show", { 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)), 'url': url }); } else { resp.render("urls_errors", { errorMessage : "Are you sure this belongs to you?", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.get('/u/:shortURL', (req, resp) => { const url = getURL(req.params.shortURL, true); if (url) { resp.redirect(302, url.longURL); } else { resp.render("urls_errors", { errorMessage : "Requested URL is no more!...", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.post('/login', (req, resp) => { const sessionID = createSession(req.body.email, req.body.password); if (sessionID) { updateCookie(resp, sessionID); resp.redirect('/urls'); } else { resp.render("urls_login", { errorMessage : "Unknown or incorrect username / pass combination.", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.post('/logout', (req, resp) => { destroyCookie(resp, req.cookies.session_id); resp.redirect('/'); }); app.post('/register', (req, resp) => { if (req.body.email && req.body.password) { const email = req.body.email; const password = req.body.password; if (!isRegistered(email)) { registerNewUser(email, password); updateCookie(resp, createSession(email, password)); resp.redirect('/urls'); } else { resp.statusCode = 400; resp.render("urls_errors", { errorMessage : "A user with that email address already exists!", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } } else { resp.statusCode = 400; resp.render("urls_errors", { errorMessage : "Empty username or password!", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.post('/urls', (req, resp) => { if (authenticateSession(req.cookies.session_id) && req.body.longURL !== undefined) { const shortURL = generateRandomString(); let r = addURL(shortURL, req.body.longURL, getSessionUserID(req.cookies.session_id)); if (r) { addToURI('urls', shortURL, req.cookies.session_id); resp.redirect(`/urls/${shortURL}`); } else { resp.statusCode = 500; resp.render("urls_errors", { errorMessage : "Could not process the request.", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } } else { resp.statusCode = 500; resp.render("urls_errors", { errorMessage : "Unauthorized", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.post('/urls/:shortURL/delete', (req, resp) => { const url = getURL(req.params.shortURL); if (authenticateSession(req.cookies.session_id) && url && getSessionUserID(req.cookies.session_id) === url.userID) { removeURL(req.params.shortURL, getSessionUserID(req.cookies.session_id)); deleteFromURI('urls', req.params.shortURL, req.cookies.session_id); resp.redirect('/'); } else { resp.statusCode = 500; resp.render("urls_errors", { errorMessage : "Unauthorized", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.post('/urls/:shortURL/update', (req, resp) => { const url = getURL(req.params.shortURL); if (authenticateSession(req.cookies.session_id) && url && getSessionUserID(req.cookies.session_id) === url.userID) { updateURL(req.params.shortURL, req.body.longURL, getSessionUserID(req.cookies.session_id)); resp.redirect('/'); } else { resp.statusCode = 500; resp.render("urls_errors", { errorMessage : "Unauthorized", 'session_id': req.cookies.session_id, 'user_email': getUserEmailByID(getSessionUserID(req.cookies.session_id)) }); } }); app.use('/favicon.ico', express.static('views/favicon.ico')); app.listen(PORT, () => { console.log(`The app listening on port ${PORT}`); });