const micro = require('micro'); const compress = require('micro-compress'); const queryString = require('querystring'); const Database = require('better-sqlite3'); const fs = require('fs'); module.exports = compress(async (req, res) => { console.log(req.method, req.url); res.setHeader("Access-Control-Allow-Origin","*"); //console.log(res); if (req.method === "GET") { console.log("Get Request coming in"); String.prototype.mySqlEsc = function(){return(this.replace(/'/g,"''"))}; let qsAttr; let func=req.url; if (req.url.indexOf("?") >=0){ func=req.url.substring(0,req.url.indexOf("?")) qsAttr=queryString.parse(req.url.substring(req.url.indexOf("?")+1)); } console.log(func,qsAttr); if (func === "/getCombinations") { console.log("Request for combinations"); const db = new Database('./quoteDBs/consolidated.sqlite3', { verbose: console.log }); const stmt = db.prepare("SELECT distinct Symbol,date(TimeStamp,'localtime') Date ,time(TimeStamp,'localtime') Time FROM OptionQuotes"); let allDates = stmt.all(); //console.log(JSON.stringify(allDates)); db.close(); micro.send(res,200,allDates); return(true); } if (func === "/getSymbols") { console.log("Request for Symbols"); const db = new Database('./quoteDBs/consolidated.sqlite3', { verbose: console.log }); const stmt = db.prepare("SELECT distinct Symbol FROM OptionQuotes order by 1"); let allDates = stmt.all(); //console.log(JSON.stringify(allDates)); db.close(); micro.send(res,200,allDates); return(true); } if (func === "/getDates") { console.log("Request for Dates"); const db = new Database('./quoteDBs/consolidated.sqlite3', { verbose: console.log }); let sql = "SELECT distinct date(TimeStamp,'localtime') Date FROM OptionQuotes where 1=1"; if (qsAttr.Symbol) { sql +=" and Symbol='" + qsAttr.Symbol.mySqlEsc() + "'"; } sql +=" order by 1"; const stmt = db.prepare(sql); let allDates = stmt.all(); //console.log(JSON.stringify(allDates)); db.close(); micro.send(res,200,allDates); return(true); } if (func === "/getTimes") { console.log("Request for Times"); const db = new Database('./quoteDBs/consolidated.sqlite3', { verbose: console.log }); let sql = "SELECT distinct time(TimeStamp,'localtime') Time FROM OptionQuotes where 1=1" if (qsAttr.Symbol) { sql +=" and Symbol='" + qsAttr.Symbol.mySqlEsc() + "'"; } if (qsAttr.Date){ sql +=" and date(TimeStamp,'localtime')='" + qsAttr.Date.mySqlEsc() + "'"; } sql+=" order by 1"; const stmt = db.prepare(sql); let allDates = stmt.all(); //console.log(JSON.stringify(allDates)); db.close(); micro.send(res,200,allDates); return(true); } if (func === "/getOptionChain") { console.log("Request for OptionChain"); const db = new Database('./quoteDBs/consolidated.sqlite3', { verbose: console.log }); let sql = "SELECT Data FROM OptionQuotes where 1=1" if (qsAttr.Symbol) { sql +=" and Symbol='" + qsAttr.Symbol.mySqlEsc() + "'" } if (qsAttr.Date){ sql +=" and date(TimeStamp,'localtime')='" + qsAttr.Date.mySqlEsc() + "'"; } if (qsAttr.Time){ sql +=" and time(TimeStamp,'localtime')='" + qsAttr.Time.mySqlEsc() + "'"; } const stmt = db.prepare(sql); let allDates = stmt.all(); //console.log(JSON.stringify(allDates)); db.close(); micro.send(res,200,allDates); return(true); } console.log("Request for File"); // Anything else we deliver as file data if (func === "/") { func += 'index.html';} // this is very basic protection only... if ((func.indexOf("..") === -1) && (func.indexOf("~") === -1) && (func.indexOf("favicon ") === -1) ){ res.setHeader('Content-Type', 'text/html'); fs.readFile("../client/"+func, (err,filecontent)=>{ if (err) { console.log(err); micro.send(res,500, "Error. check console for details."); } else { micro.send(res,200,filecontent); } }); } else { res.setHeader('Content-Type', 'text/html'); micro.send(res,401,"Invalid file to serve"); } } });