StatusController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. if(count($request->file('photo')) > config('pixelfed.max_album_length')) {
  37. return redirect()->back()->with('error', 'Too many files, max limit per post: ' . config('pixelfed.max_album_length'));
  38. }
  39. $cw = $request->filled('cw') && $request->cw == 'on' ? true : false;
  40. $monthHash = hash('sha1', date('Y') . date('m'));
  41. $userHash = hash('sha1', $user->id . (string) $user->created_at);
  42. $profile = $user->profile;
  43. $status = new Status;
  44. $status->profile_id = $profile->id;
  45. $status->caption = strip_tags($request->caption);
  46. $status->is_nsfw = $cw;
  47. $status->save();
  48. $photos = $request->file('photo');
  49. $order = 1;
  50. foreach ($photos as $k => $v) {
  51. $storagePath = "public/m/{$monthHash}/{$userHash}";
  52. $path = $v->store($storagePath);
  53. $media = new Media;
  54. $media->status_id = $status->id;
  55. $media->profile_id = $profile->id;
  56. $media->user_id = $user->id;
  57. $media->media_path = $path;
  58. $media->size = $v->getClientSize();
  59. $media->mime = $v->getClientMimeType();
  60. $media->filter_class = $request->input('filter_class');
  61. $media->filter_name = $request->input('filter_name');
  62. $media->order = $order;
  63. $media->save();
  64. ImageOptimize::dispatch($media);
  65. $order++;
  66. }
  67. NewStatusPipeline::dispatch($status);
  68. // TODO: Send to subscribers
  69. return redirect($status->url());
  70. }
  71. public function delete(Request $request)
  72. {
  73. if(!Auth::check()) {
  74. abort(403);
  75. }
  76. $this->validate($request, [
  77. 'type' => 'required|string',
  78. 'item' => 'required|integer|min:1'
  79. ]);
  80. $status = Status::findOrFail($request->input('item'));
  81. if($status->profile_id === Auth::user()->profile->id || Auth::user()->is_admin == true) {
  82. StatusDelete::dispatch($status);
  83. }
  84. return redirect(Auth::user()->url());
  85. }
  86. }