corlaez
7/23/2019 - 10:29 PM

A mysql wrapper that will allow to make simple read operations

A mysql wrapper that will allow to make simple read operations

const mysql = require('mysql2')

const createConnection = (connectedCB) => {
  const envParams = {
    host: process.env.host,
    user: process.env.user,
    password: process.env.password,
    database: process.env.database,
  }
  if (Object.keys(envParams).some(k => envParams[k] == null)) {
    return connectedCB("Error, missing env variables.");
  }
  const config = {
    ...envParams,
    ssl: "Amazon RDS"
  }
  let con = mysql.createConnection(config)
  con.connect(function(err) {
    // Connection error
    if (err) {
      con = 'error connecting to db: ' + err.stack
    }
    connectedCB(con);
  });
}

const query2 = (query, params, fieldAliases, httpRes, consume = x => x) => {
  createConnection(con => {
    if(typeof con === 'string') {
      httpRes.statusCode = 500;
      httpRes.end(con)
      return
    }
    con.execute(query, params, function (error, results, fields) {
      try {
        // Query error
        if (error) {
          httpRes.statusCode = 500;
          httpRes.end("Query error " + error)
        }
        else {
          // Handle result
          const mapper = getAliasMapper(fields, fieldAliases)
          const stringResponse = JSON.stringify(results.map(mapper))
          httpRes.end(consume(stringResponse))
        }
      } catch(e) {
        // Result handling error
        httpRes.statusCode = 500;
        httpRes.end("Result handling error " + e.stack)
      } finally {
        // Finish connection safely
        con.end(error => console.log(error));
      }
    });
  });
}

const getAliasMapper = (fields, fieldAliases) => origin => {
  const useAlias = fieldAliases.length != 0
  const arr = useAlias ? fieldAliases : fields
  const target = {}
  for (let i = 0; i < arr.length; i++) {
    const key = useAlias ? fieldAliases[i]: `field${i}`
    if (key != null)
      target[key] = origin[fields[i].name]
  }
  return target
}

const getAssocMapper = fields => origin => 
  `"${[origin[fields[0].name]]}":${origin[fields[1].name]}`

// "USA" | 13000 => { "USA": 13000 }
const queryMap = (query, params, httpRes) => {
  createConnection(con => {
    if(typeof con === 'string') {
      console.error(con)
      httpRes.statusCode = 500;
      httpRes.end(con)
      return
    }
    con.execute(query, params, function (error, results, fields) {
      try {
        // Query error
        if (error) {
          const errorMessage = "Query error : " + error+ " query: " + query
          httpRes.statusCode = 500;
          httpRes.end(errorMessage)
        }
        else {
          // Handle result
          const mapper = getAssocMapper(fields)
          const stringResponse = `{${results.map(mapper).join(",")}}`
          httpRes.end(stringResponse)
        }
      } catch(e) {
        // Result handling error
        const resultErrorMessage = "Result handling error: " + e.stack
        console.log(resultErrorMessage)
        httpRes.statusCode = 500;
        httpRes.end(resultErrorMessage)
      } finally {
        // Finish connection safely
        con.end(error => console.log(error));
      }
    });
  });
}

module.exports = {
  query2,
  queryMap,
}