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>
70 lines
2.1 KiB
PHP
70 lines
2.1 KiB
PHP
<?php
|
|
/**
|
|
* GET /api/hub/channels/stats.php
|
|
*
|
|
* Get channel statistics: member count, message count, pinned count, unread count.
|
|
*
|
|
* Query params:
|
|
* ChannelID int REQUIRED
|
|
* AgentAddress string optional if provided, includes unread count for this agent
|
|
*
|
|
* Response: { OK: true, Stats: { ... } }
|
|
*/
|
|
|
|
require_once __DIR__ . '/../../helpers.php';
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
|
|
jsonResponse(['OK' => false, 'ERROR' => 'method_not_allowed'], 405);
|
|
}
|
|
|
|
$channelId = (int) ($_GET['ChannelID'] ?? 0);
|
|
$agentAddress = trim($_GET['AgentAddress'] ?? '');
|
|
|
|
if ($channelId <= 0) jsonResponse(['OK' => false, 'ERROR' => 'channel_id_required']);
|
|
|
|
$channel = queryOne("SELECT ID FROM Hub_Channels WHERE ID = ?", [$channelId]);
|
|
if (!$channel) jsonResponse(['OK' => false, 'ERROR' => 'channel_not_found']);
|
|
|
|
$memberCount = (int) (queryOne(
|
|
"SELECT COUNT(*) as cnt FROM Hub_ChannelMembers WHERE ChannelID = ?",
|
|
[$channelId]
|
|
)['cnt'] ?? 0);
|
|
|
|
$messageCount = (int) (queryOne(
|
|
"SELECT COUNT(*) as cnt FROM Hub_Messages WHERE ChannelID = ? AND IsDeleted = 0",
|
|
[$channelId]
|
|
)['cnt'] ?? 0);
|
|
|
|
$pinnedCount = (int) (queryOne(
|
|
"SELECT COUNT(*) as cnt FROM Hub_PinnedPosts WHERE ChannelID = ?",
|
|
[$channelId]
|
|
)['cnt'] ?? 0);
|
|
|
|
$unreadCount = 0;
|
|
if ($agentAddress !== '') {
|
|
$membership = queryOne(
|
|
"SELECT LastViewedAt FROM Hub_ChannelMembers WHERE ChannelID = ? AND AgentAddress = ?",
|
|
[$channelId, $agentAddress]
|
|
);
|
|
if ($membership && $membership['LastViewedAt']) {
|
|
$unreadCount = (int) (queryOne(
|
|
"SELECT COUNT(*) as cnt FROM Hub_Messages
|
|
WHERE ChannelID = ? AND IsDeleted = 0 AND CreatedAt > ?",
|
|
[$channelId, $membership['LastViewedAt']]
|
|
)['cnt'] ?? 0);
|
|
} elseif ($membership) {
|
|
// Never viewed — all messages are unread
|
|
$unreadCount = $messageCount;
|
|
}
|
|
}
|
|
|
|
jsonResponse([
|
|
'OK' => true,
|
|
'Stats' => [
|
|
'ChannelID' => $channelId,
|
|
'MemberCount' => $memberCount,
|
|
'MessageCount' => $messageCount,
|
|
'PinnedCount' => $pinnedCount,
|
|
'UnreadCount' => $unreadCount,
|
|
],
|
|
]);
|