StatusController.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Auth, Cache;
  4. use App\Jobs\StatusPipeline\{NewStatusPipeline, StatusDelete};
  5. use App\Jobs\ImageOptimizePipeline\ImageOptimize;
  6. use Illuminate\Http\Request;
  7. use App\{Media, Profile, Status, User};
  8. use Vinkla\Hashids\Facades\Hashids;
  9. class StatusController extends Controller
  10. {
  11. public function show(Request $request, $username, int $id)
  12. {
  13. $user = Profile::whereUsername($username)->firstOrFail();
  14. $status = Status::whereProfileId($user->id)
  15. ->withCount(['likes', 'comments', 'media'])
  16. ->findOrFail($id);
  17. if(!$status->media_path && $status->in_reply_to_id) {
  18. return redirect($status->url());
  19. }
  20. return view('status.show', compact('user', 'status'));
  21. }
  22. public function store(Request $request)
  23. {
  24. if(Auth::check() == false)
  25. {
  26. abort(403);
  27. }
  28. $user = Auth::user();
  29. $this->validate($request, [
  30. 'photo.*' => 'required|mimes:jpeg,png,bmp,gif|max:' . config('pixelfed.max_photo_size'),
  31. 'caption' => 'string|max:' . config('pixelfed.max_caption_length'),
  32. 'cw' => 'nullable|string',
  33. 'filter_class' => 'nullable|string',
  34. 'filter_name' => 'nullable|string',
  35. ]);
  36. $cw = $request->filled('cw') && $request->cw == 'on' ? true : false;
  37. $monthHash = hash('sha1', date('Y') . date('m'));
  38. $userHash = hash('sha1', $user->id . (string) $user->created_at);
  39. $profile = $user->profile;
  40. $status = new Status;
  41. $status->profile_id = $profile->id;
  42. $status->caption = strip_tags($request->caption);
  43. $status->is_nsfw = $cw;
  44. $status->save();
  45. $photos = $request->file('photo');
  46. $order = 1;
  47. foreach ($photos as $k => $v) {
  48. $storagePath = "public/m/{$monthHash}/{$userHash}";
  49. $path = $v->store($storagePath);
  50. $media = new Media;
  51. $media->status_id = $status->id;
  52. $media->profile_id = $profile->id;
  53. $media->user_id = $user->id;
  54. $media->media_path = $path;
  55. $media->size = $v->getClientSize();
  56. $media->mime = $v->getClientMimeType();
  57. $media->filter_class = $request->input('filter_class');
  58. $media->filter_name = $request->input('filter_name');
  59. $media->order = $order;
  60. $media->save();
  61. ImageOptimize::dispatch($media);
  62. $order++;
  63. }
  64. NewStatusPipeline::dispatch($status);
  65. // TODO: Send to subscribers
  66. return redirect($status->url());
  67. }
  68. public function delete(Request $request)
  69. {
  70. if(!Auth::check()) {
  71. abort(403);
  72. }
  73. $this->validate($request, [
  74. 'type' => 'required|string',
  75. 'item' => 'required|integer|min:1'
  76. ]);
  77. $status = Status::findOrFail($request->input('item'));
  78. if($status->profile_id === Auth::user()->profile->id || Auth::user()->is_admin == true) {
  79. StatusDelete::dispatch($status);
  80. }
  81. return redirect(Auth::user()->url());
  82. }
  83. }