reviewed epic 5 & 6 stories
This commit is contained in:
@@ -15,18 +15,20 @@ So that **I can remove outdated or incorrect content from the website**.
|
||||
- **Technology:** Livewire Volt
|
||||
- **Follows pattern:** Permanent delete pattern
|
||||
- **Touch points:** Post management dashboard
|
||||
- **Files to modify:** Post management Volt component from Story 5.2
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
### Delete Functionality
|
||||
- [ ] Delete button on post list and edit page
|
||||
- [ ] Confirmation dialog before deletion
|
||||
- [ ] Delete button on post list (primary location)
|
||||
- [ ] Delete button on post edit page (secondary location)
|
||||
- [ ] Confirmation modal dialog before deletion
|
||||
- [ ] Permanent deletion (no soft delete per PRD)
|
||||
- [ ] Success message after deletion
|
||||
- [ ] Redirect to post list after deletion from edit page
|
||||
|
||||
### Restrictions
|
||||
- [ ] Cannot delete while post is being viewed publicly (edge case)
|
||||
- [ ] Admin-only access
|
||||
- [ ] Admin-only access (middleware protection)
|
||||
|
||||
### Audit Trail
|
||||
- [ ] Audit log entry preserved
|
||||
@@ -63,6 +65,16 @@ So that **I can remove outdated or incorrect content from the website**.
|
||||
</flux:modal>
|
||||
```
|
||||
|
||||
### Delete Button on Edit Page
|
||||
Add delete button to the post edit form (from Story 5.1) when editing an existing post:
|
||||
```blade
|
||||
@if($post?->exists)
|
||||
<flux:button variant="danger" wire:click="delete({{ $post->id }})">
|
||||
{{ __('admin.delete_post') }}
|
||||
</flux:button>
|
||||
@endif
|
||||
```
|
||||
|
||||
### Delete Logic
|
||||
```php
|
||||
public ?Post $postToDelete = null;
|
||||
@@ -102,26 +114,57 @@ public function confirmDelete(): void
|
||||
|
||||
### Testing
|
||||
```php
|
||||
use App\Models\Post;
|
||||
use App\Models\AdminLog;
|
||||
use App\Models\User;
|
||||
use Livewire\Volt\Volt;
|
||||
|
||||
it('permanently deletes post', function () {
|
||||
$admin = User::factory()->create();
|
||||
$post = Post::factory()->create();
|
||||
|
||||
$this->actingAs($admin)
|
||||
->delete(route('admin.posts.destroy', $post));
|
||||
Volt::test('admin.posts.index')
|
||||
->actingAs($admin)
|
||||
->call('delete', $post->id)
|
||||
->call('confirmDelete');
|
||||
|
||||
expect(Post::find($post->id))->toBeNull();
|
||||
});
|
||||
|
||||
it('creates audit log on deletion', function () {
|
||||
it('shows confirmation modal before deletion', function () {
|
||||
$admin = User::factory()->create();
|
||||
$post = Post::factory()->create();
|
||||
|
||||
$this->actingAs($admin)
|
||||
->delete(route('admin.posts.destroy', $post));
|
||||
Volt::test('admin.posts.index')
|
||||
->actingAs($admin)
|
||||
->call('delete', $post->id)
|
||||
->assertSet('showDeleteModal', true)
|
||||
->assertSet('postToDelete.id', $post->id);
|
||||
});
|
||||
|
||||
expect(AdminLog::where('target_type', 'post')
|
||||
it('creates audit log on deletion with old values', function () {
|
||||
$admin = User::factory()->create();
|
||||
$post = Post::factory()->create(['title_en' => 'Test Title']);
|
||||
|
||||
Volt::test('admin.posts.index')
|
||||
->actingAs($admin)
|
||||
->call('delete', $post->id)
|
||||
->call('confirmDelete');
|
||||
|
||||
$log = AdminLog::where('target_type', 'post')
|
||||
->where('target_id', $post->id)
|
||||
->where('action_type', 'delete')
|
||||
->exists()
|
||||
)->toBeTrue();
|
||||
->first();
|
||||
|
||||
expect($log)->not->toBeNull()
|
||||
->and($log->old_values)->toHaveKey('title_en', 'Test Title');
|
||||
});
|
||||
|
||||
it('requires admin authentication to delete', function () {
|
||||
$post = Post::factory()->create();
|
||||
|
||||
$this->delete(route('admin.posts.destroy', $post))
|
||||
->assertRedirect(route('login'));
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user