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>
57 lines
1.7 KiB
PHP
57 lines
1.7 KiB
PHP
<?php
|
|
/**
|
|
* GET /api/hub/files/list.php
|
|
*
|
|
* List files in a channel.
|
|
*
|
|
* Query params:
|
|
* ChannelID int REQUIRED
|
|
* Limit int optional default 50, max 200
|
|
* Offset int optional default 0
|
|
*
|
|
* Response: { OK: true, Files: [...], Total: int }
|
|
*/
|
|
|
|
require_once __DIR__ . '/../../helpers.php';
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
|
|
jsonResponse(['OK' => false, 'ERROR' => 'method_not_allowed'], 405);
|
|
}
|
|
|
|
$channelId = (int) ($_GET['ChannelID'] ?? 0);
|
|
$limit = min(max((int) ($_GET['Limit'] ?? 50), 1), 200);
|
|
$offset = max((int) ($_GET['Offset'] ?? 0), 0);
|
|
|
|
if ($channelId <= 0) jsonResponse(['OK' => false, 'ERROR' => 'channel_id_required']);
|
|
|
|
$total = (int) (queryOne(
|
|
"SELECT COUNT(*) as cnt FROM Hub_Files WHERE ChannelID = ?",
|
|
[$channelId]
|
|
)['cnt'] ?? 0);
|
|
|
|
$rows = queryTimed(
|
|
"SELECT * FROM Hub_Files WHERE ChannelID = ? ORDER BY CreatedAt DESC LIMIT ? OFFSET ?",
|
|
[$channelId, $limit, $offset]
|
|
);
|
|
|
|
$files = [];
|
|
foreach ($rows as $r) {
|
|
$files[] = [
|
|
'ID' => (int) $r['ID'],
|
|
'MessageID' => $r['MessageID'] ? (int) $r['MessageID'] : null,
|
|
'ChannelID' => (int) $r['ChannelID'],
|
|
'UploaderAddress' => $r['UploaderAddress'],
|
|
'FileName' => $r['FileName'],
|
|
'FileSize' => (int) $r['FileSize'],
|
|
'MimeType' => $r['MimeType'],
|
|
'DownloadURL' => baseUrl() . '/' . $r['StoragePath'],
|
|
'ThumbnailURL' => $r['ThumbnailPath'] ? baseUrl() . '/' . $r['ThumbnailPath'] : null,
|
|
'CreatedAt' => toISO8601($r['CreatedAt']),
|
|
];
|
|
}
|
|
|
|
jsonResponse([
|
|
'OK' => true,
|
|
'Files' => $files,
|
|
'Total' => $total,
|
|
]);
|