Complete backend for SprintChat Hub migration: - Messages: send, edit, delete, list (paginated cursor), thread, search - Files: upload (multipart), download, thumbnail, info, list - Users: get, getByIds, search, status (online detection) - Reactions: add, remove, list (grouped by emoji) - Pins: pin, unpin, list (with message content) - Channel stats: member/message/pinned/unread counts 4 new DB tables: Hub_Messages, Hub_Files, Hub_Reactions, Hub_PinnedPosts 21 new endpoints added to PUBLIC_ROUTES Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1 KiB
PHP
41 lines
1 KiB
PHP
<?php
|
|
/**
|
|
* GET /api/hub/reactions/list.php
|
|
*
|
|
* Get all reactions for a message, grouped by emoji.
|
|
*
|
|
* Query params:
|
|
* MessageID int REQUIRED
|
|
*
|
|
* Response: { OK: true, Reactions: [ { EmojiName: "...", Count: N, Agents: [...] } ] }
|
|
*/
|
|
|
|
require_once __DIR__ . '/../../helpers.php';
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
|
|
jsonResponse(['OK' => false, 'ERROR' => 'method_not_allowed'], 405);
|
|
}
|
|
|
|
$messageId = (int) ($_GET['MessageID'] ?? 0);
|
|
if ($messageId <= 0) jsonResponse(['OK' => false, 'ERROR' => 'message_id_required']);
|
|
|
|
$rows = queryTimed(
|
|
"SELECT * FROM Hub_Reactions WHERE MessageID = ? ORDER BY EmojiName, CreatedAt",
|
|
[$messageId]
|
|
);
|
|
|
|
// Group by emoji
|
|
$grouped = [];
|
|
foreach ($rows as $r) {
|
|
$emoji = $r['EmojiName'];
|
|
if (!isset($grouped[$emoji])) {
|
|
$grouped[$emoji] = ['EmojiName' => $emoji, 'Count' => 0, 'Agents' => []];
|
|
}
|
|
$grouped[$emoji]['Count']++;
|
|
$grouped[$emoji]['Agents'][] = $r['AgentAddress'];
|
|
}
|
|
|
|
jsonResponse([
|
|
'OK' => true,
|
|
'Reactions' => array_values($grouped),
|
|
]);
|