pesto-students/batch-11-relayer

View on GitHub
server/thirdparty/controller/authController.js

Summary

Maintainability
A
3 hrs
Test Coverage
import axios from 'axios';
import AuthorizedApps from '../../models/AuthorizedApps';
import constants from '../constants/thirdPartyConstants';
import logger from '../../utils/logger';

const renderAuthRequestPage = (req, res) => {
  const appName = req.params.appName.toUpperCase();
  const { userId } = req;
  const authorizationRequestURL = `${constants[`${appName}_URL`]}&${constants[`${appName}_CLIENT_ID`]}&${constants[`${appName}_SCOPE`]}&${constants[`${appName}_REDIRECT_URL`]}&state=${userId}`;

  res.render('OAuthWindow', {
    authorizationRequestURL,
  });
};

const storeSlackCredentials = ({ data }, userId) => {
  const authorizedApp = {};
  authorizedApp.credentials = new Map();

  authorizedApp.appName = 'Slack';
  authorizedApp.userId = userId;
  authorizedApp.authToken = data.access_token;
  authorizedApp.credentials.set('slackUserId', data.user_id);
  authorizedApp.credentials.set('slackTeamId', data.team_id);
  authorizedApp.credentials.set('slackTeamName', data.team_name);

  return AuthorizedApps.create(authorizedApp);
};

const storeGithubCredentials = ({ data }, userId) => {
  console.log(data);
  const authorizedApp = {};
  authorizedApp.credentials = new Map();

  authorizedApp.appName = 'Github';
  authorizedApp.userId = userId;
  authorizedApp.authToken = data.access_token;
  authorizedApp.credentials.set('githubTokenType', data.token_type);


  return AuthorizedApps.create(authorizedApp);
};

const slackAuthGrant = async (req, res) => {
  const userId = req.query.state;
  const appName = 'SLACK';
  const authGrantURL = `${constants[`${appName}_AUTH_GRANT_URL`]}&${constants[`${appName}_CLIENT_ID`]}&${constants[`${appName}_CLIENT_SECRET`]}&code=${req.query.code}`;

  axios.get(authGrantURL)
    .then((response) => storeSlackCredentials(response, userId))
    .then(() => {
      res.render('authSuccess');
    })
    .catch((err) => {
      logger.error(err);
      res.render('authError');
    });
};

const githubAuthGrant = (req, res) => {
  const userId = req.query.state;
  const appName = 'GITHUB';
  const options = {
    url: `${constants[`${appName}_AUTH_GRANT_URL`]}&${constants[`${appName}_CLIENT_ID`]}&${constants[`${appName}_CLIENT_SECRET`]}&code=${req.query.code}`,
    method: 'POST',
    headers: { Accept: 'application/json' },
  };

  axios(options)
    .then((response) => storeGithubCredentials(response, userId))
    .then(() => {
      res.render('authSuccess');
    })
    .catch((err) => {
      logger.error(err);
      res.render('authError');
    });
};

const authController = {
  renderAuthRequestPage,
  slackAuthGrant,
  githubAuthGrant,
};

export default authController;