Announcement.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace App\Http\Controllers\admin;
  3. use App\Constants\HttpStatus;
  4. use App\Http\Controllers\Controller;
  5. use App\Services\AnnouncementService;
  6. use App\Support\AnnouncementFailure;
  7. use Illuminate\Support\Facades\Log;
  8. use Illuminate\Validation\ValidationException;
  9. use Throwable;
  10. class Announcement extends Controller
  11. {
  12. public function index(AnnouncementService $service) { return $this->run(fn () => $service->listing(request()->all())); }
  13. public function options(AnnouncementService $service) { return $this->run(fn () => $service->options()); }
  14. public function detail(AnnouncementService $service)
  15. {
  16. return $this->run(function () use ($service) {
  17. $params = request()->validate(['id' => ['required', 'integer', 'min:1']]);
  18. return $service->detail((int) $params['id']);
  19. });
  20. }
  21. public function submit(AnnouncementService $service) { return $this->run(fn () => $service->save(request()->all())); }
  22. public function status(AnnouncementService $service)
  23. {
  24. return $this->run(function () use ($service) {
  25. $params = request()->validate(['id' => ['required', 'integer', 'min:1'], 'status' => ['required', 'integer', 'in:0,1']]);
  26. return $service->status((int) $params['id'], (int) $params['status']);
  27. });
  28. }
  29. public function logs(AnnouncementService $service) { return $this->run(fn () => $service->logs(request()->all())); }
  30. public function delete(AnnouncementService $service)
  31. {
  32. return $this->run(function () use ($service) {
  33. $params = request()->validate(['id' => ['required', 'integer', 'min:1']]);
  34. return $service->delete((int) $params['id']);
  35. });
  36. }
  37. private function run(callable $callback)
  38. {
  39. try { return $this->success($callback()); }
  40. catch (ValidationException $e) { return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first()); }
  41. catch (Throwable $e) {
  42. Log::error('announcement_admin_failed', ['exception' => $e]);
  43. return $this->error(HttpStatus::CUSTOM_ERROR, AnnouncementFailure::message($e));
  44. }
  45. }
  46. }