Sub-Pages — Troubleshooting: API Issues

API Response Handling for Member Operations

When adding/removing members via *_add_user, *_remove_user, etc., handle the response structure carefully.

API Response Structure:

{
  "result": {
    "completed": 2,
    "failed": { "memberuser": { "user": [], "group": [] } },
    "result": { "cn": ["rule_name"], "memberuser_user": ["user1", "user2"] }
  },
  "error": null
}

Key points:

  • error is at the top level (data.error), NOT inside data.result

  • completed — Number of successfully added/removed members (use for success check!)

  • failed — Which members could not be added/removed

Correct pattern:

addMemberToEntity(payload).then((response) => {
  if ("data" in response) {
    const data = response.data;
    
    // 1. Check for API-level error first
    if (data?.error) {
      dispatch(addAlert({ title: "Error: " + data.error, variant: "danger" }));
      return;
    }
    
    // 2. Check result and use 'completed' for success
    if (data?.result) {
      const results = data.result as unknown as AddRemoveMemberResult;
      
      // 2a. Check for partial failures
      const failedMembers = results.failed?.memberuser?.user || [];
      if (failedMembers.length > 0) {
        dispatch(addAlert({ 
          title: "Some members could not be added: " + failedMembers.join(", "), 
          variant: "danger" 
        }));
      }
      
      // 2b. Use 'completed' count for success
      if (results.completed > 0) {
        dispatch(addAlert({ 
          title: "Added " + results.completed + " member(s)", 
          variant: "success" 
        }));
      }
      
      props.onRefresh();
    }
  }
});

Common mistakes:

// ❌ Using containsAny to verify success (type mismatches can cause failures)
if (containsAny(membersFromResponse, newMembers)) { ... }

// ❌ Checking results.error (doesn't exist in this structure!)
if (results && !results.error) { ... }

API Error: “Unknown option: memberuser_user”

Symptom: When saving, API returns error like {"code": 3005, "message": "Unknown option: memberuser_user"}.

Root Cause: The *_mod API endpoint does NOT accept member fields. These must be managed via separate *_add_* and *_remove_* endpoints.

Solution: Filter out member fields in the save mutation:

saveEntity: build.mutation<FindRPCResponse, Partial<Entity>>({
  query: (entity) => {
    const params = { ...entity };
    delete params["cn"];
    delete params["dn"];
    // Member fields are NOT valid for *_mod API
    delete params["memberuser_user"];
    delete params["memberuser_group"];
    delete params["memberhost_host"];
    delete params["memberhost_hostgroup"];
    delete params["memberuser"];
    delete params["memberhost"];
    return getCommand({
      method: "entity_mod",
      params: [[entity.cn], params],
    });
  },
}),

Fields to exclude:

  • Member arrays: memberuser_user, memberuser_group, memberhost_host, memberhost_hostgroup

  • Aggregate arrays: memberuser, memberhost

  • Read-only: dn

See Category Toggle + Tables for the complete pattern.