Système de gestion de traductions pensé en CMS headless : un back-office pour ceux qui traduisent, une API pour ce qui consomme. Architecture - Symfony 7.4 / API Platform 4.3 / MariaDB 11.4, SPA React 19 servie en même origine — ce qui rend viable le cookie de session plutôt qu'un jeton en localStorage. - Deux APIs séparées : Management (session ou clé) et Delivery (stateless, clé seule). Les fusionner ferait porter à chaque lecture de bundle le coût de la session. - Stockage canonique en ICU MessageFormat, sérialisation par plateforme. Le format d'une plateforme ne contamine pas la base. - Publication par releases immuables ; le déploiement est un déplacement de pointeur, donc le rollback aussi. - Isolation multi-organisation par filtre Doctrine, avec un test d'architecture qui casse la CI si une entité échappe à l'invariant. Éditeur, deux vues - Par langue : source et cible, jamais douze colonnes. Grille virtualisée, saisie sans bouton « Enregistrer », panneau de contexte permanent. - Par clé : une clé, toutes ses langues empilées et repliées. Répond à « ce libellé est-il prêt partout ? ». - Mode Focus dans les deux : une file à vider, ⌘↵ pour enchaîner. - Le traducteur ne voit jamais d'ICU : pastilles de variables, un champ par catégorie CLDR de la langue cible. Administration - Deux niveaux : projet (membres, clés API, plateformes) et organisation (annuaire des comptes, création de projets). - Invitations par e-mail, jeton 256 bits stocké haché. - Désactiver un compte coupe les sessions en cours, pas seulement les connexions suivantes. - Les plateformes s'archivent ; ni elles ni les environnements ne se suppriment — la trace explique pourquoi telle clé existe. CLI tqs - PHAR autonome de 3 Mo, autoloader généré : le dépôt client ne dépend ni de Composer ni de la disponibilité de TQ-Slator. - init / push / pull / status ; le sync est non destructif par défaut et son prune est scopé plateforme. 126 tests, PHPStan niveau 8. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
202 lines
29 KiB
PHP
202 lines
29 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace DoctrineMigrations;
|
|
|
|
use Doctrine\DBAL\Schema\Schema;
|
|
use Doctrine\Migrations\AbstractMigration;
|
|
|
|
/**
|
|
* Schéma initial de TQ-Slator.
|
|
*
|
|
* Relue à la main plutôt que générée telle quelle : trois points ne peuvent pas
|
|
* être exprimés par les métadonnées Doctrine et sont documentés ici.
|
|
*
|
|
* 1. translation_key.key_path est en utf8mb4_bin alors que le reste de la base
|
|
* est en utf8mb4_uca1400_ai_ci. Sans cela, `Header.Login` et `header.login`
|
|
* seraient la même clé pour l'index UNIQUE.
|
|
*
|
|
* 2. L'unicité des clés passe par key_hash BINARY(20) et non par key_path :
|
|
* 28 octets d'index au lieu de 2000.
|
|
*
|
|
* 3. L'index couvrant idx_tkp_platform_key est ajouté manuellement (voir
|
|
* commentaire dans up()).
|
|
*/
|
|
final class Version20260814090000 extends AbstractMigration
|
|
{
|
|
public function getDescription(): string
|
|
{
|
|
return 'Schéma initial : organisations, projets, plateformes, clés, traductions, releases, RBAC.';
|
|
}
|
|
|
|
public function up(Schema $schema): void
|
|
{
|
|
$this->addSql('CREATE TABLE organization (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, name VARCHAR(120) NOT NULL, slug VARCHAR(120) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_C1EE637CD17F50A6 (uuid), UNIQUE INDEX uniq_organization_slug (slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE api_key (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, scopes JSON NOT NULL, last_used_at DATETIME DEFAULT NULL, expires_at DATETIME DEFAULT NULL, revoked_at DATETIME DEFAULT NULL, name VARCHAR(120) NOT NULL, key_prefix VARCHAR(24) NOT NULL, key_hash BINARY(32) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, created_by_id INT DEFAULT NULL, environment_id INT NOT NULL, UNIQUE INDEX UNIQ_C912ED9DD17F50A6 (uuid), INDEX IDX_C912ED9DB03A8386 (created_by_id), INDEX idx_api_key_environment (environment_id), UNIQUE INDEX uniq_api_key_hash (key_hash), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE audit_log (id INT AUTO_INCREMENT NOT NULL, created_at DATETIME NOT NULL, actor_label VARCHAR(180) DEFAULT NULL, entity_class VARCHAR(120) DEFAULT NULL, entity_id VARCHAR(64) DEFAULT NULL, context JSON NOT NULL, ip_address VARCHAR(45) DEFAULT NULL, user_agent VARCHAR(255) DEFAULT NULL, action VARCHAR(80) NOT NULL, actor_id INT DEFAULT NULL, organization_id INT NOT NULL, INDEX IDX_F6E1C0F510DAF24A (actor_id), INDEX IDX_F6E1C0F532C8A3DE (organization_id), INDEX idx_audit_org_date (organization_id, created_at), INDEX idx_audit_actor (actor_id, created_at), INDEX idx_audit_target (entity_class, entity_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE completion_stat (id INT AUTO_INCREMENT NOT NULL, total_keys INT DEFAULT 0 NOT NULL, untranslated INT DEFAULT 0 NOT NULL, draft INT DEFAULT 0 NOT NULL, translated INT DEFAULT 0 NOT NULL, needs_review INT DEFAULT 0 NOT NULL, reviewed INT DEFAULT 0 NOT NULL, computed_at DATETIME NOT NULL, project_id INT NOT NULL, locale_id INT NOT NULL, platform_id INT DEFAULT NULL, INDEX IDX_C818E4F5166D1F9C (project_id), INDEX IDX_C818E4F5E559DFD1 (locale_id), INDEX IDX_C818E4F5FFE6496F (platform_id), UNIQUE INDEX uniq_stat_scope (project_id, platform_id, locale_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE environment (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, auto_publish TINYINT DEFAULT 0 NOT NULL, sort_order INT DEFAULT 0 NOT NULL, name VARCHAR(60) NOT NULL, slug VARCHAR(60) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, current_release_id INT DEFAULT NULL, project_id INT NOT NULL, UNIQUE INDEX UNIQ_4626DE22D17F50A6 (uuid), INDEX IDX_4626DE226E91BB0F (current_release_id), INDEX IDX_4626DE22166D1F9C (project_id), UNIQUE INDEX uniq_environment_project_slug (project_id, slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE glossary_term (id INT AUTO_INCREMENT NOT NULL, translation VARCHAR(255) DEFAULT NULL, is_forbidden TINYINT DEFAULT 0 NOT NULL, keep_as_is TINYINT DEFAULT 0 NOT NULL, notes LONGTEXT DEFAULT NULL, term VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, project_id INT NOT NULL, locale_id INT NOT NULL, INDEX IDX_334345DD166D1F9C (project_id), INDEX IDX_334345DDE559DFD1 (locale_id), INDEX idx_glossary_lookup (project_id, locale_id), UNIQUE INDEX uniq_glossary_term (project_id, locale_id, term), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE invitation (id INT AUTO_INCREMENT NOT NULL, role VARCHAR(16) DEFAULT NULL, locale_codes JSON NOT NULL, is_external TINYINT DEFAULT 0 NOT NULL, accepted_at DATETIME DEFAULT NULL, revoked_at DATETIME DEFAULT NULL, email VARCHAR(180) NOT NULL, token_hash BINARY(32) NOT NULL, expires_at DATETIME NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, project_id INT DEFAULT NULL, invited_by_id INT DEFAULT NULL, organization_id INT NOT NULL, INDEX IDX_F11D61A2166D1F9C (project_id), INDEX IDX_F11D61A2A7B4A7E3 (invited_by_id), INDEX IDX_F11D61A232C8A3DE (organization_id), INDEX idx_invitation_email (organization_id, email), UNIQUE INDEX uniq_invitation_token (token_hash), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE key_comment (id INT AUTO_INCREMENT NOT NULL, resolved_at DATETIME DEFAULT NULL, body LONGTEXT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, locale_id INT DEFAULT NULL, resolved_by_id INT DEFAULT NULL, translation_key_id INT NOT NULL, author_id INT NOT NULL, INDEX IDX_F6A27652E559DFD1 (locale_id), INDEX IDX_F6A276526713A32B (resolved_by_id), INDEX IDX_F6A27652D07ED992 (translation_key_id), INDEX IDX_F6A27652F675F31B (author_id), INDEX idx_comment_key (translation_key_id, created_at), INDEX idx_comment_open (translation_key_id, resolved_at), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE key_screenshot (id INT AUTO_INCREMENT NOT NULL, caption VARCHAR(255) DEFAULT NULL, width INT DEFAULT NULL, height INT DEFAULT NULL, path VARCHAR(400) NOT NULL, mime_type VARCHAR(100) NOT NULL, size_bytes INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, uploaded_by_id INT DEFAULT NULL, translation_key_id INT NOT NULL, INDEX IDX_E83440FEA2B28FE8 (uploaded_by_id), INDEX idx_screenshot_key (translation_key_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE locale (id INT AUTO_INCREMENT NOT NULL, code VARCHAR(16) NOT NULL, name VARCHAR(120) NOT NULL, native_name VARCHAR(120) NOT NULL, direction VARCHAR(3) DEFAULT \'ltr\' NOT NULL, plural_categories JSON NOT NULL, fallback_locale_id INT DEFAULT NULL, INDEX IDX_4180C6983AE764FC (fallback_locale_id), UNIQUE INDEX uniq_locale_code (code), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE platform (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, sort_order INT DEFAULT 0 NOT NULL, export_layout VARCHAR(16) DEFAULT \'nested\' NOT NULL, default_max_length INT DEFAULT NULL, name VARCHAR(80) NOT NULL, slug VARCHAR(80) NOT NULL, kind VARCHAR(16) DEFAULT \'other\' NOT NULL, message_format VARCHAR(16) DEFAULT \'icu\' NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, project_id INT NOT NULL, UNIQUE INDEX UNIQ_3952D0CBD17F50A6 (uuid), INDEX IDX_3952D0CB166D1F9C (project_id), UNIQUE INDEX uniq_platform_project_slug (project_id, slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE project (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, description LONGTEXT DEFAULT NULL, key_naming_pattern VARCHAR(255) DEFAULT NULL, default_max_length INT DEFAULT NULL, name VARCHAR(120) NOT NULL, slug VARCHAR(120) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, organization_id INT NOT NULL, source_locale_id INT NOT NULL, UNIQUE INDEX UNIQ_2FB3D0EED17F50A6 (uuid), INDEX IDX_2FB3D0EE32C8A3DE (organization_id), INDEX IDX_2FB3D0EE8DC74C1F (source_locale_id), UNIQUE INDEX uniq_project_org_slug (organization_id, slug), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE project_locale (id INT AUTO_INCREMENT NOT NULL, is_enabled TINYINT DEFAULT 1 NOT NULL, sort_order INT DEFAULT 0 NOT NULL, project_id INT NOT NULL, locale_id INT NOT NULL, INDEX IDX_56242DD2166D1F9C (project_id), INDEX IDX_56242DD2E559DFD1 (locale_id), UNIQUE INDEX uniq_project_locale (project_id, locale_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE project_member (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, role VARCHAR(16) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, project_id INT NOT NULL, user_id INT NOT NULL, UNIQUE INDEX UNIQ_67401132D17F50A6 (uuid), INDEX IDX_67401132166D1F9C (project_id), INDEX idx_member_user (user_id), UNIQUE INDEX uniq_project_member (project_id, user_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE member_locale (project_member_id INT NOT NULL, locale_id INT NOT NULL, INDEX IDX_655644AB64AB9629 (project_member_id), INDEX IDX_655644ABE559DFD1 (locale_id), PRIMARY KEY (project_member_id, locale_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE project_release (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, notes LONGTEXT DEFAULT NULL, key_count INT DEFAULT 0 NOT NULL, published_at DATETIME DEFAULT NULL, version INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, created_by_id INT DEFAULT NULL, project_id INT NOT NULL, UNIQUE INDEX UNIQ_8590F78D17F50A6 (uuid), INDEX IDX_8590F78B03A8386 (created_by_id), INDEX IDX_8590F78166D1F9C (project_id), INDEX idx_release_published (project_id, published_at), UNIQUE INDEX uniq_release_project_version (project_id, version), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE release_bundle (id INT AUTO_INCREMENT NOT NULL, key_count INT DEFAULT 0 NOT NULL, size_bytes INT DEFAULT 0 NOT NULL, fallback_count INT DEFAULT 0 NOT NULL, payload LONGTEXT NOT NULL, checksum BINARY(32) NOT NULL, format VARCHAR(16) NOT NULL, layout VARCHAR(16) NOT NULL, release_id INT NOT NULL, platform_id INT NOT NULL, locale_id INT NOT NULL, INDEX IDX_6B994810B12A727D (release_id), INDEX IDX_6B994810FFE6496F (platform_id), INDEX IDX_6B994810E559DFD1 (locale_id), INDEX idx_bundle_checksum (checksum), UNIQUE INDEX uniq_bundle_release_platform_locale (release_id, platform_id, locale_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE translation (id INT AUTO_INCREMENT NOT NULL, value LONGTEXT DEFAULT NULL, status VARCHAR(20) DEFAULT \'untranslated\' NOT NULL, source_checksum BINARY(20) DEFAULT NULL, is_machine_translated TINYINT DEFAULT 0 NOT NULL, updated_at DATETIME NOT NULL, version INT DEFAULT 1 NOT NULL, updated_by_id INT DEFAULT NULL, translation_key_id INT NOT NULL, locale_id INT NOT NULL, INDEX IDX_B469456F896DBBDE (updated_by_id), INDEX IDX_B469456FD07ED992 (translation_key_id), INDEX IDX_B469456FE559DFD1 (locale_id), INDEX idx_translation_grid (translation_key_id, locale_id, status), INDEX idx_translation_stale (locale_id, status, updated_at), UNIQUE INDEX uniq_translation_key_locale (translation_key_id, locale_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE translation_key (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, key_hash BINARY(20) NOT NULL, description LONGTEXT DEFAULT NULL, placeholders JSON NOT NULL, max_length INT DEFAULT NULL, is_archived TINYINT DEFAULT 0 NOT NULL, last_seen_at DATETIME DEFAULT NULL, key_path VARCHAR(500) NOT NULL COLLATE `utf8mb4_bin`, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, namespace_id INT DEFAULT NULL, created_by_id INT DEFAULT NULL, project_id INT NOT NULL, UNIQUE INDEX UNIQ_AADCBD56D17F50A6 (uuid), INDEX IDX_AADCBD565F74F783 (namespace_id), INDEX IDX_AADCBD56B03A8386 (created_by_id), INDEX IDX_AADCBD56166D1F9C (project_id), INDEX idx_key_lookup (project_id, namespace_id, key_path), INDEX idx_key_archived (project_id, is_archived), INDEX idx_key_last_seen (project_id, last_seen_at), UNIQUE INDEX uniq_key_project_hash (project_id, key_hash), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE translation_key_platform (translation_key_id INT NOT NULL, platform_id INT NOT NULL, INDEX IDX_8FCD3598D07ED992 (translation_key_id), INDEX IDX_8FCD3598FFE6496F (platform_id), PRIMARY KEY (translation_key_id, platform_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE translation_namespace (id INT AUTO_INCREMENT NOT NULL, depth INT DEFAULT 0 NOT NULL, path VARCHAR(400) NOT NULL COLLATE `utf8mb4_bin`, parent_id INT DEFAULT NULL, project_id INT NOT NULL, INDEX IDX_D10A03DD166D1F9C (project_id), INDEX idx_namespace_parent (parent_id), UNIQUE INDEX uniq_namespace_project_path (project_id, path), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE translation_version (id INT AUTO_INCREMENT NOT NULL, created_at DATETIME NOT NULL, value LONGTEXT DEFAULT NULL, status VARCHAR(20) NOT NULL, change_source VARCHAR(16) NOT NULL, author_id INT DEFAULT NULL, translation_id INT NOT NULL, INDEX IDX_1E102A31F675F31B (author_id), INDEX IDX_1E102A319CAA2B25 (translation_id), INDEX idx_version_translation (translation_id, created_at), INDEX idx_version_author (author_id, created_at), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
$this->addSql('CREATE TABLE app_user (id INT AUTO_INCREMENT NOT NULL, uuid BINARY(16) NOT NULL, password VARCHAR(255) DEFAULT NULL, auth_provider VARCHAR(16) DEFAULT \'local\' NOT NULL, is_external TINYINT DEFAULT 0 NOT NULL, is_active TINYINT DEFAULT 1 NOT NULL, totp_secret VARCHAR(64) DEFAULT NULL, totp_confirmed_at DATETIME DEFAULT NULL, last_login_at DATETIME DEFAULT NULL, ui_locale VARCHAR(16) DEFAULT \'fr\' NOT NULL, roles JSON NOT NULL, email VARCHAR(180) NOT NULL, name VARCHAR(120) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, organization_id INT NOT NULL, UNIQUE INDEX UNIQ_88BDF3E9D17F50A6 (uuid), INDEX idx_user_organization (organization_id), UNIQUE INDEX uniq_user_email (email), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
|
|
// File Messenger. Créée ici plutôt que par auto_setup : un DDL implicite
|
|
// au premier message rendrait le premier démarrage non reproductible, et
|
|
// masquerait un défaut de droits sur la base jusqu'au pire moment.
|
|
$this->addSql('CREATE TABLE messenger_messages (id BIGINT AUTO_INCREMENT NOT NULL, body LONGTEXT NOT NULL, headers LONGTEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL, available_at DATETIME NOT NULL, delivered_at DATETIME DEFAULT NULL, INDEX IDX_75EA56E0FB7336F0 (queue_name), INDEX IDX_75EA56E0E3BD61CE (available_at), INDEX IDX_75EA56E016BA31DB (delivered_at), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_uca1400_ai_ci`');
|
|
|
|
// Index couvrant sur la table de jointement des plateformes.
|
|
//
|
|
// Doctrine ne sait pas exprimer un index sur une table ManyToMany : il est
|
|
// déclaré ici à la main. La clé primaire (translation_key_id, platform_id)
|
|
// sert le MEMBER OF de la requête de grille ; cet index en miroir permet à
|
|
// l'optimiseur d'attaquer PAR la plateforme quand celle-ci ne porte que
|
|
// quelques centaines de clés sur les trente mille du projet.
|
|
//
|
|
// ⚠ Un `doctrine:migrations:diff` proposera de le SUPPRIMER, puisqu'aucune
|
|
// métadonnée ne le décrit. Ne pas accepter cette suppression.
|
|
$this->addSql('CREATE INDEX idx_tkp_platform_key ON translation_key_platform (platform_id, translation_key_id)');
|
|
|
|
$this->addSql('ALTER TABLE api_key ADD CONSTRAINT FK_C912ED9DB03A8386 FOREIGN KEY (created_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE api_key ADD CONSTRAINT FK_C912ED9D903E3A94 FOREIGN KEY (environment_id) REFERENCES environment (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE audit_log ADD CONSTRAINT FK_F6E1C0F510DAF24A FOREIGN KEY (actor_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE audit_log ADD CONSTRAINT FK_F6E1C0F532C8A3DE FOREIGN KEY (organization_id) REFERENCES organization (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE completion_stat ADD CONSTRAINT FK_C818E4F5166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE completion_stat ADD CONSTRAINT FK_C818E4F5E559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE completion_stat ADD CONSTRAINT FK_C818E4F5FFE6496F FOREIGN KEY (platform_id) REFERENCES platform (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE environment ADD CONSTRAINT FK_4626DE226E91BB0F FOREIGN KEY (current_release_id) REFERENCES project_release (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE environment ADD CONSTRAINT FK_4626DE22166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE glossary_term ADD CONSTRAINT FK_334345DD166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE glossary_term ADD CONSTRAINT FK_334345DDE559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE invitation ADD CONSTRAINT FK_F11D61A2166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE invitation ADD CONSTRAINT FK_F11D61A2A7B4A7E3 FOREIGN KEY (invited_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE invitation ADD CONSTRAINT FK_F11D61A232C8A3DE FOREIGN KEY (organization_id) REFERENCES organization (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE key_comment ADD CONSTRAINT FK_F6A27652E559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE key_comment ADD CONSTRAINT FK_F6A276526713A32B FOREIGN KEY (resolved_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE key_comment ADD CONSTRAINT FK_F6A27652D07ED992 FOREIGN KEY (translation_key_id) REFERENCES translation_key (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE key_comment ADD CONSTRAINT FK_F6A27652F675F31B FOREIGN KEY (author_id) REFERENCES app_user (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE key_screenshot ADD CONSTRAINT FK_E83440FEA2B28FE8 FOREIGN KEY (uploaded_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE key_screenshot ADD CONSTRAINT FK_E83440FED07ED992 FOREIGN KEY (translation_key_id) REFERENCES translation_key (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE locale ADD CONSTRAINT FK_4180C6983AE764FC FOREIGN KEY (fallback_locale_id) REFERENCES locale (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE platform ADD CONSTRAINT FK_3952D0CB166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE project ADD CONSTRAINT FK_2FB3D0EE32C8A3DE FOREIGN KEY (organization_id) REFERENCES organization (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE project ADD CONSTRAINT FK_2FB3D0EE8DC74C1F FOREIGN KEY (source_locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE project_locale ADD CONSTRAINT FK_56242DD2166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE project_locale ADD CONSTRAINT FK_56242DD2E559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE project_member ADD CONSTRAINT FK_67401132166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE project_member ADD CONSTRAINT FK_67401132A76ED395 FOREIGN KEY (user_id) REFERENCES app_user (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE member_locale ADD CONSTRAINT FK_655644AB64AB9629 FOREIGN KEY (project_member_id) REFERENCES project_member (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE member_locale ADD CONSTRAINT FK_655644ABE559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE project_release ADD CONSTRAINT FK_8590F78B03A8386 FOREIGN KEY (created_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE project_release ADD CONSTRAINT FK_8590F78166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE release_bundle ADD CONSTRAINT FK_6B994810B12A727D FOREIGN KEY (release_id) REFERENCES project_release (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE release_bundle ADD CONSTRAINT FK_6B994810FFE6496F FOREIGN KEY (platform_id) REFERENCES platform (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE release_bundle ADD CONSTRAINT FK_6B994810E559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE translation ADD CONSTRAINT FK_B469456F896DBBDE FOREIGN KEY (updated_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE translation ADD CONSTRAINT FK_B469456FD07ED992 FOREIGN KEY (translation_key_id) REFERENCES translation_key (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation ADD CONSTRAINT FK_B469456FE559DFD1 FOREIGN KEY (locale_id) REFERENCES locale (id)');
|
|
$this->addSql('ALTER TABLE translation_key ADD CONSTRAINT FK_AADCBD565F74F783 FOREIGN KEY (namespace_id) REFERENCES translation_namespace (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE translation_key ADD CONSTRAINT FK_AADCBD56B03A8386 FOREIGN KEY (created_by_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE translation_key ADD CONSTRAINT FK_AADCBD56166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation_key_platform ADD CONSTRAINT FK_8FCD3598D07ED992 FOREIGN KEY (translation_key_id) REFERENCES translation_key (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation_key_platform ADD CONSTRAINT FK_8FCD3598FFE6496F FOREIGN KEY (platform_id) REFERENCES platform (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation_namespace ADD CONSTRAINT FK_D10A03DD727ACA70 FOREIGN KEY (parent_id) REFERENCES translation_namespace (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation_namespace ADD CONSTRAINT FK_D10A03DD166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE translation_version ADD CONSTRAINT FK_1E102A31F675F31B FOREIGN KEY (author_id) REFERENCES app_user (id) ON DELETE SET NULL');
|
|
$this->addSql('ALTER TABLE translation_version ADD CONSTRAINT FK_1E102A319CAA2B25 FOREIGN KEY (translation_id) REFERENCES translation (id) ON DELETE CASCADE');
|
|
$this->addSql('ALTER TABLE app_user ADD CONSTRAINT FK_88BDF3E932C8A3DE FOREIGN KEY (organization_id) REFERENCES organization (id) ON DELETE CASCADE');
|
|
}
|
|
|
|
public function down(Schema $schema): void
|
|
{
|
|
$this->addSql('ALTER TABLE api_key DROP FOREIGN KEY FK_C912ED9DB03A8386');
|
|
$this->addSql('ALTER TABLE api_key DROP FOREIGN KEY FK_C912ED9D903E3A94');
|
|
$this->addSql('ALTER TABLE audit_log DROP FOREIGN KEY FK_F6E1C0F510DAF24A');
|
|
$this->addSql('ALTER TABLE audit_log DROP FOREIGN KEY FK_F6E1C0F532C8A3DE');
|
|
$this->addSql('ALTER TABLE completion_stat DROP FOREIGN KEY FK_C818E4F5166D1F9C');
|
|
$this->addSql('ALTER TABLE completion_stat DROP FOREIGN KEY FK_C818E4F5E559DFD1');
|
|
$this->addSql('ALTER TABLE completion_stat DROP FOREIGN KEY FK_C818E4F5FFE6496F');
|
|
$this->addSql('ALTER TABLE environment DROP FOREIGN KEY FK_4626DE226E91BB0F');
|
|
$this->addSql('ALTER TABLE environment DROP FOREIGN KEY FK_4626DE22166D1F9C');
|
|
$this->addSql('ALTER TABLE glossary_term DROP FOREIGN KEY FK_334345DD166D1F9C');
|
|
$this->addSql('ALTER TABLE glossary_term DROP FOREIGN KEY FK_334345DDE559DFD1');
|
|
$this->addSql('ALTER TABLE invitation DROP FOREIGN KEY FK_F11D61A2166D1F9C');
|
|
$this->addSql('ALTER TABLE invitation DROP FOREIGN KEY FK_F11D61A2A7B4A7E3');
|
|
$this->addSql('ALTER TABLE invitation DROP FOREIGN KEY FK_F11D61A232C8A3DE');
|
|
$this->addSql('ALTER TABLE key_comment DROP FOREIGN KEY FK_F6A27652E559DFD1');
|
|
$this->addSql('ALTER TABLE key_comment DROP FOREIGN KEY FK_F6A276526713A32B');
|
|
$this->addSql('ALTER TABLE key_comment DROP FOREIGN KEY FK_F6A27652D07ED992');
|
|
$this->addSql('ALTER TABLE key_comment DROP FOREIGN KEY FK_F6A27652F675F31B');
|
|
$this->addSql('ALTER TABLE key_screenshot DROP FOREIGN KEY FK_E83440FEA2B28FE8');
|
|
$this->addSql('ALTER TABLE key_screenshot DROP FOREIGN KEY FK_E83440FED07ED992');
|
|
$this->addSql('ALTER TABLE locale DROP FOREIGN KEY FK_4180C6983AE764FC');
|
|
$this->addSql('ALTER TABLE platform DROP FOREIGN KEY FK_3952D0CB166D1F9C');
|
|
$this->addSql('ALTER TABLE project DROP FOREIGN KEY FK_2FB3D0EE32C8A3DE');
|
|
$this->addSql('ALTER TABLE project DROP FOREIGN KEY FK_2FB3D0EE8DC74C1F');
|
|
$this->addSql('ALTER TABLE project_locale DROP FOREIGN KEY FK_56242DD2166D1F9C');
|
|
$this->addSql('ALTER TABLE project_locale DROP FOREIGN KEY FK_56242DD2E559DFD1');
|
|
$this->addSql('ALTER TABLE project_member DROP FOREIGN KEY FK_67401132166D1F9C');
|
|
$this->addSql('ALTER TABLE project_member DROP FOREIGN KEY FK_67401132A76ED395');
|
|
$this->addSql('ALTER TABLE member_locale DROP FOREIGN KEY FK_655644AB64AB9629');
|
|
$this->addSql('ALTER TABLE member_locale DROP FOREIGN KEY FK_655644ABE559DFD1');
|
|
$this->addSql('ALTER TABLE project_release DROP FOREIGN KEY FK_8590F78B03A8386');
|
|
$this->addSql('ALTER TABLE project_release DROP FOREIGN KEY FK_8590F78166D1F9C');
|
|
$this->addSql('ALTER TABLE release_bundle DROP FOREIGN KEY FK_6B994810B12A727D');
|
|
$this->addSql('ALTER TABLE release_bundle DROP FOREIGN KEY FK_6B994810FFE6496F');
|
|
$this->addSql('ALTER TABLE release_bundle DROP FOREIGN KEY FK_6B994810E559DFD1');
|
|
$this->addSql('ALTER TABLE translation DROP FOREIGN KEY FK_B469456F896DBBDE');
|
|
$this->addSql('ALTER TABLE translation DROP FOREIGN KEY FK_B469456FD07ED992');
|
|
$this->addSql('ALTER TABLE translation DROP FOREIGN KEY FK_B469456FE559DFD1');
|
|
$this->addSql('ALTER TABLE translation_key DROP FOREIGN KEY FK_AADCBD565F74F783');
|
|
$this->addSql('ALTER TABLE translation_key DROP FOREIGN KEY FK_AADCBD56B03A8386');
|
|
$this->addSql('ALTER TABLE translation_key DROP FOREIGN KEY FK_AADCBD56166D1F9C');
|
|
$this->addSql('ALTER TABLE translation_key_platform DROP FOREIGN KEY FK_8FCD3598D07ED992');
|
|
$this->addSql('ALTER TABLE translation_key_platform DROP FOREIGN KEY FK_8FCD3598FFE6496F');
|
|
$this->addSql('ALTER TABLE translation_namespace DROP FOREIGN KEY FK_D10A03DD727ACA70');
|
|
$this->addSql('ALTER TABLE translation_namespace DROP FOREIGN KEY FK_D10A03DD166D1F9C');
|
|
$this->addSql('ALTER TABLE translation_version DROP FOREIGN KEY FK_1E102A31F675F31B');
|
|
$this->addSql('ALTER TABLE translation_version DROP FOREIGN KEY FK_1E102A319CAA2B25');
|
|
$this->addSql('ALTER TABLE app_user DROP FOREIGN KEY FK_88BDF3E932C8A3DE');
|
|
|
|
$this->addSql('DROP TABLE app_user');
|
|
$this->addSql('DROP TABLE translation_version');
|
|
$this->addSql('DROP TABLE translation_namespace');
|
|
$this->addSql('DROP TABLE translation_key_platform');
|
|
$this->addSql('DROP TABLE translation_key');
|
|
$this->addSql('DROP TABLE translation');
|
|
$this->addSql('DROP TABLE release_bundle');
|
|
$this->addSql('DROP TABLE project_release');
|
|
$this->addSql('DROP TABLE member_locale');
|
|
$this->addSql('DROP TABLE project_member');
|
|
$this->addSql('DROP TABLE project_locale');
|
|
$this->addSql('DROP TABLE project');
|
|
$this->addSql('DROP TABLE platform');
|
|
$this->addSql('DROP TABLE locale');
|
|
$this->addSql('DROP TABLE key_screenshot');
|
|
$this->addSql('DROP TABLE key_comment');
|
|
$this->addSql('DROP TABLE invitation');
|
|
$this->addSql('DROP TABLE glossary_term');
|
|
$this->addSql('DROP TABLE environment');
|
|
$this->addSql('DROP TABLE completion_stat');
|
|
$this->addSql('DROP TABLE audit_log');
|
|
$this->addSql('DROP TABLE api_key');
|
|
$this->addSql('DROP TABLE organization');
|
|
$this->addSql('DROP TABLE messenger_messages');
|
|
}
|
|
}
|