refactor+fix v1.10.0: аудит — гонки записи (asyncio.Lock, атомарный rev), точечный layout/update вместо layout/set (анти last-writer-wins), layout/delete, safeUrl против XSS в link/pdfs, fetchWithAuth, KEY_HASS, стриминговый лимит upload, модульность (styles/types/devices), динамические пространства в GUI-редакторе, чистка мёртвого кода (file/set, GROUP_TITLES)

This commit is contained in:
Matysh
2026-07-05 20:58:33 +03:00
parent 7cd9a56f5a
commit e7cf0416be
16 changed files with 1991 additions and 1874 deletions
+29
View File
@@ -1,5 +1,34 @@
# Changelog
## v1.10.0 — 2026-07-05 (аудит: гонки записи, XSS, модульность)
**Бэкенд**
- **Гонка записи устранена**: все циклы load→modify→save (`layout/set|update|delete`,
`config/set`) сериализованы общим `asyncio.Lock` — параллельные WS-вызовы больше не теряют
изменения, проверка `expected_rev` стала атомарной.
- Новая WS-команда `houseplan/layout/delete` — чистка позиции при удалении маркера
(раньше в `.storage/houseplan.layout` копились сироты).
- Удалена мёртвая WS-команда `houseplan/file/set` — файлы грузятся только по HTTP
(`/api/houseplan/upload`), как и было в карточке.
- HTTP-загрузка: лимит 25 МБ применяется ПО МЕРЕ чтения multipart (обрыв на лимите),
а не после чтения всего файла в память; `stat()` файлов ушёл в executor.
- `request.app[KEY_HASS]` вместо устаревшего `request.app["hass"]` (с фолбэком для старых HA).
**Фронтенд**
- **God-component разобран**: `houseplan-card.ts` 3023 → ~1990 строк.
Стили → `styles.ts`; типы → `types.ts`; построение устройств из реестров HA
(курирование, группы света, маркеры, LQI/температура) → `devices.ts` (чистые функции).
- **Last-writer-wins в раскладке устранён**: `_saveMarker` пишет позицию точечно
(`layout/update`), а не всей раскладкой (`layout/set`) — не затирает позиции из других
окон (регресс-класс инцидента v1.4.4). Перепривязка/удаление подчищают старую позицию.
- **XSS закрыт**: `link` и `pdfs[].url` маркеров проходят `safeUrl()` (только http(s)
и относительные пути; `javascript:`/`data:` отбрасываются). +12 тестов.
- Загрузка файлов через `hass.fetchWithAuth` (автообновление протухшего токена),
фолбэк на сырой токен.
- **Хардкод дачи убран из GUI-редактора**: список «пространство по умолчанию» строится
из серверного конфига (WS `config/get`), а не зашитых f1/f2/yard.
- `rules.ts`: удалён мёртвый экспорт `GROUP_TITLES`; регэкспы `iconFor` прекомпилированы.
- Единый `_errText()` во всех обработчиках ошибок (никогда «[object Object]»).
## v1.9.3 — 2026-07-05 (аудит + рефакторинг + тесты)
- Чистые функции `fitView` (contain-прямоугольник вьюпорта) и `declump` (расталкивание значков)
вынесены из карточки в `logic.ts` — покрыты юнит-тестами (было 9 → стало 14 тестов).