Source: models/assets.js

const assetsparameterhelper = require('./assetsparametershelper');
let momentHelperObj = require('./momenthelper');
let momenthelper = new momentHelperObj();
/**
 * Class handles all assets related methods and also accessing assets in core database
 * @class
 */
class assets {
  /**
   * @constructor
   * @param {object} alogger Logger to be used in class methods (usually req.app.logger)
   */
  constructor(alogger) {
    // always initialize all instance properties
    this.logger = alogger;
  }

  /**
   * Returns list of assets in given warehouse
   * @param {integer} wId id of warehouse assets shall be loaded for
   * @param {function} callback rows or null
   */
  getAssetsForWarehouse(wId, callback) {
    let query = "SELECT * FROM assets WHERE warehouseId = ?";
    global.coreDb.all(query, [
      wId
    ], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Returns all assets for display in UI view
   * @param {function} callback rows or null
   */
  getListOfAssets(callback) {
    this.logger.debug('MODELS-ASSETS | Reading assets');

    let query = "SELECT assets.*, " +
      "assets_groups.name AS groupname, " +
      "assets_states.name AS statename, " +
      "assets_warehouses.name AS warehousename, " +
      "assets_warehouses.wareHousePath AS warehousepath, " +
      "assets_warehouses.description AS warehouseDescription, " +
      "assets_states.usable AS usable, " +
      "assets_states.maintenance AS maintenance " +
      "FROM `assets` " +
      "LEFT JOIN assets_groups ON assets.assetGroupId = assets_groups.id " +
      "LEFT JOIN assets_states ON assets.state = assets_states.id " +
      "LEFT JOIN assets_warehouses ON assets.warehouseId = assets_warehouses.id";

    global.coreDb.all(query, [], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Returns list of asset states from core database
   * @param {function} callback rows or null
   */
  getListOfAssetsStates(callback) {
    let query = "SELECT * FROM assets_states WHERE state = 1";

    global.coreDb.all(query, [], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Returns a single asset from core database
   * @param {integer} assetId id of asset to be returned out of core database
   * @param {*} callback row or null
   */
  getAssetwithId(assetId, callback) {
    let query = "SELECT * FROM assets WHERE id = ?";
    global.coreDb.all(query, [
      assetId
    ], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Returns a single asset from core database for given issi - number
   * @param {integer} issi issi to look for
   * @param {function} callback rows or null
   */
  getAssetForISSI(issi, callback) {
    let query = "SELECT * FROM assets WHERE issi = ?";
    global.coreDb.all(query, [
      issi
    ], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Returns all assets which can be alarmed (isGear === 1)
   * @param {function} callback rows or null
   */
  getAllAssetsWhichCanBeAlarmed(callback) {
    // let query = "SELECT id, title, state, isGear, gearname, issi FROM assets WHERE isGear = 1";
    let query = "SELECT assets.*, " +
    "assets_groups.name AS groupname, " +
    "assets_states.name AS statename, " +
    "assets_warehouses.name AS warehousename, " +
    "assets_warehouses.wareHousePath AS warehousepath, " +
    "assets_warehouses.description AS warehouseDescription, " +
    "assets_states.usable AS usable, " +
    "assets_states.maintenance AS maintenance " +
    "FROM `assets` " +
    "LEFT JOIN assets_groups ON assets.assetGroupId = assets_groups.id " +
    "LEFT JOIN assets_states ON assets.state = assets_states.id " +
    "LEFT JOIN assets_warehouses ON assets.warehouseId = assets_warehouses.id " + 
    "WHERE isGear = 1";

    global.coreDb.all(query, [
    ], (err, rows) => {
      if (err) {
        return null;
      } else {
        return callback(rows);
      }
    });
  }

  /**
   * Adds a new asset to core database
   * @param {object} reqBody form data (usually req.body)
   * @param {function} callback success (true / false)
   */
  addAsset(reqBody, callback) {
    let assetGroupId = reqBody.assetgroupid;
    let assetTitle = reqBody.title;
    let assetState = reqBody.state;
    let assetWarehouse = reqBody.warehouse;
    let assetIsGear = reqBody.isGear;     // is Asset an alarmable gear
    let assetGearName = reqBody.gearname; // name of asset in alarmings
    let assetIssi = reqBody.issi;         // ISSI for alarmable assets

    if (assetIsGear === 'on') {
      assetIsGear = 1;
    } else {
      assetIsGear = 0;
    }

    let assetsparameters = new assetsparameterhelper(this.logger);

    // Transform date for mysql query
    let assetDateBought = reqBody.date_bought;
    if (assetDateBought != '') {
      assetDateBought = momenthelper.formDateToMysql(assetDateBought);
    }

    let query = "INSERT INTO assets " +
      "(title, " +
      "assetGroupId, " +
      "warehouseId, " +
      "date_bought, " +
      "isGear, " + 
      "issi, " +
      "gearname, " +
      "state " +
      ") VALUES (?, ?, ?, ?, ?, ?, ?, ?)";

    global.coreDb.run(query, [
      assetTitle,
      assetGroupId,
      assetWarehouse,
      assetDateBought,
      assetIsGear,
      assetIssi,
      assetGearName,
      assetState
    ], function (err) {
      if (err) {
        console.log('ROUTES-ASSETS | Error writing new asset to database: ' + err.message);
        req.app.logger.error('ROUTES-ASSETS | Error writing new asset to database: ' + err.message);
        return callback(false);
      } else {
        var newAssetId = this.lastID;
        assetsparameters.getAssetsParametersForAssetGroup(assetGroupId, (resultAssetParameters) => {
          if (resultAssetParameters === false) {
            // Error reading asset parameters from database
            req.app.logger.error('ROUTES-ASSETS | Error reading asset parameters.');
            return callback(false);
          } else {
            // Recieved assets parameters.
            assetsparameters.persistParameterValuesInDatabase(newAssetId, reqBody, resultAssetParameters, (result) => {
              return callback(true);
            })
          }
        });
      }
    });
  }


  updateAsset(reqBody, callback) {
    let assetId = reqBody.assetId;
    let assetGroupId = reqBody.assetgroupid;
    let assetTitle = reqBody.title;
    let assetState = reqBody.state;
    let assetWarehouse = reqBody.warehouse;
    let assetIsGear = reqBody.isGear;     // is Asset an alarmable gear
    let assetGearName = reqBody.gearname; // name of asset in alarmings
    let assetIssi = reqBody.issi          // ISSI of asset for alarmable assets

    if (assetIsGear === 'on') {
      assetIsGear = 1;
    } else {
      assetIsGear = 0;
    }

    // Transform date for mysql query
    let assetDateBought = reqBody.date_bought;
    if (assetDateBought != '') {
      assetDateBought = momenthelper.formDateToMysql(assetDateBought);
    }

    let assetsparameters = new assetsparameterhelper();

    let query = "UPDATE assets SET " +
      "title =  ?, " +
      "assetGroupId = ?, " +
      "warehouseId = ?, " +
      "date_bought = ?, " +
      "isGear = ?, " +
      "issi = ?, " +
      "gearname = ?, " +
      "state = ? " +
      "WHERE id = ?";

    global.coreDb.run(query, [
      assetTitle,
      assetGroupId,
      assetWarehouse,
      assetDateBought,
      assetIsGear,
      assetIssi, 
      assetGearName,
      assetState,
      assetId
    ], function (err) {
      if (err) {
        console.log(`ERROR Updating asset in core database: ${err.message}`);
        callback(false);
      } else {
        assetsparameters.getAssetsParametersForAssetGroup(assetGroupId, (resultAssetParameters) => {
          if (resultAssetParameters === false) {
            // Error reading asset parameters from database
            callback(false);
          } else {
            // Recieved assets parameters.
            // Now update assets parameters
            assetsparameters.updateParameterValuesInDatabase(assetId, reqBody, resultAssetParameters, (resultUpdate) => {
              console.log('Result Updating Asset: ' + resultUpdate);
              if (resultUpdate) {
                callback(true);
              } else {
                callback(false);
              }
            });
          }
        });
      }
    });
  }

  /**
   * Removes an asset and referenced assets parameters from core database
   * @param {integer} assetId id of asset to be removed from database
   * @param {function} callback success (true or false)
   */
  removeAsset(assetId, callback) {
    let query = "DELETE FROM assets_parameters_store WHERE assetsId = ?";
    global.coreDb.run(query, [
      assetId,
    ], function (err) {
      if (err) {
        console.log(`ERROR Removing Assets parameters for deletion of asset: ${err.message}`);
        callback(false);
      } else {
        let queryDeleteAsset = "DELETE FROM assets WHERE id = ?";
        global.coreDb.run(queryDeleteAsset, [
          assetId,
        ], function (err) {
          if (err) {
            console.log(`ERROR Removing Asset from core database: ${err.message}`);
            callback(false);
          } else {
            callback(true);
          }
        });
      }
    });
  }
}



// export the class
module.exports = assets;