Skip to content

Контрибьютинг

Есть опыт внешнего контрибьютинга в 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.

Сайт обновлен и проверен: