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>
63 lines
1.8 KiB
PHP
63 lines
1.8 KiB
PHP
<?php
|
|
/**
|
|
* GET /api/hub/users/status.php
|
|
*
|
|
* Get an agent's online/activity status based on channel membership activity.
|
|
*
|
|
* Query params:
|
|
* Address string REQUIRED agent address
|
|
*
|
|
* Response: { OK: true, Status: { ... } }
|
|
*/
|
|
|
|
require_once __DIR__ . '/../../helpers.php';
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
|
|
jsonResponse(['OK' => false, 'ERROR' => 'method_not_allowed'], 405);
|
|
}
|
|
|
|
$address = trim($_GET['Address'] ?? '');
|
|
if ($address === '') jsonResponse(['OK' => false, 'ERROR' => 'address_required']);
|
|
|
|
$agent = queryOne("SELECT * FROM Sprinter_Agents WHERE FullAddress = ?", [$address]);
|
|
if (!$agent) jsonResponse(['OK' => false, 'ERROR' => 'user_not_found']);
|
|
|
|
// Get last activity from channel memberships
|
|
$lastActivity = queryOne(
|
|
"SELECT MAX(LastViewedAt) as LastSeen FROM Hub_ChannelMembers WHERE AgentAddress = ?",
|
|
[$address]
|
|
);
|
|
|
|
// Get last message sent
|
|
$lastMessage = queryOne(
|
|
"SELECT MAX(CreatedAt) as LastMessageAt FROM Hub_Messages WHERE SenderAddress = ? AND IsDeleted = 0",
|
|
[$address]
|
|
);
|
|
|
|
$lastSeen = $lastActivity['LastSeen'] ?? null;
|
|
$lastMessageAt = $lastMessage['LastMessageAt'] ?? null;
|
|
|
|
// Use the most recent of the two
|
|
$latestActivity = null;
|
|
if ($lastSeen && $lastMessageAt) {
|
|
$latestActivity = max($lastSeen, $lastMessageAt);
|
|
} else {
|
|
$latestActivity = $lastSeen ?: $lastMessageAt;
|
|
}
|
|
|
|
// Consider "online" if active in last 5 minutes
|
|
$isOnline = false;
|
|
if ($latestActivity) {
|
|
$diff = time() - strtotime($latestActivity);
|
|
$isOnline = ($diff < 300);
|
|
}
|
|
|
|
jsonResponse([
|
|
'OK' => true,
|
|
'Status' => [
|
|
'Address' => $address,
|
|
'IsOnline' => $isOnline,
|
|
'LastActivityAt' => $latestActivity ? toISO8601($latestActivity) : null,
|
|
'IsActive' => (bool) $agent['IsActive'],
|
|
],
|
|
]);
|