validate([ 'target' => ['required', Rule::enum(PushNotificationTargetEnum::class)], 'search' => ['sometimes', 'nullable', 'string', 'max:255'], ]); $target = PushNotificationTargetEnum::from($validated['target']); $users = $this->service->recipients($target, $validated['search'] ?? null); return $this->successResponse(payload: $users->map(fn ($user) => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'has_device_token' => $user->active_device_tokens_count > 0, 'push_enabled' => (bool) $user->push_notifications_enabled, ])->values()); } public function send(ManualPushRequest $request): JsonResponse { $data = $request->validated(); $total = $this->service->send( target: PushNotificationTargetEnum::from($data['target']), userIds: $data['user_ids'], title: $data['title'], body: $data['body'], ); if ($total === 0) { return $this->errorResponse(message: __('messages.push_no_recipients'), code: 422); } return $this->successResponse( payload: ['recipients' => $total], message: __('messages.push_queued', ['count' => $total]), ); } public function history(Request $request): JsonResponse { $paginated = $this->service->history( page: $request->integer('page', 1), perPage: $request->integer('per_page', 10), search: $request->input('filter'), ); return $this->successResponse(payload: [ 'data' => collect($paginated->items())->map(fn ($log) => [ 'id' => $log->id, 'user_id' => $log->user_id, 'user_name' => $log->user?->name, 'user_email' => $log->user?->email, 'target' => $log->target?->value, 'title' => $log->title, 'body' => $log->body, 'sent_at' => $log->sent_at?->format('d/m/Y H:i'), ])->values(), 'total' => $paginated->total(), 'from' => $paginated->firstItem() ?? 0, 'to' => $paginated->lastItem() ?? 0, ]); } }