const errors = require('../../errors');
const TokensService = require('../../services/tokens');
const { CREATE_TOKEN, REVOKE_TOKEN } = require('../../perms/constants');

// Creates a new token for a user.
const createToken = async ({ user }, { name }) => {
  let { pat, jwt } = await TokensService.create(user.id, name);

  // Attach the token to the PAT.
  pat.jwt = jwt;

  // Return that PAT!
  return pat;
};

// Revokes the token from the user.
const revokeToken = async ({ user }, { id }) => {
  return TokensService.revoke(user.id, id);
};

module.exports = context => {
  let mutators = {
    Token: {
      create: () => Promise.reject(errors.ErrNotAuthorized),
      revoke: () => Promise.reject(errors.ErrNotAuthorized),
    },
  };

  if (context.user && context.user.can(CREATE_TOKEN)) {
    mutators.Token.create = input => createToken(context, input);
  }

  if (context.user && context.user.can(REVOKE_TOKEN)) {
    mutators.Token.revoke = input => revokeToken(context, input);
  }

  return mutators;
};
