APCOvernight/huestatus

View on GitHub
src/Class.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict'

/**
 * Methods to be shared by all classes
 */
class BaseClass {
  /**
   * @param  {Object} config Configuration
   */
  constructor (config) {
    this.config = config
  }

  /**
   * Order of logLevel inheritance
   * @return {Array}
   */
  static get logLevels () {
    return ['error', 'info', 'debug']
  }

  /**
   * Should message be logged?
   * @param  {String} logLevel    Level of message
   * @param  {String} configLevel Configured log level threshold
   * @return {Boolean}
   */
  _shouldLog (logLevel, configLevel) {
    return BaseClass.logLevels.indexOf(logLevel) <= BaseClass.logLevels.indexOf(configLevel)
  }

  /**
   * Log an info message
   * @param  {String} message      Message to log
   * @param  {String} status       Status updated to
   * @param  {String} instanceName Instance that updated status
   */
  info (message, status, instanceName) {
    this.log('info', message, status, instanceName)
  }

  /**
   * Log a debug message
   * @param  {String} message      Message to log
   * @param  {String} status       Status updated to
   * @param  {String} instanceName Instance that updated status
   */
  debug (message, status, instanceName) {
    this.log('debug', message, status, instanceName)
  }

  /**
   * Log an error
   * @param  {String} message      Message to log
   */
  error (message) {
    this.log('error', message)
  }

  /**
   * Log a message to console if debug mode is turned on
   * @param  {String} level        Log level - debug, info or error
   * @param  {String} message      Message to be logged
   * @param  {String} status       The status to update it to
   * @param  {String} instanceName
   */
  log (level, message, status, instanceName) {
    this._logToReporters(level, message, status, instanceName)
  }

  /**
   * Send log to all registered reporters, depending on log level
   * @param  {String} level        Log level - debug, info or error
   * @param  {String} message      Message to be logged
   * @param  {String} status       The status to update it to
   * @param  {String} instanceName
   */
  _logToReporters (level, message, status, instanceName) {
    if (this.reporters) {
      this.reporters.map(reporter => {
        if (this._shouldLog(level, reporter.config.logLevel)) {
          reporter.log(level, status, `${instanceName ? instanceName + ' - ' : ''}${message}`)
        }
      })
    }
  }
}

module.exports = BaseClass