UNPKG

sqlpad

Version:

Web app for writing and running SQL queries and visualizing the results. Supports Postgres, MySQL, SQL Server, Crate and Vertica.

173 lines (162 loc) 4.72 kB
var router = require('express').Router() var config = require('../lib/config.js') var Connection = require('../models/Connection.js') var Query = require('../models/Query.js') var mustBeAuthenticated = require('../middleware/must-be-authenticated.js') var mustBeAuthenticatedOrChartLink = require('../middleware/must-be-authenticated-or-chart-link-noauth.js') const BASE_URL = config.get('baseUrl') /* render page routes ============================================================================= */ // NOTE: this non-api route is special since it redirects legacy urls router.get('/queries/:_id', mustBeAuthenticatedOrChartLink, function( req, res, next ) { var format = req.query.format if (format === 'table') { return res.redirect(BASE_URL + '/query-table/' + req.params._id) } else if (format === 'chart') { return res.redirect(BASE_URL + '/query-chart/' + req.params._id) } next() }) /* API routes ============================================================================= */ router.delete('/api/queries/:_id', mustBeAuthenticated, function(req, res) { Query.removeOneById(req.params._id, function(err) { if (err) { console.error(err) return res.json({ error: 'Problem deleting query' }) } res.json({}) }) }) router.get('/api/queries', mustBeAuthenticated, function(req, res) { /* NOTE: db side filter. implement or? var filter = {}; if (req.query && req.query.tag) { filter.tags = req.query.tag; } if (req.query && req.query.connection) { filter.connectionId = req.query.connection; } if (req.query && req.query.createdBy) { filter.createdBy = } if (req.query && req.query.search) { var nameRegExp = new RegExp(req.query.search, "i"); var queryTextRegExp = new RegExp(req.query.search, "i"); filter.$or = [{queryText: {$regex: queryTextRegExp}}, {name: {$regex: nameRegExp}}]; } Query.findByFilter(filter, function (err, queries) { }); */ Query.findAll(function(err, queries) { if (err) { console.error(err) return res.json({ error: 'Problem querying query database' }) } return res.json({ queries: queries }) }) }) router.get('/api/queries/:_id', mustBeAuthenticatedOrChartLink, function( req, res ) { Connection.findAll(function(err, connections) { if (err) { console.error(err) return res.json({ error: 'Problem querying connection database' }) } Query.findOneById(req.params._id, function(err, query) { if (err) { console.error(err) return res.json({ error: 'Problem querying query database', connections: connections }) } if (!query) { return res.json({ connections: connections, query: {} }) } return res.json({ connections: connections, query: query }) }) }) }) // create new router.post('/api/queries', mustBeAuthenticated, function(req, res) { // previously posted to api/queries/:_id, req.params._id would have been "new" // now though we know its new because the client did that for us var query = new Query({ name: req.body.name || 'No Name Query', tags: req.body.tags, connectionId: req.body.connectionId, queryText: req.body.queryText, chartConfiguration: req.body.chartConfiguration, createdBy: req.user.email, modifiedBy: req.user.email }) query.save(function(err, newQuery) { if (err) { console.error(err) return res.json({ error: 'Problem saving query' }) } // push query to slack if set up. // this is async, but save operation doesn't care about when/if finished newQuery.pushQueryToSlackIfSetup() res.json({ query: newQuery }) }) }) router.put('/api/queries/:_id', mustBeAuthenticated, function(req, res) { Query.findOneById(req.params._id, function(err, query) { if (err) { console.error(err) return res.send({ error: 'Problem querying query database' }) } if (!query) { return res.send({ error: 'No query found for that Id' }) } query.name = req.body.name || '' query.tags = req.body.tags query.connectionId = req.body.connectionId query.queryText = req.body.queryText query.chartConfiguration = req.body.chartConfiguration query.modifiedBy = req.user.email query.save(function(err, newQuery) { if (err) { console.error(err) return res.json({ error: 'Problem saving query' }) } return res.json({ query: newQuery }) }) }) }) module.exports = router