import debug from 'debug';
import Rollbar from 'rollbar';
import {
  isHandledError,
  unwrapHandledError
} from '../utils/create-handled-error.js';

import { rollbar } from '../../../config/secrets';

const { appId } = rollbar;
const reporter = new Rollbar(appId);
const log = debug('fcc:middlewares:error-reporter');

const errTemplate = (error, req) => {
  const { message, stack } = error;
  return `
Time: ${new Date(Date.now()).toISOString()}
Error: ${message}
Is authenticated user: ${!!req.user}
Route: ${JSON.stringify(req.route, null, 2)}
Stack: ${stack}

// raw
${JSON.stringify(error, null, 2)}

`;
};

export function reportError(err) {
  return reporter.error(err.message, err);
}

export default function errrorReporter() {
  if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) {
    return (err, req, res, next) => {
      console.error(errTemplate(err, req));

      if (isHandledError(err)) {
        // log out user messages in development
        const handled = unwrapHandledError(err);
        log(handled.message);
      }
      next(err);
    };
  }
  return (err, req, res, next) => {
    // handled errors do not need to be reported,
    // they report a message and maybe redirect the user
    // errors with status codes shouldn't be reported
    // as they are usually user messages
    if (isHandledError(err) || err.statusCode || err.status) {
      return next(err);
    }
    // logging the error provides us with more information,
    // i.e isAuthenticatedUser, req.route
    console.error(errTemplate(err, req));
    reportError(err);
    return next(err);
  };
}

import debug from 'debug';
import Rollbar from 'rollbar';
import {
  isHandledError,
  unwrapHandledError
} from '../utils/create-handled-error.js';

import { rollbar } from '../../../config/secrets';

const { appId } = rollbar;
const reporter = new Rollbar(appId);
const log = debug('fcc:middlewares:error-reporter');

const errTemplate = (error, req) => {
  const { message, stack } = error;
  return `
Time: ${new Date(Date.now()).toISOString()}
Error: ${message}
Is authenticated user: ${!!req.user}
Route: ${JSON.stringify(req.route, null, 2)}
Stack: ${stack}

// raw
${JSON.stringify(error, null, 2)}

`;
};

export function reportError(err) {
  return process.env.NODE_ENV === 'production'
    ? reporter.error(err.message, err)
    : console.error(err);
}

export default function errrorReporter() {
  if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) {
    return (err, req, res, next) => {
      console.error(errTemplate(err, req));

      if (isHandledError(err)) {
        // log out user messages in development
        const handled = unwrapHandledError(err);
        log(handled.message);
      }
      next(err);
    };
  }
  return (err, req, res, next) => {
    // handled errors do not need to be reported,
    // they report a message and maybe redirect the user
    // errors with status codes shouldn't be reported
    // as they are usually user messages
    if (isHandledError(err) || err.statusCode || err.status) {
      return next(err);
    }
    // logging the error provides us with more information,
    // i.e isAuthenticatedUser, req.route
    console.error(errTemplate(err, req));
    reportError(err);
    return next(err);
  };
}

Use reportError in development