IconController.php 2.4 KB

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