Sub-Pages — Troubleshooting: API Issues¶
Part of: Troubleshooting See also: Form Issues | Save/Revert
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:
erroris at the top level (data.error), NOT insidedata.resultcompleted— 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_hostgroupAggregate arrays:
memberuser,memberhostRead-only:
dn
See Category Toggle + Tables for the complete pattern.