Add removeFromMine functionality to Meetups API for removing meetups from a user's "My Meetups" list

- 🔒 Introduce `removeFromMine` policy for authenticated users to remove meetups.
- ✏️ Add `removeFromMine` method in `MeetupController` with idempotent handling.
-  Add `removeMember` utility in `Meetup` model for managing pivot relationships.
- 🧪 Add feature tests for `removeFromMine`, covering idempotency, permissions, and unknown slugs.
- 🌐 Register `removeFromMine` route in API and link it to `MeetupController`.
This commit is contained in:
HolgerHatGarKeineNode
2026-06-15 21:28:01 +02:00
parent 4b6cf95932
commit e55967e9ac
5 changed files with 99 additions and 0 deletions
+58
View File
@@ -153,3 +153,61 @@ it('returns 404 for an unknown meetup slug', function () {
$this->postJson('/api/my-meetups/does-not-exist-9999')->assertNotFound();
});
it('rejects a guest removing a meetup from mine', function () {
$meetup = Meetup::factory()->create();
$this->deleteJson('/api/my-meetups/'.$meetup->slug)->assertUnauthorized();
});
it('lets an authenticated user remove a meetup from mine by slug', function () {
Sanctum::actingAs($user = User::factory()->create());
$meetup = Meetup::factory()->create();
$user->meetups()->attach($meetup, ['is_leader' => false]);
$this->deleteJson('/api/my-meetups/'.$meetup->slug)
->assertOk()
->assertJsonPath('data.id', $meetup->id);
// Nur die Pivot-Zuordnung wird gelöst — die Stammdaten bleiben erhalten.
$this->assertDatabaseMissing('meetup_user', [
'meetup_id' => $meetup->id,
'user_id' => $user->id,
]);
$this->assertDatabaseHas('meetups', ['id' => $meetup->id]);
});
it('is idempotent and returns 200 when the meetup is not mine', function () {
Sanctum::actingAs(User::factory()->create());
$meetup = Meetup::factory()->create();
$this->deleteJson('/api/my-meetups/'.$meetup->slug)
->assertOk()
->assertJsonPath('data.id', $meetup->id);
});
it('only removes the acting users membership, not other members', function () {
$other = User::factory()->create();
$meetup = Meetup::factory()->create();
$meetup->users()->attach($other, ['is_leader' => false]);
Sanctum::actingAs($user = User::factory()->create());
$meetup->users()->attach($user, ['is_leader' => false]);
$this->deleteJson('/api/my-meetups/'.$meetup->slug)->assertOk();
$this->assertDatabaseHas('meetup_user', [
'meetup_id' => $meetup->id,
'user_id' => $other->id,
]);
$this->assertDatabaseMissing('meetup_user', [
'meetup_id' => $meetup->id,
'user_id' => $user->id,
]);
});
it('returns 404 when removing an unknown meetup slug', function () {
Sanctum::actingAs(User::factory()->create());
$this->deleteJson('/api/my-meetups/does-not-exist-9999')->assertNotFound();
});