Source: controllers/Admins.js

'use strict';

/**
 * API controller for admin methods mapping.
 * @module controllers/admins
 * @license MIT
 * @author Kai KRETSCHMANN <kai@kretschmann.consulting>
 */

const utils = require('../utils/writer.js');
const eventEmitter = require('../utils/eventer').em;
const PackagesService = require('../service/PackagesService');
const UsersService = require('../service/UsersService');
const mongoose = require('mongoose');
const auth = require('../utils/auth');
const fs = require('fs');
const path = require('path');

const log4js = require('log4js');
const logger = log4js.getLogger();
logger.level = process.env.LOGLEVEL || /* istanbul ignore next */ 'warn'; // LCOV_EXCL_LINE
const EVENTNAME = 'apihit';

/**
 * Receive login data and return JWT token.
 * @function loginPost
 * @public
 */
module.exports.loginPost = function loginPost (args, res, _next) {
  const username = args.body.username;
  const password = args.body.password;
  let response;

  eventEmitter.emit('posthit', 'login');

  UsersService.checkUser(username, password)
    .then(function (useritem) {
      logger.info(`User found: ${useritem._id}`);
      const myRole = useritem.role;
      logger.info(`User has role ${myRole}`);
      const tokenString = auth.issueToken(username, myRole);
      response = {
        token: tokenString
      };
      res.writeHead(200, {
        'Content-Type': 'application/json'
      });
      return res.end(JSON.stringify(response));
    })
    .catch(function () {
      response = {
        message: 'Error: Credentials incorrect'
      };
      res.writeHead(403, {
        'Content-Type': 'application/json'
      });
      return res.end(JSON.stringify(response));
    });
};

/**
 * List all packages and variations.
 * @function listUsers
 * @public
 */
module.exports.listUsers = function listUsers (req, res, _next) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.listUsers()
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 500);
    });
};

/**
 * Get user data of named user.
 * @function getUser
 * @public
 */
module.exports.getUser = function getUser (req, res, _next, name) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.getUser(name)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List all packages and variations.
 * @function deleteUser
 * @public
 */
module.exports.deleteUser = function deleteUser (req, res, _next, id) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.deleteUser(id)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List all packages and variations.
 * @function putUserStatus
 * @public
 */
module.exports.putUserStatus = function putUserStatus (req, res, _next, status, id) {
  eventEmitter.emit(EVENTNAME, req);

  logger.info(`putUserStatus ${id}/${status}!`);

  UsersService.putUserStatus(id, status)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List all packages and variations.
 * @function listUser
 * @public
 */
module.exports.listUser = function listUser (req, res, _next, id) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.listUser(id)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List all black listed domains.
 * @function listDomains
 * @public
 */
module.exports.listDomains = function listDomains (req, res, _next) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.listDomains()
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * Add a black listed domains.
 * @function addDomain
 * @public
 */
module.exports.addDomain = function listDomains (req, res, _next, name) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.addDomain(name)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * Delete a black listed domains.
 * @function deleteDomain
 * @public
 */
module.exports.deleteDomain = function deleteDomain (req, res, _next, name) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.deleteDomain(name)
    .then(function (payload) {
      utils.writeText(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeText(res, err.message, err.code);
    });
};

/**
 * Retreive a given domain.
 * @function checkDomain
 * @public
 */
module.exports.checkDomain = function checkDomain (req, res, _next, name) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.checkDomain(name)
    .then(function (payload) {
      if (payload == null) {
        utils.writeJson(res, {
          message: 'Not found'
        }, 404);
      } else {
        utils.writeJson(res, payload, 200);
      }
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * Create a user.
 * @function createUser
 * @public
 */
module.exports.createUser = function createUser (req, res, _next, user) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.createUser(user)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List all packages and variations but filter.
 * @function searchPackages
 * @public
 */
module.exports.searchPackages = function searchPackages (req, res, _next, jsearch) {
  eventEmitter.emit(EVENTNAME, req);

  PackagesService.searchPackages(jsearch)
    .then(function (payload) {
      logger.error('Found search result');
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeText(res, err.message, err.code);
    });
};

/**
 * Update user data via patch.
 * @function patchUser
 * @public
 */
module.exports.patchUser = function patchUser (req, res, _next, jpatch, id) {
  logger.info('In PATCH controller');
  eventEmitter.emit(EVENTNAME, req);
  logger.info(req.headers['content-type']);

  UsersService.patchUser(id, jpatch)
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * Delete package with given package data.
 * @function deletePackage
 * @public
 */
module.exports.deletePackage = function deletePackage (req, res, _next, packageName, packageVersion, packageArch, packageFamily, packageHash) {
  eventEmitter.emit(EVENTNAME, req);

  PackagesService.deletePackage(packageName, packageVersion, packageArch, packageFamily, packageHash)
    .then(function (payload) {
      utils.writeText(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeText(res, err.message, err.code);
    });
};

/**
 * Delete package with given package id.
 * @function deletePackageById
 * @public
 */
module.exports.deletePackageById = function deletePackageById (req, res, _next, id) {
  eventEmitter.emit(EVENTNAME, req);

  PackagesService.deletePackageById(id)
    .then(function (payload) {
      utils.writeText(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeText(res, err.message, err.code);
    });
};

/**
 * Get all system version names.
 * @function getVersions
 * @public
 */
module.exports.getVersions = function getVersions (req, res, _next) {
  eventEmitter.emit(EVENTNAME, req);

  const jdata = process.versions;
  const json = require('../package.json');
  const gitrevFilename = path.join(__dirname, '../.gitrevision');
  let gitrevision = '';

  try {
    fs.accessSync(gitrevFilename, fs.constants.R_OK);
    gitrevision = fs.readFileSync(gitrevFilename, 'utf8');
  } catch (err) {
    logger.error(`gitrevision file not found at: ${gitrevFilename}`);
  }

  jdata.bintra = json.version;
  logger.debug(`bintra version found: ${jdata.bintra}`);

  jdata.gitrevision = gitrevision.trim();
  logger.debug(`git revision found: ${jdata.gitrevision}`);

  // get DB version
  const admin = new mongoose.mongo.Admin(mongoose.connection.db);
  let myinfo;
  async function doinfo () {
    myinfo = await admin.buildInfo();
  }
  doinfo()
    .then(() => {
      logger.debug(`mongo version found: ${myinfo.version}`);
      jdata.mongodb = myinfo.version;
      const payload = JSON.stringify(jdata);
      res.writeHead(200, {
        'Content-Type': 'application/json'
      });

      logger.info('return');
      return res.end(payload);
    })
    .catch(err => {
      logger.error('We have a probleme here: ' + err)
      res.writeHead(500, {
        'Content-Type': 'text/plain'
      });
      return res.end();
    });
};

/**
 * Get count per creator.
 * @function getCountPerCreator
 * @public
 **/
module.exports.getCountPerCreator = function getCountPerCreator (req, res, _next) {
  eventEmitter.emit(EVENTNAME, req);

  PackagesService.countPerCreator()
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};

/**
 * List authentication log.
 * @function getLogauth
 * @public
 */
module.exports.getLogauth = function getLogauth (req, res, _next) {
  eventEmitter.emit(EVENTNAME, req);

  UsersService.getLogauth()
    .then(function (payload) {
      utils.writeJson(res, payload, 200);
    })
    .catch(function (err) {
      utils.writeJson(res, err.message, 400);
    });
};