Календарь и баг, который живёт три дня в месяц
От зависаний на больших объёмах до ошибки, которая воспроизводится только 29–31 числа.
коммиты: a05ded8e1ced648a064c7
Объём
Календарь загружал все занятия разом, и с ростом базы страница перестала отвечать. Перевёл на помесячную подгрузку с кэшем в Redis: открывается текущий месяц, остальные догружаются по запросу.
«Февраля нет»
29 января календарь на февраль оказался пустым. new Date() брал сегодняшнее 29-е число, и установка месяца превращала несуществующее 29 февраля в 1 марта. Исправление в одну строку, но баг появляется только в последние дни длинных месяцев, поэтому его долго не ловили.
// было: сегодня 29.01 → «29.02» → 01.03
- date.setMonth(monthIndex);
+ date.setDate(1);
+ date.setMonth(monthIndex);
Сдвиг сетки
Месяцы в JavaScript считаются с нуля, в интерфейсе с единицы. В одном месте индекс не пересчитывался, и сетка строилась под предыдущий месяц.
Кэш
При просмотре чужих календарей кэш отдавал данные другого месяца. Разобрал ключи и инвалидацию: версия в ключе для общего сброса, точечная очистка при изменениях.