( executor: AsyncSqlExecutor, afterId: number, limit: number = 50, filter?: TimeFilter, senderId?: number, keywords?: string[] )
| 86 | * Results are returned in ascending order. |
| 87 | */ |
| 88 | export async function fetchMessagesAfter( |
| 89 | executor: AsyncSqlExecutor, |
| 90 | afterId: number, |
| 91 | limit: number = 50, |
| 92 | filter?: TimeFilter, |
| 93 | senderId?: number, |
| 94 | keywords?: string[] |
| 95 | ): Promise<AsyncPaginatedMessages> { |
| 96 | const { clause, params } = filterConditions(filter, senderId, keywords) |
| 97 | const sql = `${FULL_MSG_SELECT} WHERE msg.id > ? ${clause} ORDER BY msg.id ASC LIMIT ?` |
| 98 | const rows = await executor.all<FullMessageRow>(sql, [afterId, ...params, limit + 1]) |
| 99 | const hasMore = rows.length > limit |
| 100 | const sliced = hasMore ? rows.slice(0, limit) : rows |
| 101 | return { messages: sliced.map(mapMessageRow), hasMore } |
| 102 | } |
| 103 | |
| 104 | /** |
| 105 | * LIKE-based keyword search with count + pagination. |
no test coverage detected