diff --git a/.changes/unreleased/Fixed-20241205-133702.yaml b/.changes/unreleased/Fixed-20241205-133702.yaml new file mode 100644 index 000000000..9fcafdb9f --- /dev/null +++ b/.changes/unreleased/Fixed-20241205-133702.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: Enforce unique contraint on activity storedobject +time: 2024-12-05T13:37:02.635977414+01:00 +custom: + Issue: "337" diff --git a/src/Bundle/ChillActivityBundle/Entity/Activity.php b/src/Bundle/ChillActivityBundle/Entity/Activity.php index 4701d2483..408c27ed8 100644 --- a/src/Bundle/ChillActivityBundle/Entity/Activity.php +++ b/src/Bundle/ChillActivityBundle/Entity/Activity.php @@ -84,6 +84,11 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac */ #[Assert\Valid(traverse: true)] #[ORM\ManyToMany(targetEntity: StoredObject::class, cascade: ['persist'])] + #[ORM\JoinTable( + name: 'activity_storedobject', + joinColumns: new ORM\JoinColumn(name: 'activity_id', referencedColumnName: 'id', nullable: false), + inverseJoinColumns: new ORM\InverseJoinColumn(name: 'storedobject_id', referencedColumnName: 'id', unique: true, nullable: false) + )] private Collection $documents; #[ORM\Column(type: \Doctrine\DBAL\Types\Types::TIME_MUTABLE, nullable: true)] diff --git a/src/Bundle/ChillActivityBundle/migrations/Version20241202173942.php b/src/Bundle/ChillActivityBundle/migrations/Version20241202173942.php new file mode 100644 index 000000000..03ea103dc --- /dev/null +++ b/src/Bundle/ChillActivityBundle/migrations/Version20241202173942.php @@ -0,0 +1,46 @@ +addSql( + 'WITH duplicate_activities AS ( + SELECT storedobject_id, array_agg(activity_id ORDER BY activity_id DESC) AS activities + FROM activity_storedobject + GROUP BY storedobject_id + HAVING count(*) > 1 + ) + DELETE FROM activity_storedobject + WHERE activity_id IN ( + SELECT unnest(activities[2:]) -- Keep the highest ID, delete the rest + FROM duplicate_activities + );' + ); + $this->addSql('CREATE UNIQUE INDEX unique_storedobject_id ON activity_storedobject (storedobject_id)'); + } + + public function down(Schema $schema): void + { + $this->addSql('DROP INDEX IF EXISTS unique_storedobject_id'); + } +}