123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- <?php
- namespace App\Http\Controllers\Groups;
- use App\Http\Controllers\Controller;
- use Illuminate\Http\Request;
- use App\Services\GroupService;
- use App\Instance;
- use App\Profile;
- use App\Models\Group;
- use App\Models\GroupBlock;
- use App\Models\GroupCategory;
- use App\Models\GroupInteraction;
- use App\Models\GroupPost;
- use App\Models\GroupMember;
- use App\Models\GroupReport;
- use App\Services\Groups\GroupAccountService;
- use App\Services\Groups\GroupPostService;
- class GroupsAdminController extends Controller
- {
- public function __construct()
- {
- $this->middleware('auth');
- }
- public function getAdminTabs(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- abort_if($pid !== $group->profile_id, 404);
- $reqs = GroupMember::whereGroupId($group->id)->whereJoinRequest(true)->count();
- $mods = GroupReport::whereGroupId($group->id)->whereOpen(true)->count();
- $tabs = [
- 'moderation_count' => $mods > 99 ? '99+' : $mods,
- 'request_count' => $reqs > 99 ? '99+' : $reqs
- ];
- return response()->json($tabs);
- }
- public function getInteractionLogs(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $logs = GroupInteraction::whereGroupId($id)
- ->latest()
- ->paginate(10)
- ->map(function($log) use($group) {
- return [
- 'id' => $log->id,
- 'profile' => GroupAccountService::get($group->id, $log->profile_id),
- 'type' => $log->type,
- 'metadata' => $log->metadata,
- 'created_at' => $log->created_at->format('c')
- ];
- });
- return response()->json($logs, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
- }
- public function getBlocks(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $blocks = [
- 'instances' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(false)->latest()->take(3)->pluck('name'),
- 'users' => GroupBlock::whereGroupId($group->id)->whereNotNull('profile_id')->whereIsUser(true)->latest()->take(3)->pluck('name'),
- 'moderated' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(true)->latest()->take(3)->pluck('name')
- ];
- return response()->json($blocks, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
- }
- public function exportBlocks(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $blocks = [
- 'instances' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(false)->latest()->pluck('name'),
- 'users' => GroupBlock::whereGroupId($group->id)->whereNotNull('profile_id')->whereIsUser(true)->latest()->pluck('name'),
- 'moderated' => GroupBlock::whereGroupId($group->id)->whereNotNull('instance_id')->whereModerated(true)->latest()->pluck('name')
- ];
- $blocks['_created_at'] = now()->format('c');
- $blocks['_version'] = '1.0.0';
- ksort($blocks);
- return response()->streamDownload(function() use($blocks) {
- echo json_encode($blocks, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
- });
- }
- public function addBlock(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $this->validate($request, [
- 'item' => 'required',
- 'type' => 'required|in:instance,user,moderate'
- ]);
- $item = $request->input('item');
- $type = $request->input('type');
- switch($type) {
- case 'instance':
- $instance = Instance::whereDomain($item)->first();
- abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
- $gb = new GroupBlock;
- $gb->group_id = $group->id;
- $gb->admin_id = $pid;
- $gb->instance_id = $instance->id;
- $gb->name = $instance->domain;
- $gb->is_user = false;
- $gb->moderated = false;
- $gb->save();
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:block:instance',
- [
- 'domain' => $instance->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- return [200];
- break;
- case 'user':
- $profile = Profile::whereUsername($item)->first();
- abort_if(!$profile, 422, 'This user either isn\'nt known or is invalid');
- $gb = new GroupBlock;
- $gb->group_id = $group->id;
- $gb->admin_id = $pid;
- $gb->profile_id = $profile->id;
- $gb->name = $profile->username;
- $gb->is_user = true;
- $gb->moderated = false;
- $gb->save();
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:block:user',
- [
- 'username' => $profile->username,
- 'domain' => $profile->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- return [200];
- break;
- case 'moderate':
- $instance = Instance::whereDomain($item)->first();
- abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
- $gb = new GroupBlock;
- $gb->group_id = $group->id;
- $gb->admin_id = $pid;
- $gb->instance_id = $instance->id;
- $gb->name = $instance->domain;
- $gb->is_user = false;
- $gb->moderated = true;
- $gb->save();
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:moderate:instance',
- [
- 'domain' => $instance->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- return [200];
- break;
- default:
- return response()->json([], 422, []);
- break;
- }
- }
- public function undoBlock(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $this->validate($request, [
- 'item' => 'required',
- 'type' => 'required|in:instance,user,moderate'
- ]);
- $item = $request->input('item');
- $type = $request->input('type');
- switch($type) {
- case 'instance':
- $instance = Instance::whereDomain($item)->first();
- abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
- $gb = GroupBlock::whereGroupId($group->id)
- ->whereInstanceId($instance->id)
- ->whereModerated(false)
- ->first();
- abort_if(!$gb, 422, 'Invalid group block');
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:unblock:instance',
- [
- 'domain' => $instance->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- $gb->delete();
- return [200];
- break;
- case 'user':
- $profile = Profile::whereUsername($item)->first();
- abort_if(!$profile, 422, 'This user either isn\'nt known or is invalid');
- $gb = GroupBlock::whereGroupId($group->id)
- ->whereProfileId($profile->id)
- ->whereIsUser(true)
- ->first();
- abort_if(!$gb, 422, 'Invalid group block');
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:unblock:user',
- [
- 'username' => $profile->username,
- 'domain' => $profile->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- $gb->delete();
- return [200];
- break;
- case 'moderate':
- $instance = Instance::whereDomain($item)->first();
- abort_if(!$instance, 422, 'This domain either isn\'nt known or is invalid');
- $gb = GroupBlock::whereGroupId($group->id)
- ->whereInstanceId($instance->id)
- ->whereModerated(true)
- ->first();
- abort_if(!$gb, 422, 'Invalid group block');
- GroupService::log(
- $group->id,
- $pid,
- 'group:admin:moderate:instance',
- [
- 'domain' => $instance->domain
- ],
- GroupBlock::class,
- $gb->id
- );
- $gb->delete();
- return [200];
- break;
- default:
- return response()->json([], 422, []);
- break;
- }
- }
- public function getReportList(Request $request, $id)
- {
- abort_if(!$request->user(), 404);
- $group = Group::findOrFail($id);
- $pid = $request->user()->profile_id;
- abort_if(!$group->isMember($pid), 404);
- abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
- $scope = $request->input('scope', 'open');
- $list = GroupReport::selectRaw('id, profile_id, item_type, item_id, type, created_at, count(*) as total')
- ->whereGroupId($group->id)
- ->groupBy('item_id')
- ->when($scope == 'open', function($query, $scope) {
- return $query->whereOpen(true);
- })
- ->latest()
- ->simplePaginate(10)
- ->map(function($report) use($group) {
- $res = [
- 'id' => (string) $report->id,
- 'profile' => GroupAccountService::get($group->id, $report->profile_id),
- 'type' => $report->type,
- 'created_at' => $report->created_at->format('c'),
- 'total_count' => $report->total
- ];
- if($report->item_type === GroupPost::class) {
- $res['status'] = GroupPostService::get($group->id, $report->item_id);
- }
- return $res;
- });
- return response()->json($list, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
- }
- }
|