service intervals

StreamTrackingService

StreamTrackingService

src/main/operator/interval-services/stream-tracking.service.ts

Записує інтервали стрімів анкет у локальну SQLite БД. Дані потім синкаються через DataSyncService на сервер для аналітики.


Не інтервальний

Не має власного циклу — викликається подіями від ManOnlineService (кожні ~15 сек).


Як працює запис стріму

Стрім — це інтервал { start, stop, isActive } для конкретної анкети (ladyId_api) за конкретну дату.

МетодТригерЩо робить
startStream(ladyId_api)ManOnline: false → trueЯкщо є попередній активний — закриває його. Створює новий запис isActive: true, start = now, stop = now + 1000
updateStream(ladyId_api)ManOnline: true → trueОновлює stop = now для активного інтервалу — розтягує його в часі
stopStream(ladyId_api, ts)ManOnline: true → falseЗакриває інтервал: `stop = timestamp

Розбиття по днях (splitIntervalIfNeeded)

Якщо стрім перетинає північ — автоматично розбивається на два інтервали:

  1. Старий інтервал: stop = 23:59:59.999 поточного дня
  2. Новий інтервал: start = 00:00:00.000 наступного дня, stop = now

Перевіряється при кожному stopStream та updateStream.


При старті програми

cleanupActiveStreamsOnStartup() — деактивує всі isActive = true записи що залишились від попередньої сесії (аварійне закриття, перезапуск). Виконується синхронно при start().


При зупинці

stop()stopAllStreams() — проходить по всіх ladyRunners і зупиняє кожен активний стрім з timestamp = now.


Формат для синку (getSteamsToSync)

Перед відправкою на сервер конвертує плоский список з БД у структуру IStreamDay[]:

IStreamDay {
  date: string            // '2025-04-16'
  ladies: IStreamLady[] {
    ladyId_api: number
    intervals: { id, start, stop, isActive }[]
  }
}

Групується по датах, потім по анкетах. Після успішного синку сервер повертає streamIds[] — ці записи видаляються з локальної БД.