GroupsAdminController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <?php
  2. namespace App\Http\Controllers\Groups;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Services\GroupService;
  6. use App\Instance;
  7. use App\Profile;
  8. use App\Models\Group;
  9. use App\Models\GroupBlock;
  10. use App\Models\GroupCategory;
  11. use App\Models\GroupInteraction;
  12. use App\Models\GroupPost;
  13. use App\Models\GroupMember;
  14. use App\Models\GroupReport;
  15. use App\Services\Groups\GroupAccountService;
  16. use App\Services\Groups\GroupPostService;
  17. class GroupsAdminController extends Controller
  18. {
  19. public function __construct()
  20. {
  21. $this->middleware('auth');
  22. }
  23. public function getAdminTabs(Request $request, $id)
  24. {
  25. abort_if(!$request->user(), 404);
  26. $group = Group::findOrFail($id);
  27. $pid = $request->user()->profile_id;
  28. abort_if(!$group->isMember($pid), 404);
  29. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  30. abort_if($pid !== $group->profile_id, 404);
  31. $reqs = GroupMember::whereGroupId($group->id)->whereJoinRequest(true)->count();
  32. $mods = GroupReport::whereGroupId($group->id)->whereOpen(true)->count();
  33. $tabs = [
  34. 'moderation_count' => $mods > 99 ? '99+' : $mods,
  35. 'request_count' => $reqs > 99 ? '99+' : $reqs
  36. ];
  37. return response()->json($tabs);
  38. }
  39. public function getInteractionLogs(Request $request, $id)
  40. {
  41. abort_if(!$request->user(), 404);
  42. $group = Group::findOrFail($id);
  43. $pid = $request->user()->profile_id;
  44. abort_if(!$group->isMember($pid), 404);
  45. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  46. $logs = GroupInteraction::whereGroupId($id)
  47. ->latest()
  48. ->paginate(10)
  49. ->map(function($log) use($group) {
  50. return [
  51. 'id' => $log->id,
  52. 'profile' => GroupAccountService::get($group->id, $log->profile_id),
  53. 'type' => $log->type,
  54. 'metadata' => $log->metadata,
  55. 'created_at' => $log->created_at->format('c')
  56. ];
  57. });
  58. return response()->json($logs, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  59. }
  60. public function getBlocks(Request $request, $id)
  61. {
  62. abort_if(!$request->user(), 404);
  63. $group = Group::findOrFail($id);
  64. $pid = $request->user()->profile_id;
  65. abort_if(!$group->isMember($pid), 404);
  66. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  67. $blocks = [
  68. 'instances' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(false)->latest()->take(3)->pluck('name'),
  69. 'users' => GroupBlock::whereGroupId($group->id)->whereNotNull('profile_id')->whereIsUser(true)->latest()->take(3)->pluck('name'),
  70. 'moderated' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(true)->latest()->take(3)->pluck('name')
  71. ];
  72. return response()->json($blocks, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  73. }
  74. public function exportBlocks(Request $request, $id)
  75. {
  76. abort_if(!$request->user(), 404);
  77. $group = Group::findOrFail($id);
  78. $pid = $request->user()->profile_id;
  79. abort_if(!$group->isMember($pid), 404);
  80. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  81. $blocks = [
  82. 'instances' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(false)->latest()->pluck('name'),
  83. 'users' => GroupBlock::whereGroupId($group->id)->whereNotNull('profile_id')->whereIsUser(true)->latest()->pluck('name'),
  84. 'moderated' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(true)->latest()->pluck('name')
  85. ];
  86. $blocks['_created_at'] = now()->format('c');
  87. $blocks['_version'] = '1.0.0';
  88. ksort($blocks);
  89. return response()->streamDownload(function() use($blocks) {
  90. echo json_encode($blocks, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  91. });
  92. }
  93. public function addBlock(Request $request, $id)
  94. {
  95. abort_if(!$request->user(), 404);
  96. $group = Group::findOrFail($id);
  97. $pid = $request->user()->profile_id;
  98. abort_if(!$group->isMember($pid), 404);
  99. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  100. $this->validate($request, [
  101. 'item' => 'required',
  102. 'type' => 'required|in:instance,user,moderate'
  103. ]);
  104. $item = $request->input('item');
  105. $type = $request->input('type');
  106. switch($type) {
  107. case 'instance':
  108. $instance = Instance::whereDomain($item)->first();
  109. abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
  110. $gb = new GroupBlock;
  111. $gb->group_id = $group->id;
  112. $gb->admin_id = $pid;
  113. $gb->instance_id = $instance->id;
  114. $gb->name = $instance->domain;
  115. $gb->is_user = false;
  116. $gb->moderated = false;
  117. $gb->save();
  118. GroupService::log(
  119. $group->id,
  120. $pid,
  121. 'group:admin:block:instance',
  122. [
  123. 'domain' => $instance->domain
  124. ],
  125. GroupBlock::class,
  126. $gb->id
  127. );
  128. return [200];
  129. break;
  130. case 'user':
  131. $profile = Profile::whereUsername($item)->first();
  132. abort_if(!$profile, 422, 'This user either isn\'nt known or is invalid');
  133. $gb = new GroupBlock;
  134. $gb->group_id = $group->id;
  135. $gb->admin_id = $pid;
  136. $gb->profile_id = $profile->id;
  137. $gb->name = $profile->username;
  138. $gb->is_user = true;
  139. $gb->moderated = false;
  140. $gb->save();
  141. GroupService::log(
  142. $group->id,
  143. $pid,
  144. 'group:admin:block:user',
  145. [
  146. 'username' => $profile->username,
  147. 'domain' => $profile->domain
  148. ],
  149. GroupBlock::class,
  150. $gb->id
  151. );
  152. return [200];
  153. break;
  154. case 'moderate':
  155. $instance = Instance::whereDomain($item)->first();
  156. abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
  157. $gb = new GroupBlock;
  158. $gb->group_id = $group->id;
  159. $gb->admin_id = $pid;
  160. $gb->instance_id = $instance->id;
  161. $gb->name = $instance->domain;
  162. $gb->is_user = false;
  163. $gb->moderated = true;
  164. $gb->save();
  165. GroupService::log(
  166. $group->id,
  167. $pid,
  168. 'group:admin:moderate:instance',
  169. [
  170. 'domain' => $instance->domain
  171. ],
  172. GroupBlock::class,
  173. $gb->id
  174. );
  175. return [200];
  176. break;
  177. default:
  178. return response()->json([], 422, []);
  179. break;
  180. }
  181. }
  182. public function undoBlock(Request $request, $id)
  183. {
  184. abort_if(!$request->user(), 404);
  185. $group = Group::findOrFail($id);
  186. $pid = $request->user()->profile_id;
  187. abort_if(!$group->isMember($pid), 404);
  188. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  189. $this->validate($request, [
  190. 'item' => 'required',
  191. 'type' => 'required|in:instance,user,moderate'
  192. ]);
  193. $item = $request->input('item');
  194. $type = $request->input('type');
  195. switch($type) {
  196. case 'instance':
  197. $instance = Instance::whereDomain($item)->first();
  198. abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
  199. $gb = GroupBlock::whereGroupId($group->id)
  200. ->whereInstanceId($instance->id)
  201. ->whereModerated(false)
  202. ->first();
  203. abort_if(!$gb, 422, 'Invalid group block');
  204. GroupService::log(
  205. $group->id,
  206. $pid,
  207. 'group:admin:unblock:instance',
  208. [
  209. 'domain' => $instance->domain
  210. ],
  211. GroupBlock::class,
  212. $gb->id
  213. );
  214. $gb->delete();
  215. return [200];
  216. break;
  217. case 'user':
  218. $profile = Profile::whereUsername($item)->first();
  219. abort_if(!$profile, 422, 'This user either isn\'nt known or is invalid');
  220. $gb = GroupBlock::whereGroupId($group->id)
  221. ->whereProfileId($profile->id)
  222. ->whereIsUser(true)
  223. ->first();
  224. abort_if(!$gb, 422, 'Invalid group block');
  225. GroupService::log(
  226. $group->id,
  227. $pid,
  228. 'group:admin:unblock:user',
  229. [
  230. 'username' => $profile->username,
  231. 'domain' => $profile->domain
  232. ],
  233. GroupBlock::class,
  234. $gb->id
  235. );
  236. $gb->delete();
  237. return [200];
  238. break;
  239. case 'moderate':
  240. $instance = Instance::whereDomain($item)->first();
  241. abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
  242. $gb = GroupBlock::whereGroupId($group->id)
  243. ->whereInstanceId($instance->id)
  244. ->whereModerated(true)
  245. ->first();
  246. abort_if(!$gb, 422, 'Invalid group block');
  247. GroupService::log(
  248. $group->id,
  249. $pid,
  250. 'group:admin:moderate:instance',
  251. [
  252. 'domain' => $instance->domain
  253. ],
  254. GroupBlock::class,
  255. $gb->id
  256. );
  257. $gb->delete();
  258. return [200];
  259. break;
  260. default:
  261. return response()->json([], 422, []);
  262. break;
  263. }
  264. }
  265. public function getReportList(Request $request, $id)
  266. {
  267. abort_if(!$request->user(), 404);
  268. $group = Group::findOrFail($id);
  269. $pid = $request->user()->profile_id;
  270. abort_if(!$group->isMember($pid), 404);
  271. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  272. $scope = $request->input('scope', 'open');
  273. $list = GroupReport::selectRaw('id, profile_id, item_type, item_id, type, created_at, count(*) as total')
  274. ->whereGroupId($group->id)
  275. ->groupBy('item_id')
  276. ->when($scope == 'open', function($query, $scope) {
  277. return $query->whereOpen(true);
  278. })
  279. ->latest()
  280. ->simplePaginate(10)
  281. ->map(function($report) use($group) {
  282. $res = [
  283. 'id' => (string) $report->id,
  284. 'profile' => GroupAccountService::get($group->id, $report->profile_id),
  285. 'type' => $report->type,
  286. 'created_at' => $report->created_at->format('c'),
  287. 'total_count' => $report->total
  288. ];
  289. if($report->item_type === GroupPost::class) {
  290. $res['status'] = GroupPostService::get($group->id, $report->item_id);
  291. }
  292. return $res;
  293. });
  294. return response()->json($list, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  295. }
  296. }