false, 'ERROR' => 'method_not_allowed'], 405); } $id = (int) ($_GET['ID'] ?? 0); $name = trim($_GET['Name'] ?? ''); if ($id <= 0 && $name === '') { jsonResponse(['OK' => false, 'ERROR' => 'id_or_name_required']); } if ($id > 0) { $channel = queryOne("SELECT * FROM Hub_Channels WHERE ID = ?", [$id]); } else { $channel = queryOne("SELECT * FROM Hub_Channels WHERE Name = ?", [$name]); } if (!$channel) { jsonResponse(['OK' => false, 'ERROR' => 'channel_not_found'], 404); } // Fetch members $members = queryTimed( "SELECT m.*, a.AgentName, a.AgentType, a.Role AS AgentRole FROM Hub_ChannelMembers m LEFT JOIN Sprinter_Agents a ON a.FullAddress = m.AgentAddress WHERE m.ChannelID = ? ORDER BY m.JoinedAt ASC", [(int) $channel['ID']] ); $memberList = []; foreach ($members as $m) { $memberList[] = [ 'AgentAddress' => $m['AgentAddress'], 'AgentName' => $m['AgentName'] ?? '', 'AgentType' => $m['AgentType'] ?? '', 'Role' => $m['Role'], 'JoinedAt' => toISO8601($m['JoinedAt']), 'LastViewedAt' => $m['LastViewedAt'] ? toISO8601($m['LastViewedAt']) : null, ]; } jsonResponse([ 'OK' => true, 'Channel' => [ 'ID' => (int) $channel['ID'], 'Name' => $channel['Name'], 'DisplayName' => $channel['DisplayName'], 'Purpose' => $channel['Purpose'], 'ChannelType' => $channel['ChannelType'], 'CreatedBy' => $channel['CreatedBy'], 'IsArchived' => (bool) $channel['IsArchived'], 'CreatedAt' => toISO8601($channel['CreatedAt']), 'UpdatedAt' => toISO8601($channel['UpdatedAt']), 'MemberCount' => count($memberList), ], 'Members' => $memberList, ]);