const path = require ( 'path' ) ;
//const http = require('http');
const express = require ( 'express' ) ;
const app = express ( ) ;
const staticPath = path . join ( _ _dirname , "/public" ) ;
var bodyParser = require ( 'body-parser' )
const cassandra = require ( 'cassandra-driver' ) ;
const client = new cassandra . Client ( {
contactPoints : [ '127.0.0.1:9042' ] ,
localDataCenter : 'datacenter1' ,
keyspace : 'glink'
} ) ;
//var server = http.createServer(app);
let id = 1 ; /* Ideally should initialize id to be nextFromDB or write to file and read */
const port = 63342 ; // Port that the server listens on */
app . use ( bodyParser . json ( ) ) ;
app . use ( bodyParser . urlencoded ( {
extended : true
} ) ) ;
app . use ( express . static ( staticPath ) ) ;
function nextId ( ) {
let next = id ;
id = id + 1 ;
return next ;
}
function filter ( path ) {
if ( path . match ( new RegExp ( "^/[a-zA-Z]+/$" ) ) ) {
if ( path . charAt ( 0 ) === '/' ) {
path = path . substring ( 1 ) ;
}
if ( path . charAt ( path . length - 1 ) === '/' && path . length > 1 ) {
path = path . substring ( 0 , path . length - 1 ) ;
}
return path ;
} else {
console . log ( "failed check" ) ;
return null ;
}
}
app . get ( '/' , ( request , response ) => {
response . render ( "index.html" ) ;
} )
app . get ( '/node_modules/' , ( request , response ) => {
response . sendFile ( path . join ( staticPath , "/error.html" ) ) ;
} )
app . get ( '/public/' , ( request , response ) => {
response . sendFile ( path . join ( staticPath , "/error.html" ) ) ;
} )
const query = "INSERT INTO data (id, url, glink) VALUES (?, ?, ?)" ;
app . post ( '/add' , function ( req , res ) {
let input _url = req . body . url ;
let input _glink = req . body . glink ;
console . log ( "Received query " + input _url + " and " + input _glink )
let currID = nextId ( ) ;
let selectQuery = "SELECT id FROM data where glink = ? allow filtering" ;
client . execute ( selectQuery , [ input _glink ] , { } , function ( err , result ) {
if ( result . rows . length === 0 ) {
client . execute ( query , [ currID , input _url , input _glink ] , { prepare : true } , function ( err , result ) {
if ( err ) {
res . send ( "<html><body><p style=\"font-family:Futura; font-size:large; color:red;\">{err.message}</p></body></html>" ) ;
} else {
res . send ( "<html><body><p style=\"font-family:Futura; font-size:large; color:green;\">New entry has been added with url = " + req . body . url + " and glink = " + req . body . glink + "</p></body></html>" ) ;
}
} ) ;
} else {
res . send ( "<html><body><p style=\"font-family:futura; font-size:large; color:red;\">This glink has already been registered. Please try a different glink</p></body></html>" ) ;
}
} ) ;
} )
/* Redirect requests to corresponding entry in database */
app . get ( '/*' , ( request , response ) => {
let req _path = request . path ;
req _path = filter ( req _path ) ;
console . log ( "Path is " + req _path ) ;
if ( req _path == null ) {
response . sendFile ( path . join ( staticPath , "/error.html" ) ) ;
return ;
}
let selQry = "select url from data where glink = ? allow filtering" ;
client . execute ( selQry , [ req _path ] , { } , function ( err , result ) {
if ( result . rows . length === 0 ) {
console . log ( "Failed" ) ;
response . sendFile ( path . join ( staticPath , "/error.html" ) ) ;
} else {
let page = result . rows [ 0 ] [ "url" ] ;
console . log ( page ) ;
response . writeHead ( 301 , { Location : page } ) ;
response . end ( ) ;
}
} )
} )
app . listen ( port , function ( ) {
console . log ( "server listening on port 63342" ) ;
} )
/** Validate url and glink on client side as well */