Last online calculates only on the last 10 minutes
Онлайн считается на основе последних интервалов, которые, в свою очередь, считаются вот так:
app/core/service/timeline.js:169
loadLatestIntervals(userIDs, projectIDs) {
const endAt = moment();
const startAt = endAt.clone().subtract(10, 'minutes');
return this.timeIntervalService
.getDashboardIntervals(userIDs, projectIDs, startAt, endAt)
Что приводит нас к такой ситуации:
- У человека задан период скриншотов в 10 минут.
- Скрины делаются каждые 10 минут и он появляется в онлайне только на момент скрина и через минуту-другую пропадает и невозможно понять: остановил он трекер или еще нет.
Решение
Бэкенд
- Добавить для пользователя поле
last_activity
. Оно будет содержать время когда последний раз юзер отправил heartbeat. - Добавить в
.env
коэффициент неактивности пользователей и времяheartbeat
запросов
Фронт
- Определяем онлайн пользователь или нет по полю
last_activity
, модифицируем все аватарки в системе, чтобы они отображали текущее состояние пользователя
Клиент
- Если пользователь имеет
last_activity
< (Коэффициент) * n (время heartbeat), то не даем ему стартовать трекинг для избежания трекинга в двух клиентах - Раз в n времени отправляется heartbeat запрос на бэк, потверждающий онлайн клиента
Edited by Alex Vyarvelsky