ReportController.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Jobs\ReportPipeline\ReportNotifyAdminViaEmail;
  4. use App\Models\Group;
  5. use App\Profile;
  6. use App\Report;
  7. use App\Status;
  8. use Auth;
  9. use Illuminate\Http\Request;
  10. class ReportController extends Controller
  11. {
  12. protected $profile;
  13. public function __construct()
  14. {
  15. $this->middleware('auth');
  16. }
  17. public function showForm(Request $request)
  18. {
  19. $this->validate($request, [
  20. 'type' => 'required|alpha_dash|in:comment,group,post,user',
  21. 'id' => 'required|integer|min:1',
  22. ]);
  23. $type = $request->input('type');
  24. $id = $request->input('id');
  25. $pid = $request->user()->profile_id;
  26. switch ($request->input('type')) {
  27. case 'post':
  28. case 'comment':
  29. Status::findOrFail($id);
  30. break;
  31. case 'user':
  32. Profile::findOrFail($id);
  33. break;
  34. case 'group':
  35. Group::where('profile_id', '!=', $pid)->findOrFail($id);
  36. break;
  37. default:
  38. // code...
  39. break;
  40. }
  41. return view('report.form');
  42. }
  43. public function notInterestedForm(Request $request)
  44. {
  45. return view('report.not-interested');
  46. }
  47. public function spamForm(Request $request)
  48. {
  49. return view('report.spam');
  50. }
  51. public function spamCommentForm(Request $request)
  52. {
  53. return view('report.spam.comment');
  54. }
  55. public function spamPostForm(Request $request)
  56. {
  57. return view('report.spam.post');
  58. }
  59. public function spamProfileForm(Request $request)
  60. {
  61. return view('report.spam.profile');
  62. }
  63. public function sensitiveCommentForm(Request $request)
  64. {
  65. return view('report.sensitive.comment');
  66. }
  67. public function sensitivePostForm(Request $request)
  68. {
  69. return view('report.sensitive.post');
  70. }
  71. public function sensitiveProfileForm(Request $request)
  72. {
  73. return view('report.sensitive.profile');
  74. }
  75. public function abusiveCommentForm(Request $request)
  76. {
  77. return view('report.abusive.comment');
  78. }
  79. public function abusivePostForm(Request $request)
  80. {
  81. return view('report.abusive.post');
  82. }
  83. public function abusiveProfileForm(Request $request)
  84. {
  85. return view('report.abusive.profile');
  86. }
  87. public function formStore(Request $request)
  88. {
  89. $this->validate($request, [
  90. 'report' => 'required|alpha_dash',
  91. 'type' => 'required|alpha_dash',
  92. 'id' => 'required|integer|min:1',
  93. 'msg' => 'nullable|string|max:150',
  94. ]);
  95. $profile = Auth::user()->profile;
  96. $reportType = $request->input('report');
  97. $object_id = $request->input('id');
  98. $object_type = $request->input('type');
  99. $msg = $request->input('msg');
  100. $object = null;
  101. $types = [
  102. // original 3
  103. 'spam',
  104. 'sensitive',
  105. 'abusive',
  106. // new
  107. 'underage',
  108. 'copyright',
  109. 'impersonation',
  110. 'scam',
  111. 'terrorism',
  112. ];
  113. if (! in_array($reportType, $types)) {
  114. if ($request->wantsJson()) {
  115. return abort(400, 'Invalid report type');
  116. } else {
  117. return redirect('/timeline')->with('error', 'Invalid report type');
  118. }
  119. }
  120. $rpid = null;
  121. switch ($object_type) {
  122. case 'post':
  123. $object = Status::findOrFail($object_id);
  124. $object_type = 'App\Status';
  125. $exists = Report::whereUserId(Auth::id())
  126. ->whereObjectId($object->id)
  127. ->whereObjectType('App\Status')
  128. ->count();
  129. $rpid = $object->profile_id;
  130. break;
  131. case 'user':
  132. $object = Profile::findOrFail($object_id);
  133. $object_type = 'App\Profile';
  134. $exists = Report::whereUserId(Auth::id())
  135. ->whereObjectId($object->id)
  136. ->whereObjectType('App\Profile')
  137. ->count();
  138. $rpid = $object->id;
  139. break;
  140. case 'group':
  141. $object = Group::findOrFail($object_id);
  142. $object_type = 'App\Models\Group';
  143. $exists = Report::whereUserId(Auth::id())
  144. ->whereObjectId($object->id)
  145. ->whereObjectType('App\Models\Group')
  146. ->count();
  147. $rpid = $object->profile_id;
  148. break;
  149. default:
  150. if ($request->wantsJson()) {
  151. return abort(400, 'Invalid report type');
  152. } else {
  153. return redirect('/timeline')->with('error', 'Invalid report type');
  154. }
  155. break;
  156. }
  157. if ($exists !== 0) {
  158. if ($request->wantsJson()) {
  159. return response()->json(200);
  160. } else {
  161. return redirect('/timeline')->with('error', 'You have already reported this!');
  162. }
  163. }
  164. if ($object->profile_id == $profile->id) {
  165. if ($request->wantsJson()) {
  166. return response()->json(200);
  167. } else {
  168. return redirect('/timeline')->with('error', 'You cannot report your own content!');
  169. }
  170. }
  171. $report = new Report;
  172. $report->profile_id = $profile->id;
  173. $report->user_id = Auth::id();
  174. $report->object_id = $object->id;
  175. $report->object_type = $object_type;
  176. $report->reported_profile_id = $rpid;
  177. $report->type = $request->input('report');
  178. $report->message = e($request->input('msg'));
  179. $report->save();
  180. if (config('instance.reports.email.enabled')) {
  181. ReportNotifyAdminViaEmail::dispatch($report)->onQueue('default');
  182. }
  183. if ($request->wantsJson()) {
  184. return response()->json(200);
  185. } else {
  186. return redirect('/timeline')->with('status', 'Report successfully sent!');
  187. }
  188. }
  189. }