json(['data' => $this->leaders($meetup)]); } /** * Leader einsetzen * * Setzt den Nutzer mit dem angegebenen npub als Leader ein. Existiert noch * kein Account für den npub, wird er angelegt (greift, sobald die Person sich * erstmals einloggt). Idempotent: ein bereits gesetzter Leader bleibt Leader. */ #[Response(status: 403, description: 'Nur ein Leader darf weitere Leader einsetzen.')] #[Response(status: 422, description: 'Ungültiger npub.')] public function store(StoreMeetupLeaderRequest $request, Meetup $meetup): JsonResponse { $user = NostrLogin::findOrCreateUser($request->string('npub')->toString()); $meetup->promoteLeader($user); return response()->json(['data' => $this->leaders($meetup)], HttpResponse::HTTP_CREATED); } /** * Leader entziehen * * Entzieht dem Nutzer die Leader-Rolle für dieses Meetup (Demote: bleibt * Mitglied in „Meine Meetups", darf aber nicht mehr bearbeiten). Der * Ersteller des Meetups kann nie entzogen werden. */ #[Response(status: 403, description: 'Nur ein Leader darf entziehen; der Ersteller ist geschützt.')] public function destroy(Meetup $meetup, User $user): JsonResponse { Gate::authorize('manageLeaders', $meetup); abort_if($user->getKey() === $meetup->created_by, HttpResponse::HTTP_FORBIDDEN, __('Der Ersteller des Meetups kann nicht entzogen werden.')); $meetup->demoteLeader($user); return response()->json(['data' => $this->leaders($meetup)]); } /** * Leader-Liste als flaches Array (Ersteller zuerst). * * @return array> */ private function leaders(Meetup $meetup): array { return $meetup->leaders() ->map(fn (User $user): array => [ 'id' => $user->getKey(), 'name' => $user->name, 'nostr' => $user->nostr, 'avatar' => $user->profile_photo_url, 'is_creator' => $user->getKey() === $meetup->created_by, ]) ->all(); } }