Home Reference Source

src/lib/fieldContainsUserId.js

// @flow
/* eslint-disable max-len */

import _ from 'lodash';

/**
 * extracts a UserId from an _id object
 * @private
 * @param {object} userIdObject - user object
 * @return {string} newUserId - id of the user
 */

function extractUserId(userIdObject: any): any {
  let newUserId = '';
  if (_.isObject(userIdObject)) {
    Object.keys(userIdObject).forEach(field => {
      newUserId = userIdObject[field];
    });
  } else {
    newUserId = userIdObject;
  }
  return newUserId;
}

/**
 * checks, if a field contains a user's id
 * returns true, if a field of type array/object/string contains the userId
 * @public
 * @param {object} docRoleField - the field to be checked
 * @param {object} compressedUserId - the user id to test
 * @return {boolean} found - true if it contains the user id
 */

export function fieldContainsUserId(
  docRoleField: any,
  compressedUserId: any
): boolean {
  let found = false;

  // empty docRoleField is not a valid docRoleField
  if (!docRoleField || docRoleField === '' || docRoleField.length === 0) {
    return false;
  }

  // empty (compressed) userId is not a valid userId
  if (
    !compressedUserId ||
    compressedUserId === '' ||
    compressedUserId.toString() === ''
  ) {
    return false;
  }

  // extract userId, if it is a mongoID field
  const userId = extractUserId(compressedUserId);

  // empty (uncompressed) userId is not a valid userId
  if (!userId || userId === '') {
    return false;
  }

  // docRoleField of type Array
  if (_.isArray(docRoleField)) {
    docRoleField.forEach(field => {
      if (fieldContainsUserId(field, userId)) {
        found = true;
      }
    });
    if (found) {
      return true;
    }
    return false;
  }

  // docRoleField of type Object
  if (_.isObject(docRoleField)) {
    // For each field in the object
    Object.keys(docRoleField).forEach(field => {
      if (
        fieldContainsUserId(docRoleField[field], userId) ||
        fieldContainsUserId(field, userId)
      ) {
        found = true;
      }
    });
    if (found) {
      return true;
    }
    return false;
  }

  // docRoleField of type field
  if (docRoleField.toString() === userId.toString()) {
    return true;
  }

  return false;
}