StatusController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. $replies = Status::whereInReplyToId($status->id)->simplePaginate(30);
  21. return view('status.show', compact('user', 'status', 'replies'));
  22. }
  23. public function compose()
  24. {
  25. if(Auth::check() == false)
  26. {
  27. abort(403);
  28. }
  29. return view('status.compose');
  30. }
  31. public function store(Request $request)
  32. {
  33. if(Auth::check() == false)
  34. {
  35. abort(403);
  36. }
  37. $user = Auth::user();
  38. $size = Media::whereUserId($user->id)->sum('size') / 1000;
  39. $limit = (int) config('pixelfed.max_account_size');
  40. if($size >= $limit) {
  41. return redirect()->back()->with('error', 'You have exceeded your storage limit. Please click <a href="#">here</a> for more info.');
  42. }
  43. $this->validate($request, [
  44. 'photo.*' => 'required|mimes:jpeg,png,bmp,gif|max:' . config('pixelfed.max_photo_size'),
  45. 'caption' => 'string|max:' . config('pixelfed.max_caption_length'),
  46. 'cw' => 'nullable|string',
  47. 'filter_class' => 'nullable|string',
  48. 'filter_name' => 'nullable|string',
  49. ]);
  50. if(count($request->file('photo')) > config('pixelfed.max_album_length')) {
  51. return redirect()->back()->with('error', 'Too many files, max limit per post: ' . config('pixelfed.max_album_length'));
  52. }
  53. $cw = $request->filled('cw') && $request->cw == 'on' ? true : false;
  54. $monthHash = hash('sha1', date('Y') . date('m'));
  55. $userHash = hash('sha1', $user->id . (string) $user->created_at);
  56. $profile = $user->profile;
  57. $status = new Status;
  58. $status->profile_id = $profile->id;
  59. $status->caption = strip_tags($request->caption);
  60. $status->is_nsfw = $cw;
  61. $status->save();
  62. $photos = $request->file('photo');
  63. $order = 1;
  64. foreach ($photos as $k => $v) {
  65. $storagePath = "public/m/{$monthHash}/{$userHash}";
  66. $path = $v->store($storagePath);
  67. $media = new Media;
  68. $media->status_id = $status->id;
  69. $media->profile_id = $profile->id;
  70. $media->user_id = $user->id;
  71. $media->media_path = $path;
  72. $media->size = $v->getClientSize();
  73. $media->mime = $v->getClientMimeType();
  74. $media->filter_class = $request->input('filter_class');
  75. $media->filter_name = $request->input('filter_name');
  76. $media->order = $order;
  77. $media->save();
  78. ImageOptimize::dispatch($media);
  79. $order++;
  80. }
  81. NewStatusPipeline::dispatch($status);
  82. // TODO: Send to subscribers
  83. return redirect($status->url());
  84. }
  85. public function delete(Request $request)
  86. {
  87. if(!Auth::check()) {
  88. abort(403);
  89. }
  90. $this->validate($request, [
  91. 'type' => 'required|string',
  92. 'item' => 'required|integer|min:1'
  93. ]);
  94. $status = Status::findOrFail($request->input('item'));
  95. if($status->profile_id === Auth::user()->profile->id || Auth::user()->is_admin == true) {
  96. StatusDelete::dispatch($status);
  97. }
  98. return redirect(Auth::user()->url());
  99. }
  100. public function storeShare(Request $request)
  101. {
  102. $this->validate($request, [
  103. 'item' => 'required|integer',
  104. ]);
  105. $profile = Auth::user()->profile;
  106. $status = Status::withCount('shares')->findOrFail($request->input('item'));
  107. $count = $status->shares_count;
  108. $exists = Status::whereProfileId(Auth::user()->profile->id)
  109. ->whereReblogOfId($status->id)
  110. ->count();
  111. if($exists !== 0) {
  112. $shares = Status::whereProfileId(Auth::user()->profile->id)
  113. ->whereReblogOfId($status->id)
  114. ->get();
  115. foreach($shares as $share) {
  116. $share->delete();
  117. $count--;
  118. }
  119. } else {
  120. $share = new Status;
  121. $share->profile_id = $profile->id;
  122. $share->reblog_of_id = $status->id;
  123. $share->save();
  124. $count++;
  125. }
  126. if($request->ajax()) {
  127. $response = ['code' => 200, 'msg' => 'Share saved', 'count' => $count];
  128. } else {
  129. $response = redirect($status->url());
  130. }
  131. return $response;
  132. }
  133. }