1
0

StatusController.php 2.4 KB

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