PushNotificationController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Enums\PushNotificationTargetEnum;
  4. use App\Http\Requests\ManualPushRequest;
  5. use App\Services\ManualPushService;
  6. use Illuminate\Http\JsonResponse;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Validation\Rule;
  9. class PushNotificationController extends Controller
  10. {
  11. public function __construct(protected ManualPushService $service) {}
  12. public function recipients(Request $request): JsonResponse
  13. {
  14. $validated = $request->validate([
  15. 'target' => ['required', Rule::enum(PushNotificationTargetEnum::class)],
  16. 'search' => ['sometimes', 'nullable', 'string', 'max:255'],
  17. ]);
  18. $target = PushNotificationTargetEnum::from($validated['target']);
  19. $users = $this->service->recipients($target, $validated['search'] ?? null);
  20. return $this->successResponse(payload: $users->map(fn ($user) => [
  21. 'id' => $user->id,
  22. 'name' => $user->name,
  23. 'email' => $user->email,
  24. 'has_device_token' => $user->active_device_tokens_count > 0,
  25. 'push_enabled' => (bool) $user->push_notifications_enabled,
  26. ])->values());
  27. }
  28. public function send(ManualPushRequest $request): JsonResponse
  29. {
  30. $data = $request->validated();
  31. $total = $this->service->send(
  32. target: PushNotificationTargetEnum::from($data['target']),
  33. userIds: $data['user_ids'],
  34. title: $data['title'],
  35. body: $data['body'],
  36. );
  37. if ($total === 0) {
  38. return $this->errorResponse(message: __('messages.push_no_recipients'), code: 422);
  39. }
  40. return $this->successResponse(
  41. payload: ['recipients' => $total],
  42. message: __('messages.push_queued', ['count' => $total]),
  43. );
  44. }
  45. public function history(Request $request): JsonResponse
  46. {
  47. $paginated = $this->service->history(
  48. page: $request->integer('page', 1),
  49. perPage: $request->integer('per_page', 10),
  50. search: $request->input('filter'),
  51. );
  52. return $this->successResponse(payload: [
  53. 'data' => collect($paginated->items())->map(fn ($log) => [
  54. 'id' => $log->id,
  55. 'user_id' => $log->user_id,
  56. 'user_name' => $log->user?->name,
  57. 'user_email' => $log->user?->email,
  58. 'target' => $log->target?->value,
  59. 'title' => $log->title,
  60. 'body' => $log->body,
  61. 'sent_at' => $log->sent_at?->format('d/m/Y H:i'),
  62. ])->values(),
  63. 'total' => $paginated->total(),
  64. 'from' => $paginated->firstItem() ?? 0,
  65. 'to' => $paginated->lastItem() ?? 0,
  66. ]);
  67. }
  68. }