Skip to content

chore: Revert multiple config support - #4

Open
neretin-trike wants to merge 1 commit into
masterfrom
neretinaa/revert-multiple-config
Open

neretin-trike wants to merge 1 commit into
masterfrom
neretinaa/revert-multiple-config

Conversation

@neretin-trike

Copy link
Copy Markdown
Collaborator

No description provided.

@neretin-trike
neretin-trike force-pushed the master branch 2 times, most recently from ccd939d to 1b8d6b4 Compare July 2, 2025 13:46
@neretin-trike
neretin-trike force-pushed the neretinaa/revert-multiple-config branch from b6440ba to e565e16 Compare July 22, 2025 14:06
@github-actions

Copy link
Copy Markdown

Design System Builder app deployed!

https://plasma.sberdevices.ru/pr/design-system-builder-pr-4/

@neretin-trike neretin-trike self-assigned this Mar 27, 2026
malilex added a commit that referenced this pull request Sep 3, 2026
* Initial commit.

* feat: publisher service was implemented. (#2)

* feat: publisher service was implemented.

* feat: Code was refactored. Current job canceling was implemented. Logs websocket endpoint was implemented.

* feat: Add deploy scripts. Fix errors.

* feat: Add support of web target. Change app listening port.

* feat: Identity gateway was implemented. Projects Service was implemented. (#4)

* feat: Indentity gateway was implemented. Projects Service was implemented.

add prod config.

feat: Add swagger to projects-service and identity-gateway

feat: plasmabldr-137-add-project-access-keys was implemented.

feat: plasmabldr-137-add-project-member-lookup was implemented.

feat: plasmabldr-137-add-projects-core was implemented.

feat: change plasmabldr-137-add-identity-gateway-foundation was implemented.

* feat: add locations to nginx conf

* fix: nginx fixes.

* feat: update nginx local conf

* auth check

* fix: gateway timeout

* feat(cli): DS Builder CLI. (#5)

* feat(cli): init

* feat: cli init and status was implemented

* feat(cli): Fetch theme tenants and tokens were implemented.

* feat(cli): Add macos targets

* feat(cli): Tenants aliases was implemented.

* feat(cli): Update tenant meta contract.

* feat(cli): Palette fetch was implemented.

* chore: add install script for macos.

* chore: add adrs.

* feat: components push (#7)

* feat: Documentation service (#9)

* feat(cli): add docs bundle CLI with init, generate, and publish commands

* Add documentation bundle ingestion

* feat(cli): publish documentation bundles

* feat(documentation): add ingestion and search pipeline

* Improve documentation search

* Harden documentation deployment

* Fix documentation review issues

* Fix documentation processing metadata

* Fix CLI tests after rebase

* chore: move JavaScript workspace under js

* chore: organize unified DS Builder monorepo

* fix(frontend-kt): isolate local Gradle conventions

* fix: make monorepo validation reproducible

* chore: add scoped validation and local setup

* feat: components push / fetch (#58)

* feat(db-service): split component states and extend the component data model

Состояния свойств смешивали две разные природы. Состояния взаимодействия
принадлежат модели ввода и одинаковы для всех компонентов — они остаются
в stateEnum, куда добавлено седьмое значение activated: его используют пять
компонентов, и ни один не объявляет его собственным состоянием.

Состояния, специфичные для компонента (checked, indeterminate, collapsed),
переезжают в component_states. В enum они не помещались: множество открыто
и растёт с каждым новым компонентом, а принадлежность состояния компоненту
enum не выражает. Источник — код: поле stateEnum в uikit-api-meta.json.

Переопределение задаётся набором состояний: ["checked", "focused"] означает
конъюнкцию «отмечен И в фокусе». Колонка вмещала одно состояние и превратила
бы конъюнкцию в независимые переопределения, поэтому связь вынесена
в property_value_states, а в таблицах значений остался states_key —
канонический ключ набора для уникального индекса.

Дополнительно:
- propertyTypeEnum расширен семью типами, встречающимися в конфигурациях;
- component_style получает реляционную связь через component_style_references
  вместо текстового значения;
- style_combinations получает combination_key и уникальный индекс: без него
  повторный импорт дублировал бы более половины значений.

Миграция 0006 переносит существующие данные до сужения enum. Порядок операций
в ней существен и проверен накатом на непустую базу: приведение к суженному
типу не переживает значение checked, а обнуление колонки state конфликтует
с прежним частичным индексом WHERE state IS NULL.

Схемы валидации привязаны к enum базы, чтобы новые значения не требовали
правки в двух местах.

* feat(db-service): add components:import endpoint

Транзакционная загрузка пакета конфигураций оформления в дизайн-систему одним
запросом. Признак dryRun выполняет работу целиком и откатывает транзакцию,
поэтому план совпадает с тем, что произойдёт при применении.

Глобальный слой — компоненты, свойства, состояния — только читается: он приходит
из кода компонентов, а не из конфигураций оформления. Конфигурация компонента,
отсутствующего в глобальном слое, отклоняется с названной причиной, но остальной
пакет при этом не загружается: частичная компонентная модель хуже отказа.

Двоеточие в пути (components:import) читается параметром маршрута: в шаблоне
Express двоеточие начинает имя параметра.

Ссылки component_style разрешаются во второй проход, после записи всех значений
пакета: ссылка может указывать на компонент, который ещё не обработан.

Добавлен CRUD-маршрут component-states — через него скрипт заливки api-meta
наполняет справочник состояний компонентов.

* fix(db-service): drop state columns before narrowing the enum in 0006

Колонки state в variation_property_values и invariant_property_values
приводились к суженному типу и тут же удалялись. Приведение отвергало значение
вроде checked, которое к тому моменту ещё лежало в колонке, — миграция падала
на любой базе, где такие значения есть.

Проявлялось только под drizzle-kit, который выполняет миграцию одной транзакцией:
при построчном прогоне через psql в режиме autocommit ошибка не возникала.
Ненулевой код возврата drizzle-kit при этом печатал без диагностики, из-за чего
отказ выглядел как особенность инструмента.

Колонки теперь снимаются до сужения enum. В property_value_states к этому моменту
остаются только состояния взаимодействия, поэтому её приведение проходит.

* fix(db-service): adapt component-config endpoint to the states model

Ручка читала колонку state, которой больше нет: значение может действовать
при наборе состояний сразу, поэтому набор хранится в property_value_states,
а в таблицах значений остался канонический ключ states_key.

Прежний код умел отдать только одно состояние на переопределение
(state: [sr.state]) — теперь отдаётся весь набор.

* fix(db-service): emit cross-axis values from component-config

Ручка читала style_combinations, но брала оттуда только группировку стилей:
из combinationRows использовался единственный id. propertyId и value не читались
нигде, поэтому свойства, живущие только в сочетаниях, пропадали из ответа целиком.

У Segment так терялся segmentItemStyle — все 30 значений; по sdds_serv это 2303
сочетания, больше половины всех значений дизайн-системы.

Теперь каждое сочетание отдаётся записью values[] со своими координатами в targets
и своими свойствами. Сочетания с одинаковым набором координат объединяются в одну
запись: их различает свойство, а не координата.

Сочетание принадлежит ровно одному стилю-участнику, иначе попадало бы в ответ
столько раз, сколько в нём осей. Владелец выбирается детерминированно: ось цветовой
схемы, если она в сочетании есть, иначе наименьший styleId. На восстановление
конфигурации выбор владельца не влияет — координата владельца и targets в сумме
дают тот же набор осей.

Проверено сверкой с базой по всем 59 appearance с сочетаниями: 2303 из 2303,
без потерь и дублей.

* fix(db-service): omit axes without values from component-config

Ось объявлена кодом компонента и потому есть у него всегда, но значения ей задаёт
конкретная дизайн-система. Ось без значений в этой дизайн-системе попадала в ответ
пустой: у CheckBox так приходил `variant`, который наполняет только sdds_sbcom.

Такая ось потребителю бесполезна и вводит в заблуждение — выглядит как ось, у которой
почему-то нет значений, тогда как её просто нет в этой дизайн-системе.

rootVariationId и colorSchemeVariationId теперь выбираются среди наполненных осей,
иначе ответ ссылался бы на ось, которой в нём нет.

* refactor(db-service): merge component import migrations into one

Три миграции описывали одну фичу и в прод не уходили, поэтому объединены в 0004.

Объединение не механическое. Прежде 0004 расширял stateEnum одиннадцатью значениями,
а 0006 сужал его обратно до семи — эти шаги взаимно уничтожаются. Чистая разница
с 0003 сводится к одному добавленному значению `activated`, и вся возня с DROP TYPE,
пересозданием типа и обратным приведением колонок исчезает.

Вместе с ней исчезает и класс отказа, который она порождала: приведение к суженному
типу не переживало значение вроде `checked`, и миграция падала на любой базе, где
такие значения есть.

Перенос семантических состояний в component_states тоже не нужен: до этой миграции
enum их не содержал, значит в базе их быть не может. Он существовал только ради баз,
прошедших через промежуточный 0004.

Осталось то, что действительно требуется на боевых данных: перенос состояний
взаимодействия в property_value_states, заполнение states_key и combination_key.

51 оператор вместо 77. Проверено накатом с нуля и на непустую базу уровня 0003
с состояниями, затем полным прогоном шести пакетов: 493 конфигурации,
6700 сочетаний, расхождений с ответами ручки нет.

* fix(db-service): adapt seeds to the states model

Сиды заполняли колонку state, которой больше нет: значение может действовать
при наборе состояний сразу, поэтому набор хранится в property_value_states,
а в таблице значений остался канонический ключ states_key.

Колонку drizzle молча отбрасывал, и строки, различавшиеся только состоянием,
схлопывались в один ключ — оба сида падали на уникальном индексе:
duplicate key value violates constraint "vpv_style_property_appearance_states_unique".

Затронуты dev-сид (4 строки с состояниями) и prod-сид (158).

* feat(db-service): report property type mismatches on import

Тип свойства в глобальном слое приходит из кода компонента, тип значения —
из конфигурации оформления. Разойтись они не должны, но проверки не было:
конфигурация могла записать имя градиентного токена под свойством, объявленным
как цвет, и это проходило незамеченным.

Сравниваются семьи типов, а не типы. integer, float, dimension и value считаются
одной семьёй: код объявляет integer, конфигурация пишет float или value, хранится
всё равно текстом. Без этого пять срабатываний из шести на корпусе были бы пустыми.

Сообщается, только когда тип из базы не встречается в конфигурации ни разу.
Иначе проверка ругалась бы на семь свойств корпуса, законно принимающих и цвет,
и градиент в зависимости от значения оси.

На шести пакетах даёт от одного до трёх расхождений каждый.

* chore: sync generated artifacts with the schema

README описывает шаг /sync-all после изменения schema.ts или routes/api/ —
он не выполнялся, и генерируемые артефакты разошлись с реальностью.

Валидация: четыре схемы значений принимали снятую колонку state и не знали
про statesKey, то есть CRUD-ручки значений свойств были типизированы под
несуществующее поле. Добавлены схемы для component_states, property_value_states
и таблиц ссылок component_style.

OpenAPI: маршрут component-states не был зарегистрирован; четыре новые таблицы
не имели схем ответа. Три из них CRUD-маршрутов не имеют — их пишет импорт, —
поэтому присутствуют только схемами.

Типы админки перегенерированы: 90 путей, 83 схемы.

Заодно исправлено копирование дизайн-системы в SettingsPage: оно читало
vpv.state и ipv.state. Копируется ключ набора; связи состояний при этом
не создаются — CRUD-маршрута для property_value_states нет.

* feat(db-service,admin): expose property value states and copy them

Копирование дизайн-системы переносило значение вместе с ключом набора состояний,
но не сами связи: значение утверждало «действует при hovered», а строк в
property_value_states не было. Читатели берут состояния из states_key, поэтому
внешне это работало, а таблица связей оставалась неполной.

Добавлен CRUD-маршрут /ds/property-value-states с выборкой по значению —
by-variation-value и by-invariant-value. Копирование теперь переносит связи:
идентификаторы состояний идут как есть, потому что состояние взаимодействия
хранится значением enum, а состояние компонента ссылается на component_states,
принадлежащий компоненту, а не дизайн-системе.

Схема создания проверяет, что заполнена ровно одна ссылка на значение и ровно
одно состояние. Это дублирует CHECK-констрейнты, но отказ приходит с внятным
сообщением и статусом 400 вместо сырой ошибки Postgres.

Путей в спеке 90 → 94.

* fix(admin): bind property types to the generated API types

PROP_TYPES и PropertyType перечисляли шесть типов свойств, тогда как схема БД
содержит тринадцать. После перегенерации типов админка перестала компилироваться:
сгенерированный union не помещался в локальный.

Оба места привязаны к components['schemas']['Property']['type'], поэтому
расхождение теперь поймает компилятор. PROP_TYPES остаётся значением — по нему
строится выпадающий список, — но проверяется через satisfies.

Побочный эффект: в выборе типа свойства появились component_style, value, icon,
boolean, gradient, blur и integer. Прежде их нельзя было выбрать в интерфейсе,
хотя база их принимала.

* refactor(db-service): move component import to component-config

Импорт конфигураций компонентов переезжает с
POST /ds/design-systems/{id}/components:import на
POST /ds/component-config/import. Двоеточие в пути было custom method,
чужеродным остальному API: оно вынуждало объявлять роут как /:id/:action
со сверкой действия вручную, монтировать роутер до designSystemsRouter
и разбирать тело в обход общего validateBody.

Дизайн-система адресуется полем designSystemId тела запроса — так же,
как во всех остальных POST этого API. Побочный эффект: идентификатор
проверяется на uuid до запроса в базу, поэтому некорректный uuid даёт
400 вместо прежнего 500 от Postgres.

Старый путь удалён без алиаса. entityType в design_system_changes
остаётся прежним: это метка журнала, с URL не связанная.

* feat(db-service): store state sets in right way

* Merge pull request #63 from salute-developers/feat/components-fetch

feat: components fetch

* union migrations

* ci: fix gradlew

* ci: fix js workflow.

* build: Add shared docker compose file.

* chore: add gradle cache and heap limits.

* Add GHCR deploy workflow

---------

Co-authored-by: Александр Малышев <>
Co-authored-by: Sergey Velesko <53015097+raininforest@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant