def get_permission_filters_unique()

in microservices/user_management/src/routes/permission.py [0:0]


def get_permission_filters_unique(application: Optional[str] = None,
                                  module: Optional[str] = None,
                                  action: Optional[str] = None,
                                  user_group: Optional[str] = None):
  """The get unique permission endpoint will return an array
  of unique values for applications, modules, actions and user groups from
  firestore

  ### Query:
      application: uuid of application that needs to be filtered
      module: uuid of module that needs to be filtered
      action: uuid of action that needs to be filtered
      user_group: uuid of user_group that needs to be filtered

  ### Raises:
      ResourceNotFoundException: 404 If the permission does not exist
      Exception: 500 Internal Server Error if something went wrong
      ValidationError: If filter length is more than 30 for any query param

  ### Returns:
      Dict containing list of unique filters for applications,
      modules, actions and user groups
  """
  try:
    permission_collection = Permission.collection
    unique_record_keys = ["uuid","name"]

    filter_limit_30_reached = False

    application_uuid_list = module_uuid_list = None
    action_uuid_list = user_group_uuid_list = None
    if application:
      application_uuid_list = application.split(",")
      if len(application_uuid_list) > 30:
        filter_limit_30_reached = True
      else:
        permission_collection = permission_collection.filter(
          "application_id", "in", application_uuid_list)
    if module:
      module_uuid_list = module.split(",")
      if len(module_uuid_list) > 30:
        filter_limit_30_reached = True
      else:
        permission_collection = permission_collection.filter(
          "module_id", "in", module_uuid_list)
    if action:
      action_uuid_list = action.split(",")
      if len(action_uuid_list) > 30:
        filter_limit_30_reached = True
      else:
        permission_collection = permission_collection.filter(
          "action_id", "in", action_uuid_list)
    if user_group:
      user_group_uuid_list = user_group.split(",")
      if len(user_group_uuid_list) > 30:
        filter_limit_30_reached = True
      else:
        permission_collection = permission_collection.filter(
          "user_groups", "array_contains_any", user_group_uuid_list)

    if filter_limit_30_reached:
      raise ValidationError(str("Filter has a limit of 30 values"))

    final_data = permission_collection.fetch()
    application_id_list = []
    module_id_list = []
    action_id_list = []
    user_group_id_list = []
    for each in final_data:
      application_id_list.append(each.get_fields()["application_id"])
      module_id_list.append(each.get_fields()["module_id"])
      action_id_list.append(each.get_fields()["action_id"])
      user_group_id_list.extend(each.get_fields()["user_groups"])

    if not application_id_list:
      unique_applications = []
    else:
      unique_applications = get_unique_records(
        Application.collection.filter(
        "uuid", "in", application_id_list).fetch(),unique_record_keys)

    if not module_id_list:
      unique_modules = []
    else:
      unique_modules = get_unique_records(
        Module.collection.filter(
        "uuid", "in", module_id_list).fetch(),unique_record_keys)

    if not action_id_list:
      unique_actions = []
    else:
      unique_actions = get_unique_records(
        Action.collection.filter(
        "uuid", "in", action_id_list).fetch(),unique_record_keys)

    if not user_group_id_list:
      unique_user_groups = []
    else:
      unique_user_groups = get_unique_records(
        UserGroup.collection.filter(
        "uuid", "in",user_group_id_list).fetch(),unique_record_keys)

    return {
      "success": True,
      "message": "Successfully fetched the unique values for " + \
        "applications, modules, actions and user_groups.",
      "data": {
          "applications": unique_applications,
          "modules": unique_modules,
          "actions": unique_actions,
          "user_groups": unique_user_groups
        }
    }
  except ResourceNotFoundException as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise ResourceNotFound(str(e)) from e
  except ValidationError as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise BadRequest(str(e)) from e
  except Exception as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise InternalServerError(str(e)) from e