Как сократить множество однотипных функций js?

Есть очень много подобных функций:

function MYSQL_INSERT_LoginSteamSession(parametr, ip) 
{
    return console.log(parametr, ip)
}
function mysqlPayAddBill(steamId, c, payment, amount, time, status)
{
    return console.log(steamId, c, payment, amount, time, status)
}
function mysqlPayGetBills(mysql, steam) {
    return console.log(mysql, steam)
}
function mysqlPayGetBillsNow(steam) {
    return console.log(steam)
}
function mysqlPaySetBillsStatus(int) {
    return console.log(int)
}

У функций не меняется ничего кроме принимаемых параметров в запрос.

Как сократить написание всех этих функций, и объединить их в какой ни будь одной? /

function MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role) {
    return new Promise((resolve, reject) => {
        connection.query(`INSERT crm_auth(ip, steam, refreshToken, token, role) \
                VALUES ('${ip}', '${steam}', '${refreshToken}', '${token}', '${role}')`,
            function(err, results, fields)
            {
                if(err) return err;
                else resolve(results)
            }
        )
    })
}
function mysqlPayAddBill(steamId, billId, payment, amount, time, status) {
    return new Promise((resolve, reject) => {
        connection.query(`INSERT crm_pay_billing(steam, billId, payment, amount, time, status) \
                VALUES ('${steamId}', '${billId}', '${payment}', '${amount}', '${time}', '${status}')`,
            function(err, results, fields)
            {
                if(err) return err;
                else resolve(results)
            }
        )
    })
}
function mysqlPayGetBills() {
    return new Promise((resolve, reject) => {
        connection.query(`SELECT billId FROM crm_pay_billing WHERE time<${Date.now()-3600000} && status='ADDED'`,
            function(err, results, fields)
            {
                if(err) return err;
                else resolve(results)
            }
        )
    })
}
function mysqlPayGetBillsNow() {
    return new Promise((resolve, reject) => {
        connection.query(`SELECT billId FROM crm_pay_billing WHERE time>${Date.now()-3600000} && status='ADDED'`,
            function(err, results, fields)
            {
                if(err) return err;
                else resolve(results)
            }
        )
    })
}
function mysqlPaySetBillsStatus(billId) {
    return new Promise((resolve, reject) => {
        connection.query(`UPDATE crm_pay_billing SET status='PAID' WHERE billId='${billId}'`,
            function(err, results, fields)
            {
                if(err) resolve(err);
                else resolve(results)
            }
        )
    })
}


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Поскольку внутренности отличаются только выполняемым запросом, можно по количеству параметров "угадать" что надо выполнить

function myMultiFunc(){
  var args = Array.prototype.slice.call(arguments);
  var argc = arguments.length;
  console.log('we got '+argc+' arguments: ');  
  args.forEach(a => console.log(a));
  // По количеству аргументов не сможем распознать идентичные по количеству аргументов mysqlPayGetBills() и mysqlPayGetBillsNow()
  var querystring="";
  switch(argc){ // в зависимости от количества аргументов
    case 1: //mysqlPaySetBillsStatus(billId) - 1 параметр
           querystring = `UPDATE crm_pay_billing SET status='PAID' WHERE billId='${args[0]}'`; break;
    case 5: // MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role) - 5 параметров
           querystring = `INSERT crm_auth(ip, steam, refreshToken, token, role) VALUES ('${args[0]}', '${args[1]}', '${args[2]}', '${args[3]}', '${args[4]}')`; break;
    case 6: // mysqlPayAddBill(steamId, billId, payment, amount, time, status) - 6 параметров
           querystring = `INSERT crm_pay_billing(steam, billId, payment, amount, time, status) VALUES ('${args[0]}', '${args[1]}', '${args[2]}', '${args[3]}', '${args[4]}', '${args[5]}')`; break;
    default: // Если по количеству аргументов непонятно что вызвали
           console.log('Unknown arguments count :(');return;
  };
  console.log('we want to execute statement: '+querystring);
/*
  return new Promise((resolve, reject) => {
      connection.query(querystring,
          function(err, results, fields)
          {
              if(err) return err;
              else resolve(results)
          }
      )
  });
*/
}
//mysqlPaySetBillsStatus(billId)
myMultiFunc('billId');
// MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role)
myMultiFunc('ip', 'steam', 'refreshToken', 'token', 'role');
// mysqlPayAddBill(steamId, billId, payment, amount, time, status)
myMultiFunc('steamId','billId','payment','amount','time','status');

Отлаживать такое "добро" конечно и врагу не пожелаешь, плюс к этому варианты с одинаковым количеством аргументов различить не получится, поэтому можно принять соглашение о вызове - при вызове мультифункции, первый параметр - мнемоника операции

myMultiFunc('PaySetBillsStatus', 'billId');
myMultiFunc('LoginSteamSession','ip', 'steam', 'refreshToken', 'token', 'role');
myMultiFunc('PayAddBill','steamId','billId','payment','amount','time','status');
myMultiFunc('PayGetBills');
myMultiFunc('PayGetBillsNow');
→ Ссылка