6efe7aa8ea
Auto Tag Develop / tag (push) Successful in 9s
## Contexte Ticket Lesstime : [#52](https://project.malio-dev.fr/projects/6/tasks/463) Position dans le groupe M0 : 0.0 (prérequis transverse) ## Implémentation - 2 interfaces (`TimestampableInterface`, `BlamableInterface`) dans `Shared/Domain/Contract/` - 1 trait (`TimestampableBlamableTrait`) dans `Shared/Domain/Trait/` - 1 Subscriber Doctrine (`TimestampableBlamableSubscriber`) dans `Shared/Infrastructure/Doctrine/` - 1 ligne `resolve_target_entities` ajoutée à `config/packages/doctrine.yaml` (`UserInterface` → `User`) - 1 test architecture (`EntitiesAreTimestampableBlamableTest`) garde-fou L3 de la spec § 2.8.bis - 1 test unitaire (`TimestampableBlamableSubscriberTest`) 4 cas ## Décision EXCLUDED (cf. réponse review) Les 4 entités préexistantes (`User`, `Role`, `Permission`, `Site`) sont **whitelistées** dans `EXCLUDED` avec justification par entrée, plutôt que rétrofitées dans ce ticket. Le rétrofit de `User` et `Site` est documenté en **HP-9 / HP-10** (récursion Blamable + migration → décision archi scopée). Doc mise à jour : spec § 2.8.bis, § 9, et `.claude/rules/backend.md`. ## Tests - PHPUnit : 5 nouveaux tests, 0 échec, 0 risky (248 tests / 874 assertions au total) - php-cs-fixer : OK ## Reviewer suggéré - Tristan --------- Co-authored-by: Matthieu <mtholot19@gmail.com> Reviewed-on: #13 Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
113 lines
5.4 KiB
YAML
113 lines
5.4 KiB
YAML
doctrine:
|
|
dbal:
|
|
# Deux connexions pointant sur le meme DSN : l'ORM utilise `default`,
|
|
# l'AuditLogWriter utilise `audit` pour ecrire hors de la transaction
|
|
# Doctrine et eviter tout entanglement transactionnel en batch.
|
|
default_connection: default
|
|
connections:
|
|
default:
|
|
url: '%env(resolve:DATABASE_URL)%'
|
|
profiling_collect_backtrace: '%kernel.debug%'
|
|
# Exclut `audit_log` de toute operation de comparaison de schema
|
|
# (doctrine:schema:update, schema:validate, diff de migrations...).
|
|
# Cette table n'a volontairement aucune entite mappee : elle est
|
|
# append-only via DBAL brut (AuditLogWriter) pour eviter la
|
|
# recursion du listener Doctrine. Sans ce filtre, schema:update
|
|
# la considere comme "orpheline" et genere un `DROP TABLE
|
|
# audit_log` qui casse la base de test apres chaque
|
|
# `make test-db-setup`. La creation / suppression de la table
|
|
# reste pilotee par les migrations (cf. Version20260420202749).
|
|
schema_filter: '~^(?!audit_log$).+~'
|
|
audit:
|
|
url: '%env(resolve:DATABASE_URL)%'
|
|
orm:
|
|
validate_xml_mapping: true
|
|
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
|
|
identity_generation_preferences:
|
|
Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
|
|
auto_mapping: true
|
|
# Mapping contrat DDD → classe concrete. Permet au module Core de
|
|
# referencer `SiteInterface` dans ses ORM mappings (User) sans importer
|
|
# la classe concrete du module Sites. Pattern officiel Doctrine pour
|
|
# les bounded contexts, remplace l'ancien import direct
|
|
# `App\Module\Sites\Domain\Entity\Site` dans User.php.
|
|
resolve_target_entities:
|
|
App\Shared\Domain\Contract\SiteInterface: App\Module\Sites\Domain\Entity\Site
|
|
# Cible des ManyToOne created_by / updated_by du TimestampableBlamableTrait.
|
|
# Permet a Shared de referencer UserInterface dans ses ORM mappings sans
|
|
# importer la classe concrete du module Core (cf. spec-back M0 § 2.8).
|
|
Symfony\Component\Security\Core\User\UserInterface: App\Module\Core\Domain\Entity\User
|
|
mappings:
|
|
Core:
|
|
type: attribute
|
|
is_bundle: false
|
|
dir: '%kernel.project_dir%/src/Module/Core/Domain/Entity'
|
|
prefix: 'App\Module\Core\Domain\Entity'
|
|
alias: Core
|
|
# Mapping inconditionnelle du module Sites : la structure DB
|
|
# existe meme si SitesModule::class est retire de config/modules.php.
|
|
# L'activation fonctionnelle (ex: exposition des permissions, futurs
|
|
# endpoints API) passe exclusivement par config/modules.php.
|
|
Sites:
|
|
type: attribute
|
|
is_bundle: false
|
|
dir: '%kernel.project_dir%/src/Module/Sites/Domain/Entity'
|
|
prefix: 'App\Module\Sites\Domain\Entity'
|
|
alias: Sites
|
|
controller_resolver:
|
|
auto_mapping: false
|
|
|
|
when@test:
|
|
doctrine:
|
|
dbal:
|
|
# Le suffixe "_test" doit etre propage aux deux connexions : l'ORM
|
|
# l'herite via `default`, l'AuditLogWriter via `audit`. Sans cela,
|
|
# la connexion `audit` ecrirait dans la base dev pendant que l'ORM
|
|
# ecrit dans la base test — divergence invisible en apparence mais
|
|
# fatale pour les tests du journal d'audit.
|
|
#
|
|
# `idle_connection_ttl: 1` (au lieu du defaut 600s) : en test on
|
|
# reboote le kernel a chaque test. Sans TTL court, les connexions
|
|
# orphelines s'accumulent dans PG et on finit par saturer le pool
|
|
# (max_connections=100) sur une suite de 200+ tests qui utilisent
|
|
# 2 connexions chacun (default + audit).
|
|
connections:
|
|
default:
|
|
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
|
|
idle_connection_ttl: 1
|
|
audit:
|
|
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
|
|
idle_connection_ttl: 1
|
|
orm:
|
|
mappings:
|
|
# Entite fictive SiteAware utilisee uniquement en tests du
|
|
# module Sites (ticket 4). Le mapping n'est charge qu'en
|
|
# environnement test, donc aucun impact sur les schemas
|
|
# dev/prod. La table est creee a la volee par les tests
|
|
# d'integration (via `SchemaTool::createSchema`) dans le
|
|
# setUp de SiteScopedQueryExtensionTest.
|
|
TestFixtures:
|
|
type: attribute
|
|
is_bundle: false
|
|
dir: '%kernel.project_dir%/tests/Fixtures/SiteAware'
|
|
prefix: 'App\Tests\Fixtures\SiteAware'
|
|
alias: TestFixtures
|
|
|
|
when@prod:
|
|
doctrine:
|
|
orm:
|
|
query_cache_driver:
|
|
type: pool
|
|
pool: doctrine.system_cache_pool
|
|
result_cache_driver:
|
|
type: pool
|
|
pool: doctrine.result_cache_pool
|
|
|
|
framework:
|
|
cache:
|
|
pools:
|
|
doctrine.result_cache_pool:
|
|
adapter: cache.app
|
|
doctrine.system_cache_pool:
|
|
adapter: cache.system
|