Files
Starseed/migrations/Version20260417120000.php
Matthieu 93cbd48bf5
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
chore : rename Coltura to Starseed
- Rename project name across code, configs, docs, dev/prod infra
- Dev: DOCKER_APP_NAME + POSTGRES_DB switched to starseed, containers become php-starseed-fpm / nginx-starseed / starseed-db-1
- Dev: mount nginx.conf on default.conf instead of starseed.conf to avoid alphabetical-order clash with image's default site
- Makefile: export CURRENT_UID/CURRENT_GID at top level so docker compose builds (db-reset etc.) get them
- Prod: image registry path, container_name, volumes, vhost server_name + paths, DATABASE_URL, CORS, CI workflow
- Add doc/prompt-rename-prod.md with the migration runbook for the prod server (DB rename, FS move, vhost, Let's Encrypt)
2026-05-19 08:24:19 +02:00

73 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Module Sites - Ticket 1/4 : brique fondatrice de donnees.
*
* Cree la table `site` qui porte les etablissements physiques de l'instance
* Starseed. La table est creee inconditionnellement : meme si SitesModule est
* desactive dans `config/modules.php`, la structure DB existe (pas de
* dependance dure depuis Core, mais pas de coin d'ombre schema non plus).
*
* Note sur l'emplacement du fichier :
* Par convention projet les migrations vivent dans
* `src/Module/{Module}/Infrastructure/Doctrine/Migrations/`, sauf pour les
* initialisations critiques. Cf. CLAUDE.md (section "Regles d'architecture")
* qui documente le bug de tri alphabetique de Doctrine Migrations 3.x avec
* plusieurs `migrations_paths` : tant que ce n'est pas corrige, toute
* migration d'initialisation (creation de table sur base vide) reste au
* namespace racine `DoctrineMigrations` dans `migrations/`.
*/
final class Version20260417120000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Module Sites : creation de la table site (nom, ville, cp, couleur, adresse complete, timestamps).';
}
public function up(Schema $schema): void
{
// Creation de la table site. Toutes les colonnes sont NOT NULL :
// - le champ `color` est contraint cote applicatif au format #RRGGBB
// (7 caracteres), la longueur DB est dimensionnee en consequence ;
// - `postal_code` est limite a 10 caracteres pour laisser marge a
// d'eventuels formats etrangers plus tard, tout en le validant
// strictement en 5 chiffres cote applicatif (format FR).
//
// Note : `full_address` est restructure au ticket 2 (migration
// Version20260420130000) en `street` + `complement` (nullable). La
// structure d'origine est conservee ici pour ne pas casser les devs
// qui ont deja joue cette migration en local.
$this->addSql(<<<'SQL'
CREATE TABLE site (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name VARCHAR(100) NOT NULL,
city VARCHAR(100) NOT NULL,
postal_code VARCHAR(10) NOT NULL,
color VARCHAR(7) NOT NULL,
full_address TEXT NOT NULL,
created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
PRIMARY KEY (id)
)
SQL);
// Index unique sur le nom : garantit l'invariant metier "un site porte
// un nom unique" et permet a la contrainte UniqueEntity cote Symfony
// de s'appuyer sur une erreur DB en cas de race condition.
$this->addSql('CREATE UNIQUE INDEX uniq_site_name ON site (name)');
}
public function down(Schema $schema): void
{
// Drop direct : aucune FK depuis/vers la table dans ce ticket.
$this->addSql('DROP TABLE site');
}
}