false, 'ERROR' => 'method_not_allowed'], 405); } $body = readJsonBody(); $ids = $body['IDs'] ?? []; $addresses = $body['Addresses'] ?? []; if (empty($ids) && empty($addresses)) { jsonResponse(['OK' => false, 'ERROR' => 'ids_or_addresses_required']); } // Cap at 100 $ids = array_slice(array_map('intval', $ids), 0, 100); $addresses = array_slice(array_map('trim', $addresses), 0, 100); $users = []; if (!empty($ids)) { $placeholders = implode(',', array_fill(0, count($ids), '?')); $rows = queryTimed("SELECT * FROM Sprinter_Agents WHERE ID IN ($placeholders)", $ids); foreach ($rows as $a) $users[(int) $a['ID']] = $a; } if (!empty($addresses)) { $placeholders = implode(',', array_fill(0, count($addresses), '?')); $rows = queryTimed("SELECT * FROM Sprinter_Agents WHERE FullAddress IN ($placeholders)", $addresses); foreach ($rows as $a) $users[(int) $a['ID']] = $a; } $formatted = []; foreach ($users as $a) { $formatted[] = [ 'ID' => (int) $a['ID'], 'AgentName' => $a['AgentName'], 'FullAddress' => $a['FullAddress'], 'ProjectName' => $a['ProjectName'], 'AgentType' => $a['AgentType'], 'Role' => $a['Role'], 'ServerHost' => $a['ServerHost'], 'IsActive' => (bool) $a['IsActive'], 'CreatedAt' => toISO8601($a['CreatedAt']), ]; } jsonResponse(['OK' => true, 'Users' => $formatted]);