Контрибьютинг
Есть опыт внешнего контрибьютинга в open-source проекте Buggregator, включая backend- и frontend-изменения.
PR-ссылки
buggregator/server#305— исправление генерацииOpenAPI: удаление дублирующихсяAttachment schema;buggregator/server#306— курсорная пагинация событий и связанные изменения API;buggregator/frontend#247— frontend-часть пагинации событий и infinite scrolling;buggregator/frontend#245— автоматическое удаление событий на frontend-стороне.
Изменения из этих PR добавлены в новую версию Buggregator.
Пагинация событий
Реализовал задачу Add events pagination для Buggregator как набор связанных изменений в server#306 и frontend#247.
Основная цель была в том, чтобы организовать стабильную постраничную загрузку событий в динамической ленте с infinite scroll, где новые элементы постоянно добавляются в начало списка.
Ключевое решение
Для API выбрал не классическую offset-пагинацию, а курсорный подход с композитным курсором.
Сервер возвращает:
limit;has_more;next_cursor.
next_cursor содержит указатель на последний загруженный элемент в виде пары <timestamp, uuid>, закодированной в base64. Следующий запрос получает только события, которые идут строго после этой пары значений.
Такой подход позволяет избежать дублей и пропусков при изменении ленты и сохраняет стабильный порядок даже при одинаковых timestamp.
Что сделал на backend
- добавил поддержку курсорной пагинации в
/api/eventsи/api/events/previewс сохранением обратной совместимости; - учёл сортировку по
timestamp, который хранится строкой, и использовал приведение типа вSQL; - добавил endpoint
/api/events/type-countsдля получения количества событий по типам; - подготовил документацию и тесты для новых API.
Что сделал на frontend
- организовал параллельную загрузку счётчиков и первых страниц событий по типам;
- реализовал догрузку через
IntersectionObserverсrootMargin=200px; - добавил передачу
next_cursorпри загрузке следующих страниц; - обработал пограничные сценарии, когда скролл не появляется сразу, observer не срабатывает или позиция прокрутки мешает автоматической догрузке;
- реализовал плавный infinite scroll для динамической ленты, где новые события могут появляться сверху, а старые подгружаются по мере прокрутки вниз.
Результат
В результате удалось убрать прежнее ограничение на 100 событий и перейти к динамической загрузке полного списка событий из базы по мере прокрутки.
Автоматическое удаление событий
В frontend#245 реализовал отдельную frontend-задачу по автоматическому удалению событий. Решение сделал на стороне клиента без усложнения backend-логики: добавил настройку Delete Events After, автоудаление новых событий по таймеру, исключение для locked-событий, корректное обновление и очистку таймеров при изменении состояния, а также синхронизацию удаления через WebSocket.