mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28:31 +00:00
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:
@@ -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 тестов).
|
||||
|
||||
Reference in New Issue
Block a user