Source: services/resetTokens/validate.service.js

import moment from 'moment';
import { ResetToken } from '../../database';
import { logger } from '../../utils';

/**
 * Check if UserId and token returns a record. Then check the record to see if it is used or expired.
 *
 * @memberof module:services/resetTokens
 * @param {String} UserId User ID to check token against.
 * @param {String} token Token to confirm.
 * @return {Boolean} Return true if UserId and token is validate.
 * @requires module:database/ResetToken
 * @requires module:utils/logger
 * @requires moment
 * @example
 * import { resetTokens as resetTokensService } from '/src/services';
 * const UserId = 1;
 * const token = 'kjdfoOIJDFioeh390udfLKJ09dufjoidfj';
 * const isValid = resetTokensService(UserId, token);
 */
const validateToken = async (UserId, token) => {
  try {
    // Check UserId and token value has been passed in
    if (!UserId || !token) throw new Error('SERVICE ERROR: Insufficient parameters to validate reset token.');

    // Find the reset token instance
    const foundResetToken = await ResetToken.findOne({
      where: {
        UserId: UserId,
        token: token,
      },
    });

    // Check if a reset token instance was returned
    if (!foundResetToken) throw new Error('SERVICE ERROR: Invalid reset token.');

    // Check if the reset token record has already been used
    if (foundResetToken.isUsed) throw new Error('SERVICE ERROR: Reset token has already been used.');

    // Check if the reset token has expired
    const now = new Date();
    if (moment(now).isAfter(moment(foundResetToken.expiration))) throw new Error('SERVICE ERROR: Reset token has expired.');

    return true;
  } catch (error) {
    // If running a test log error message to console because logger doesn't when testing
    // if (process.env.NODE_ENV = 'test') console.log(err.message)
    // console.log(error);
    logger.debug(error.message);
    return false;
    // throw error
  }
};

export { validateToken };
export default { token: validateToken };