| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <?php
- namespace App\Http\Controllers;
- use App\Enums\PushNotificationTargetEnum;
- use App\Http\Requests\ManualPushRequest;
- use App\Services\ManualPushService;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Illuminate\Validation\Rule;
- class PushNotificationController extends Controller
- {
- public function __construct(protected ManualPushService $service) {}
- public function recipients(Request $request): JsonResponse
- {
- $validated = $request->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,
- ]);
- }
- }
|