Что нового за неделю с 13 по 19 июля
Неделя выдалась тихо-героической: команда не выпускала фейерверков, но методично укрепляла фундамент Planner. Большая часть правок ушла под капот — авторизация, изоляция хранилищ, честный commit в PostgreSQL, обязательный CI и безопасный деплой — то самое, что пользователь не видит, но сразу чувствует, когда всё просто работает. Параллельно разобрали на домены ядро и сервер, ужали клиентский бандл и наконец разделили состояние, так что интерфейс стал заметно отзывчивее. А сверху — понятные ошибки, починенные уведомления о ритуалах и возвращённая история изменений проекта: мелочи, которые возвращают доверие к продукту. Если бы код был квартирой, эту неделю можно было бы назвать генеральной уб
Новые фишечки
2Добавили ограничения и связи в PostgreSQL
В схеме PostgreSQL появились явные ограничения и связи между таблицами: данные перестали жить как попало, а целостность теперь проверяется на уровне базы. Это снижает риск появления «осиротевших» записей и упрощает поддержку проекта в будущем.
Провели рефакторинг кода
Привели кодовую базу Planner в порядок: переработали структуру модулей, убрали дубли и устаревшие зависимости, выровняли стиль. Команда получила более удобную базу для дальнейших фич — новые сценарии добавляются быстрее, а баги проще воспроизводить и чинить.
Улучшения
18Допилили авторизацию после обновления
Разобрали хвост мелких проблем, оставшихся после обновления авторизации в сервисе. Сессии стали стабильнее, а вход и выход теперь работают без сюрпризов вроде внезапных разлогинов. Пользователи больше не натыкаются на старые баги авторизации.
Закрыли прямой доступ к Node.js и спрятали proxy-заголовки
Перекрыли прямой доступ к Node.js снаружи и почистили прокси-заголовки от лишней информации. Сервис перестал отдавать технические детали наружу и стал заметно безопаснее для пользователей и их данных.
Перевели доступ к задачам с tag на projectId
Заменили нестабильную выборку задач по tag на точную адресацию через projectId. Списки задач теперь открываются быстрее и не путают проекты между собой, особенно когда у пользователя их много.
Изолировали browser storage между аккаунтами
Локальное хранилище браузера теперь строго разделено по аккаунтам: данные одного пользователя больше не подглядывают за данными другого. Переключение между учётками в одном браузере стало безопаснее и предсказуемее.
Отвязали загрузку задач от Google и Apple API
Загрузка задач больше не зависит напрямую от API Google и Apple — вместо жёсткой привязки появился промежуточный слой. Это упрощает подключение новых источников календарей и снижает шанс поломок при изменениях у внешних вендоров.
Настроили бэкапы, восстановление и наблюдаемость
В инфраструктуре планировщика появились регулярные бэкапы и проверенная процедура восстановления, так что данные под защитой даже в случае сбоя. Дополнительно подключили инструменты наблюдаемости — теперь проще ловить проблемы до того, как о них сообщат пользователи.
Убрали глобальную SSE-рассылку и постоянный polling
Из ядра планировщика выпилили фоновую SSE-рассылку и бесконечный polling, которые держали соединения и нагружали сервер. Клиенты теперь получают обновления точечно, без лишнего трафика и непредсказуемых задержек.
Расширили покрытие тестов вокруг бизнес-рисков
Усилили тестовый набор сценариями, которые раньше проскакивали между ручными проверками: критичные бизнес-правила теперь под охраной автотестов. Это снижает шанс, что рефакторинг или новая фича тихо сломает логику, на которой держится планирование.
Продолжили декомпозицию App.tsx по пользовательским сценариям
Сделали ещё один проход по разделению главного компонента: календарь с drag-and-drop, планирование и завершение дня, карточка задачи, настройки и Pomodoro постепенно переезжают в собственные модули. Перенос сопровождается строгой типизацией и поведенческими проверками, чтобы код стал понятнее без потери функциональности.
Разделили ядро приложения и сервера по доменам
App.tsx, server/index.js и server/db.js получили доменную нарезку: код сгруппирован вокруг пользовательских сценариев, а не свален в монолиты. Дальше развивать планировщик станет проще — новые фичи добавляются в свой домен, не задевая соседей.
Разнесли server/db.js по доменным репозиториям
Хранение аккаунтов, проектов, задач, интеграций и настроек теперь живёт в отдельных repository-модулях, а application repository собирает их в единую точку входа. Сохранили транзакционность, PostgreSQL-персистентность и обратную совместимость API, чтобы миграция прошла без сюрпризов для клиентов.
Ввели обязательный CI и безопасный deployment
В пайплайне появился обязательный CI: сборка и тесты теперь автоматически гоняются на каждом изменении, а релиз проходит только при их зелёном свете. Деплой стал безопаснее — сломанный код больше не утечёт к пользователям, а команда получает быстрый сигнал о проблемах до продакшена.
Ужали frontend bundle и привели зависимости в порядок
Разобрали клиентскую сборку и навели порядок в зависимостях: убрали лишнее, обновили устаревшее и подготовили почву для code splitting. Теперь проект собирается быстрее, а в репозитории меньше «мусорных» пакетов, которые тянули за собой риски безопасности и конфликты версий.
Сократили основной клиентский bundle и настроили code splitting
Проанализировали основной чанк около 645 КБ, вынесли тяжёлые зависимости и второстепенные экраны в lazy-чанки, а также зафиксировали бюджет bundle. Главные экраны теперь загружаются быстрее, а редко используемые модули подтягиваются по мере необходимости, не блокируя первый рендер.
Устранили дублирование состояния
Прибрали двойные источники истины в клиентской части: теперь данные о задачах и их статусах живут в одном месте и не расходятся между вкладками. Сценарии «открыл задачу», «переключил статус» и «обновил список» перестали спорить друг с другом, а синхронизация между экранами Planner стала предсказуемой.
Пересмотрели AI-функции и прозрачность данных
Прошлись по AI-возможностям Uniwex Task и оставили только те, что реально помогают в ежедневной работе, — шумные сценарии отключили. Заодно явно показали, какие данные уходят в обработку: пользователь видит состав передаваемой информации до запуска AI-действия и понимает, что именно анализируется.
Разбили крупные серверные доменные модули
Разделили на сценарии server/tasks/mutations.js, server/integrations/routes.js, server/integrations/ai-routes.js и server/routines/routes.js — каждый файл теперь отвечает за свой пользовательский сценарий, а не за всё сразу. Доменные фасады остались едиными, так что API для клиента не изменился, но внутри сервер стал заметно проще читать и сопровождать.
Убрали таймер у выполнения задач и событий
В карточке выполнения задач и событий больше нет таймера — кнопка стала проще и понятнее. Один клик фиксирует завершение без лишних шагов и отвлекающих элементов. Это ускоряет работу с ежедневными ритуалами и снижает шанс случайно запустить отсчёт времени.
Исправления
6Подтверждаем запись только после commit в PostgreSQL
Перестроили логику подтверждения записи так, чтобы успех приходил только после реального commit в PostgreSQL. Раньше интерфейс мог рапортовать «готово» ещё до того, как данные легли в базу, — теперь такого не случается.
Исправили удаление владельца совместного проекта
Раньше при попытке удалить владельца совместный проект мог остаться без хозяина или вовсе сломаться. Теперь сценарий корректно обрабатывается: проект либо передаётся новому владельцу, либо удаляется вместе с участниками — без сюрпризов.
Сделали ошибки заметными и понятными для пользователя
Ошибки в планировщике больше не теряются молча: интерфейс показывает понятные сообщения о том, что пошло не так и что делать дальше. Пользователю проще сориентироваться, а команде — быстрее реагировать на жалобы.
Довели строгую TypeScript-проверку до зелёного состояния
Команда npm run typecheck:strict теперь проходит без красных ошибок: накопленные типовые проблемы починены по существу, без хитрых any и исключений. Проверка добавлена в обязательный check:release и GitLab CI, поэтому любой новый типовой косяк снова будет блокировать релиз, а не тихо ползти в продакшен.
Исправили появление уведомлений о ритуалах при обновлении страницы
При обновлении страницы ритуалы больше не выдают повторные уведомления о событиях, которые пользователь уже видел. Список оповещений теперь корректно сбрасывается только при наступлении нового дня. Это избавляет от раздражающих дублей и помогает не пропустить действительно важные напоминания.
Починили отображение истории изменений проекта
История изменений проекта снова показывает все правки в правильном порядке и без потерянных записей. Пользователь видит, кто и когда менял параметры, и может отследить эволюцию проекта. Раньше часть событий пропадала или отображалась с искажениями — теперь журнал работает как часы.