feat(dict): delete dictionary endpoint + UI button с cascade safety

This commit is contained in:
Александр Зимин
2026-06-05 09:47:05 +00:00
parent cdffa4261c
commit 5c6801f993
10 changed files with 437 additions and 4 deletions
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd">
<!--
ON DELETE CASCADE для FK на dictionary_definitions(id).
Контекст: feature `DELETE /api/v1/dictionaries/{name}`. Service.delete
выполняет SINGLE `definitionRepository.deleteById` — без ON CASCADE
Postgres reject'нул бы с violation (dictionary_records → 23503). Тогда
Java logic должен был бы вручную в правильном порядке deleteByDictionaryId
на N+ child tables, что error-prone и не атомарно.
CASCADE на FK — Postgres делает delete детей в одной транзакции,
атомарно. Audit log + outbox events не имеют FK constraints (они
audit-style append-only), delete их выполняется в Java service
явным DELETE WHERE aggregate_id=<defId>.
Child tables (FK references dictionary_definitions(id)):
- dictionary_records (0003)
- record_drafts (0019)
- dictionary_schema_drafts (0022)
-->
<changeSet id="0030-1-dictionary-records-cascade" author="ordinis">
<comment>FK fk_record_dictionary → ON DELETE CASCADE</comment>
<sql>
ALTER TABLE dictionary_records
DROP CONSTRAINT IF EXISTS fk_record_dictionary;
ALTER TABLE dictionary_records
ADD CONSTRAINT fk_record_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id)
ON DELETE CASCADE;
</sql>
<rollback>
ALTER TABLE dictionary_records
DROP CONSTRAINT IF EXISTS fk_record_dictionary;
ALTER TABLE dictionary_records
ADD CONSTRAINT fk_record_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id);
</rollback>
</changeSet>
<changeSet id="0030-2-record-drafts-cascade" author="ordinis">
<comment>FK fk_draft_dictionary → ON DELETE CASCADE</comment>
<sql>
ALTER TABLE record_drafts
DROP CONSTRAINT IF EXISTS fk_draft_dictionary;
ALTER TABLE record_drafts
ADD CONSTRAINT fk_draft_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id)
ON DELETE CASCADE;
</sql>
<rollback>
ALTER TABLE record_drafts
DROP CONSTRAINT IF EXISTS fk_draft_dictionary;
ALTER TABLE record_drafts
ADD CONSTRAINT fk_draft_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id);
</rollback>
</changeSet>
<changeSet id="0030-3-schema-drafts-cascade" author="ordinis">
<comment>FK fk_schema_draft_dictionary → ON DELETE CASCADE</comment>
<sql>
ALTER TABLE dictionary_schema_drafts
DROP CONSTRAINT IF EXISTS fk_schema_draft_dictionary;
ALTER TABLE dictionary_schema_drafts
ADD CONSTRAINT fk_schema_draft_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id)
ON DELETE CASCADE;
</sql>
<rollback>
ALTER TABLE dictionary_schema_drafts
DROP CONSTRAINT IF EXISTS fk_schema_draft_dictionary;
ALTER TABLE dictionary_schema_drafts
ADD CONSTRAINT fk_schema_draft_dictionary
FOREIGN KEY (dictionary_id) REFERENCES dictionary_definitions(id);
</rollback>
</changeSet>
</databaseChangeLog>
@@ -39,5 +39,6 @@
<include file="changes/0027-spacecraft-mission-fk.xml" relativeToChangelogFile="true"/>
<include file="changes/0028-phase3-prep-org-id.xml" relativeToChangelogFile="true"/>
<include file="changes/0029-drop-self-approve-constraints.xml" relativeToChangelogFile="true"/>
<include file="changes/0030-dictionary-delete-cascade.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>