Files
einundzwanzig-app/app/Policies/MeetupPolicy.php
T
HolgerHatGarKeineNode e55967e9ac 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`.
2026-06-15 21:28:01 +02:00

78 lines
2.4 KiB
PHP

<?php
namespace App\Policies;
use App\Models\Meetup;
use App\Models\User;
use App\Policies\Concerns\ChecksCreatorOwnership;
class MeetupPolicy
{
use ChecksCreatorOwnership;
public function viewAny(User $user): bool
{
return true;
}
public function view(User $user, Meetup $meetup): bool
{
return $this->owns($user, $meetup);
}
/**
* Sichtbarkeit der „Meine Meetups"-Detailansicht: Neben dem Ersteller darf
* jedes Mitglied der meetup_user-Pivot („Meine Meetups" im Dashboard) das
* abonnierte Meetup über die REST-API ansehen. Spiegelt die Listen-Semantik
* von MeetupController::mine(), die ebenfalls die Pivot-Mitgliedschaft nutzt.
*/
public function viewMine(User $user, Meetup $meetup): bool
{
return $this->owns($user, $meetup) || $meetup->hasMember($user);
}
public function create(User $user): bool
{
return true;
}
/**
* Ein bestehendes Meetup zu „Meine Meetups" hinzufügen (meetup_user-Pivot als
* Mitglied, nicht als Leader). Jeder authentifizierte Nutzer darf das — die
* Stammdaten bleiben dem Ersteller vorbehalten (siehe update()). Spiegelt die
* offene Semantik des AddMeetupToMineTool (MCP).
*/
public function addToMine(User $user, Meetup $meetup): bool
{
return true;
}
/**
* Ein Meetup wieder aus „Meine Meetups" entfernen (löst die meetup_user-Pivot
* des Nutzers). Spiegelt die offene Semantik von addToMine(): jeder
* authentifizierte Nutzer darf seine eigene Zuordnung lösen. Die Stammdaten
* bleiben dem Ersteller vorbehalten (siehe update()).
*/
public function removeFromMine(User $user, Meetup $meetup): bool
{
return true;
}
public function update(User $user, Meetup $meetup): bool
{
return $this->owns($user, $meetup);
}
/**
* Gelockerte Update-Regel ausschließlich für das Portal-Frontend (Livewire):
* Neben dem Ersteller darf auch jedes Mitglied der meetup_user-Pivot
* („Meine Meetups" im Dashboard) die Stammdaten bearbeiten. REST-API und
* MCP nutzen weiterhin die strikte update()-Ability. Übergangslösung, bis
* ein echtes Rollen-/Freigabekonzept existiert.
*/
public function updateViaPortal(User $user, Meetup $meetup): bool
{
return $this->owns($user, $meetup) || $meetup->hasMember($user);
}
}