TelegramChannel.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace App\Http\Controllers\admin;
  3. use App\Constants\HttpStatus;
  4. use App\Http\Controllers\Controller;
  5. use App\Services\TelegramChannelService;
  6. use App\Services\TelegramChannelMessageService;
  7. use Closure;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Validation\ValidationException;
  11. class TelegramChannel extends Controller
  12. {
  13. public function index(TelegramChannelService $channels): JsonResponse
  14. {
  15. return $this->success(['list' => $channels->list()]);
  16. }
  17. public function messages(Request $request, TelegramChannelMessageService $messages): JsonResponse
  18. {
  19. return $this->respond(function () use ($request, $messages) {
  20. $data = $request->validate(['page' => 'sometimes|required|integer|min:1']);
  21. return $messages->list((int) ($data['page'] ?? 1));
  22. });
  23. }
  24. public function createMessage(Request $request, TelegramChannelMessageService $messages): JsonResponse
  25. {
  26. return $this->respond(fn () => $messages->create($request->all()));
  27. }
  28. public function cancelMessage(Request $request, TelegramChannelMessageService $messages): JsonResponse
  29. {
  30. return $this->respond(function () use ($request, $messages) {
  31. $messages->cancel($this->id($request));
  32. return [];
  33. });
  34. }
  35. public function bots(TelegramChannelService $channels): JsonResponse
  36. {
  37. return $this->success(['list' => $channels->bots()]);
  38. }
  39. public function saveBot(Request $request, TelegramChannelService $channels): JsonResponse
  40. {
  41. return $this->respond(fn () => $channels->saveBot($request->all()));
  42. }
  43. public function deleteBot(Request $request, TelegramChannelService $channels): JsonResponse
  44. {
  45. return $this->respond(function () use ($request, $channels) {
  46. $channels->deleteBot($this->id($request));
  47. return [];
  48. });
  49. }
  50. public function privateMenu(Request $request, TelegramChannelService $channels): JsonResponse
  51. {
  52. return $this->respond(fn () => $request->has('language')
  53. ? $channels->privateMenu($this->id($request), $this->menuLanguage($request))
  54. : ['menus' => (object) $channels->privateMenus($this->id($request))]);
  55. }
  56. public function savePrivateMenu(Request $request, TelegramChannelService $channels): JsonResponse
  57. {
  58. return $this->respond(function () use ($request, $channels) {
  59. $id = $this->id($request);
  60. if ($request->has('language')) {
  61. return $channels->savePrivateMenu($id, $this->menuLanguage($request), $request->all());
  62. }
  63. $data = $request->validate(['menus' => 'required|array:zh,en,vi|min:1', 'menus.*' => 'required|array']);
  64. return ['menus' => $channels->savePrivateMenus($id, $data['menus'])];
  65. });
  66. }
  67. public function registerPrivateWebhook(Request $request, TelegramChannelService $channels): JsonResponse
  68. {
  69. return $this->respond(fn () => $channels->registerPrivateWebhook($this->id($request)));
  70. }
  71. private function menuLanguage(Request $request): string
  72. {
  73. return $request->validate(['language' => 'required|in:zh,en,vi'])['language'];
  74. }
  75. public function detail(Request $request, TelegramChannelService $channels): JsonResponse
  76. {
  77. return $this->respond(fn () => $channels->detail($this->id($request)));
  78. }
  79. public function save(Request $request, TelegramChannelService $channels): JsonResponse
  80. {
  81. return $this->respond(fn () => $channels->save($request->all()));
  82. }
  83. public function delete(Request $request, TelegramChannelService $channels): JsonResponse
  84. {
  85. return $this->respond(function () use ($request, $channels) {
  86. $channels->delete($this->id($request));
  87. return [];
  88. });
  89. }
  90. public function publish(Request $request, TelegramChannelService $channels): JsonResponse
  91. {
  92. return $this->respond(function () use ($request, $channels) {
  93. $data = $request->validate(['id' => 'required|integer|min:1', 'isTop' => 'sometimes|required|boolean']);
  94. return $channels->publish((int) $data['id'], (bool) ($data['isTop'] ?? false));
  95. });
  96. }
  97. private function id(Request $request): int
  98. {
  99. return (int) $request->validate(['id' => 'required|integer|min:1'])['id'];
  100. }
  101. private function respond(Closure $action): JsonResponse
  102. {
  103. try {
  104. return $this->success($action());
  105. } catch (ValidationException $e) {
  106. return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());
  107. }
  108. }
  109. }