AdminReportController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use Cache;
  4. use App\Report;
  5. use App\User;
  6. use Carbon\Carbon;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Redis;
  9. use App\Services\AccountService;
  10. use App\Services\StatusService;
  11. trait AdminReportController
  12. {
  13. public function updateReport(Request $request, $id)
  14. {
  15. $this->validate($request, [
  16. 'action' => 'required|string',
  17. ]);
  18. $action = $request->input('action');
  19. $actions = [
  20. 'ignore',
  21. 'cw',
  22. 'unlist',
  23. 'delete',
  24. 'shadowban',
  25. 'ban',
  26. ];
  27. if (!in_array($action, $actions)) {
  28. return abort(403);
  29. }
  30. $report = Report::findOrFail($id);
  31. $this->handleReportAction($report, $action);
  32. Cache::forget('admin-dash:reports:list-cache');
  33. return response()->json(['msg'=> 'Success']);
  34. }
  35. public function handleReportAction(Report $report, $action)
  36. {
  37. $item = $report->reported();
  38. $report->admin_seen = Carbon::now();
  39. switch ($action) {
  40. case 'ignore':
  41. $report->not_interested = true;
  42. break;
  43. case 'cw':
  44. Cache::forget('status:thumb:'.$item->id);
  45. $item->is_nsfw = true;
  46. $item->save();
  47. $report->nsfw = true;
  48. StatusService::del($item->id);
  49. break;
  50. case 'unlist':
  51. $item->visibility = 'unlisted';
  52. $item->save();
  53. Cache::forget('profiles:private');
  54. StatusService::del($item->id);
  55. break;
  56. case 'delete':
  57. // Todo: fire delete job
  58. $report->admin_seen = null;
  59. StatusService::del($item->id);
  60. break;
  61. case 'shadowban':
  62. // Todo: fire delete job
  63. $report->admin_seen = null;
  64. break;
  65. case 'ban':
  66. // Todo: fire delete job
  67. $report->admin_seen = null;
  68. break;
  69. default:
  70. $report->admin_seen = null;
  71. break;
  72. }
  73. $report->save();
  74. return $this;
  75. }
  76. protected function actionMap()
  77. {
  78. return [
  79. '1' => 'ignore',
  80. '2' => 'cw',
  81. '3' => 'unlist',
  82. '4' => 'delete',
  83. '5' => 'shadowban',
  84. '6' => 'ban'
  85. ];
  86. }
  87. public function bulkUpdateReport(Request $request)
  88. {
  89. $this->validate($request, [
  90. 'action' => 'required|integer|min:1|max:10',
  91. 'ids' => 'required|array'
  92. ]);
  93. $action = $this->actionMap()[$request->input('action')];
  94. $ids = $request->input('ids');
  95. $reports = Report::whereIn('id', $ids)->whereNull('admin_seen')->get();
  96. foreach($reports as $report) {
  97. $this->handleReportAction($report, $action);
  98. }
  99. $res = [
  100. 'message' => 'Success',
  101. 'code' => 200
  102. ];
  103. return response()->json($res);
  104. }
  105. public function reportMailVerifications(Request $request)
  106. {
  107. $ids = Redis::smembers('email:manual');
  108. $ignored = Redis::smembers('email:manual-ignored');
  109. $reports = [];
  110. if($ids) {
  111. $reports = collect($ids)
  112. ->filter(function($id) use($ignored) {
  113. return !in_array($id, $ignored);
  114. })
  115. ->map(function($id) {
  116. $account = AccountService::get($id);
  117. $user = User::whereProfileId($id)->first();
  118. if(!$user) {
  119. return [];
  120. }
  121. $account['email'] = $user->email;
  122. return $account;
  123. })
  124. ->filter(function($res) {
  125. return isset($res['id']);
  126. })
  127. ->values();
  128. }
  129. return view('admin.reports.mail_verification', compact('reports', 'ignored'));
  130. }
  131. public function reportMailVerifyIgnore(Request $request)
  132. {
  133. $id = $request->input('id');
  134. Redis::sadd('email:manual-ignored', $id);
  135. return redirect('/i/admin/reports');
  136. }
  137. public function reportMailVerifyApprove(Request $request)
  138. {
  139. $id = $request->input('id');
  140. $user = User::whereProfileId($id)->firstOrFail();
  141. Redis::srem('email:manual', $id);
  142. Redis::srem('email:manual-ignored', $id);
  143. $user->email_verified_at = now();
  144. $user->save();
  145. return redirect('/i/admin/reports');
  146. }
  147. public function reportMailVerifyClearIgnored(Request $request)
  148. {
  149. Redis::del('email:manual-ignored');
  150. return [200];
  151. }
  152. }