Skip to content

Commit efa4495

Browse files
committed
Flipped archived filter default
1 parent 291d6fe commit efa4495

6 files changed

Lines changed: 24 additions & 23 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ itk_dev_entity:
160160
enabled: true
161161
```
162162

163-
`$entity->archive($at)` sets `archivedAt`. The `archivable` SQL filter is registered **disabled** — toggle it
164-
per-request (typically via a `?showArchived=1` listener that calls `$em->getFilters()->enable('archivable')`) to hide
165-
archived rows from `findAll`/`find`.
163+
`$entity->archive($at)` sets `archivedAt`. The `archivable` SQL filter is registered **enabled**, so archived rows
164+
are hidden from `findAll`/`find` by default. Disable it per-request (typically via a `?showArchived=1` listener that
165+
calls `$em->getFilters()->disable('archivable')`) when you want archived rows to appear.
166166

167167
If `archivable.enabled` is left off, the filter is never registered — entities that use `ArchivableTrait` will still
168168
have the `archived_at` column and the `archive()`/`unarchive()` methods, but enabling the filter will throw.
@@ -406,7 +406,7 @@ itk_dev_entity:
406406
| `audit.retention` | ISO-8601 duration | `P1Y` | Default retention past which audit rows are scrubbed by `privacy:anonymize-stale`. |
407407
| `audit.retention_overrides` | map<FQCN, ISO8601> | `[]` | Per-entity overrides. |
408408
| `soft_delete.enabled` | bool | `false` | Register `SoftDeleteListener` (intercepts `remove()`) and the `soft_delete` Doctrine filter. Entities still opt in by implementing `SoftDeletableInterface` and using `SoftDeletableTrait`. |
409-
| `archivable.enabled` | bool | `false` | Register the `archivable` Doctrine filter (registered disabled; toggle per-request). Entities still opt in by implementing `ArchivableInterface` and using `ArchivableTrait`. |
409+
| `archivable.enabled` | bool | `false` | Register the `archivable` Doctrine filter (registered enabled; hides archived rows by default; disable per-request to reveal them). Entities still opt in by implementing `ArchivableInterface` and using `ArchivableTrait`. |
410410
| `timestampable.enabled` | bool | `false` | Register `TimestampableListener` (sets `createdAt`/`updatedAt`). Entities still opt in by implementing `TimestampableInterface` and using `TimestampableTrait`. |
411411
| `blameable.enabled` | bool | `false` | Register `BlameableListener` (sets `createdBy`/`modifiedBy` from the security token). Entities still opt in by implementing `BlameableInterface` and using `BlameableTrait`. |
412412
| `anonymization.enabled` | bool | `false` | Discover `#[Anonymize]` property attributes, register privacy services, and expose the `privacy:anonymize` and `privacy:anonymize-stale` commands. Entities still opt in by implementing `AnonymizationStatusInterface`, using `AnonymizationStatusTrait`, and annotating PII properties. |

config/reference.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1248,7 +1248,7 @@
12481248
* enabled?: bool|Param, // When true, registers the soft_delete Doctrine filter and listener. Entities still opt in by implementing SoftDeletableInterface and using SoftDeletableTrait. // Default: false
12491249
* },
12501250
* archivable?: array{
1251-
* enabled?: bool|Param, // When true, registers the archivable Doctrine filter (registered disabled; toggle per-request via $em->getFilters()->enable('archivable')). Entities still opt in by implementing ArchivableInterface and using ArchivableTrait. // Default: false
1251+
* enabled?: bool|Param, // When true, registers the archivable Doctrine filter (registered enabled; archived rows are hidden by default — disable per-request via $em->getFilters()->disable('archivable') to reveal them). Entities still opt in by implementing ArchivableInterface and using ArchivableTrait. // Default: false
12521252
* },
12531253
* timestampable?: array{
12541254
* enabled?: bool|Param, // When true, registers the onFlush listener that sets createdAt/updatedAt. Entities still opt in by implementing TimestampableInterface and using TimestampableTrait. // Default: false

src/DependencyInjection/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function getConfigTreeBuilder(): TreeBuilder
6565
->children()
6666
->booleanNode('enabled')
6767
->defaultFalse()
68-
->info('When true, registers the archivable Doctrine filter (registered disabled; toggle per-request via $em->getFilters()->enable(\'archivable\')). Entities still opt in by implementing ArchivableInterface and using ArchivableTrait.')
68+
->info('When true, registers the archivable Doctrine filter (registered enabled; archived rows are hidden by default — disable per-request via $em->getFilters()->disable(\'archivable\') to reveal them). Entities still opt in by implementing ArchivableInterface and using ArchivableTrait.')
6969
->end()
7070
->end()
7171
->end()

src/DependencyInjection/ITKDevEntityExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public function prepend(ContainerBuilder $container): void
8989
if ($config['archivable']['enabled']) {
9090
$filters['archivable'] = [
9191
'class' => ArchivableFilter::class,
92-
'enabled' => false,
92+
'enabled' => true,
9393
];
9494
}
9595
if ($config['soft_delete']['enabled']) {

tests/Integration/AbstractITKDevEntityIntegrationTest.php

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -152,18 +152,19 @@ public function testSoftDeleteAndArchivableFiltersCompose(): void
152152
$this->em->flush();
153153
$this->em->clear();
154154

155-
// soft_delete on (default), archivable off (default) -> live + archivedOnly visible.
155+
// Both filters on (default) -> only `live`.
156156
$visible = $this->labelsOf($this->em->getRepository(FixtureEntity::class)->findAll());
157-
sort($visible);
158-
self::assertSame(['archived', 'live'], $visible);
157+
self::assertSame(['live'], $visible);
159158

160-
// Both filters on -> only `live`.
161-
$this->em->getFilters()->enable('archivable');
159+
// soft_delete on, archivable off -> live + archived.
160+
$this->em->getFilters()->disable('archivable');
162161
$this->em->clear();
163162
$visible = $this->labelsOf($this->em->getRepository(FixtureEntity::class)->findAll());
164-
self::assertSame(['live'], $visible);
163+
sort($visible);
164+
self::assertSame(['archived', 'live'], $visible);
165165

166166
// soft_delete off, archivable on -> live + soft-deleted.
167+
$this->em->getFilters()->enable('archivable');
167168
$this->em->getFilters()->disable('soft_delete');
168169
$this->em->clear();
169170
$visible = $this->labelsOf($this->em->getRepository(FixtureEntity::class)->findAll());
@@ -223,7 +224,7 @@ public function testSecondRemoveAfterSoftDeleteHardDeletes(): void
223224
self::assertNull($found, 'second remove() should hard-delete an already soft-deleted row');
224225
}
225226

226-
public function testArchivableFilterHidesArchivedRowsWhenEnabled(): void
227+
public function testArchivableFilterHidesArchivedRowsByDefault(): void
227228
{
228229
$live = new FixtureEntity();
229230
$live->setLabel('live');
@@ -236,16 +237,16 @@ public function testArchivableFilterHidesArchivedRowsWhenEnabled(): void
236237
$this->em->flush();
237238
$this->em->clear();
238239

239-
// Filter disabled by default — both visible
240-
$all = $this->em->getRepository(FixtureEntity::class)->findAll();
241-
self::assertCount(2, $all);
242-
243-
// Enable filter — only live row visible
244-
$this->em->getFilters()->enable('archivable');
245-
$this->em->clear();
240+
// Filter enabled by default — only live row visible
246241
$visible = $this->em->getRepository(FixtureEntity::class)->findAll();
247242
self::assertCount(1, $visible);
248243
self::assertSame('live', $visible[0]->getLabel());
244+
245+
// Disable filter — both rows visible
246+
$this->em->getFilters()->disable('archivable');
247+
$this->em->clear();
248+
$all = $this->em->getRepository(FixtureEntity::class)->findAll();
249+
self::assertCount(2, $all);
249250
}
250251

251252
public function testArchivableFilterReturnsNoConstraintForNonArchivableEntity(): void

tests/Unit/DependencyInjection/ArchivableConfigTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function testDefaultsToDisabledNoDoctrineFilter(): void
2222
self::assertArrayNotHasKey('archivable', $filters, 'archivable Doctrine filter must not be prepended when disabled');
2323
}
2424

25-
public function testExplicitlyEnabledRegistersFilterDisabledByDefault(): void
25+
public function testExplicitlyEnabledRegistersFilterEnabledByDefault(): void
2626
{
2727
$config = [
2828
'user_class' => 'App\\Entity\\User',
@@ -35,7 +35,7 @@ public function testExplicitlyEnabledRegistersFilterDisabledByDefault(): void
3535
$doctrine = $prepend->getExtensionConfig('doctrine');
3636
$filters = $doctrine[0]['orm']['filters'] ?? [];
3737
self::assertArrayHasKey('archivable', $filters);
38-
self::assertFalse($filters['archivable']['enabled'], 'archivable filter is registered disabled so it can be toggled per-request');
38+
self::assertTrue($filters['archivable']['enabled'], 'archivable filter is registered enabled so archived rows are hidden by default; disable per-request to reveal');
3939
}
4040

4141
/** @param array<string, mixed> $config */

0 commit comments

Comments
 (0)