IconController.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Api\v1\Controllers;
  3. use App\Api\v1\Requests\IconFetchRequest;
  4. use App\Facades\IconStore;
  5. use App\Helpers\Helpers;
  6. use App\Http\Controllers\Controller;
  7. use App\Models\TwoFAccount;
  8. use App\Services\LogoService;
  9. use Exception;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Http\UploadedFile;
  12. class IconController extends Controller
  13. {
  14. /**
  15. * Handle uploaded icon image
  16. *
  17. * @return \Illuminate\Http\JsonResponse
  18. */
  19. public function upload(Request $request)
  20. {
  21. $this->validate($request, [
  22. 'icon' => 'required|image',
  23. ]);
  24. $icon = $request->file('icon');
  25. $isStored = $name = false;
  26. if ($icon instanceof UploadedFile) {
  27. try {
  28. if ($content = $icon->get()) {
  29. $name = Helpers::getRandomFilename($icon->extension());
  30. $isStored = IconStore::store($name, $content);
  31. }
  32. }
  33. catch (Exception) { }
  34. }
  35. return $isStored
  36. ? response()->json(['filename' => $name], 201)
  37. : response()->json(['message' => __('errors.file_upload_failed')], 500);
  38. }
  39. /**
  40. * Fetch a logo
  41. *
  42. * @return \Illuminate\Http\JsonResponse
  43. */
  44. public function fetch(IconFetchRequest $request, LogoService $logoService)
  45. {
  46. $validated = $request->validated();
  47. $icon = $logoService->getIcon($validated['service']);
  48. return $icon
  49. ? response()->json(['filename' => $icon], 201)
  50. : response()->json(null, 204);
  51. }
  52. /**
  53. * delete an icon
  54. *
  55. * @return \Illuminate\Http\JsonResponse
  56. */
  57. public function delete(string $icon, Request $request)
  58. {
  59. // An icon affected to someone else's twofaccount cannot be deleted
  60. if ($icon && TwoFAccount::where('icon', $icon)->where('user_id', '<>', $request->user()->id)->count() > 0) {
  61. abort(403, 'unauthorized');
  62. }
  63. IconStore::delete($icon);
  64. return response()->json(null, 204);
  65. }
  66. }