1
0

AdminUserController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Jobs\DeletePipeline\DeleteAccountPipeline;
  4. use App\Mail\AdminMessage;
  5. use App\ModLog;
  6. use App\Profile;
  7. use App\Services\AccountService;
  8. use App\Services\ModLogService;
  9. use App\User;
  10. use Cache;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\Mail;
  13. trait AdminUserController
  14. {
  15. public function users(Request $request)
  16. {
  17. $search = $request->has('a') && $request->query('a') == 'search' ? $request->query('q') : null;
  18. $col = $request->query('col', 'id');
  19. $dir = $request->query('dir', 'desc');
  20. $offset = $request->has('page') ? (int) $request->input('page') : 0;
  21. $limit = (int) $request->query('limit', 10);
  22. $trashed = $request->has('trashed');
  23. $queryParams = [];
  24. if ($search) {
  25. $queryParams['a'] = 'search';
  26. $queryParams['q'] = $search;
  27. }
  28. if ($request->has('col')) {
  29. $queryParams['col'] = $col;
  30. }
  31. if ($request->has('dir')) {
  32. $queryParams['dir'] = $dir;
  33. }
  34. if ($request->has('limit')) {
  35. $queryParams['limit'] = $limit;
  36. }
  37. if ($trashed) {
  38. $queryParams['trashed'] = '1';
  39. }
  40. $queryString = ! empty($queryParams) ? '&'.http_build_query($queryParams) : '';
  41. $pagination = [
  42. 'prev' => $offset > 0 ? $offset - 1 : null,
  43. 'next' => $offset + 1,
  44. 'query' => $queryString,
  45. ];
  46. $users = User::select('id', 'username', 'status', 'profile_id', 'is_admin')
  47. ->orderBy($col, $dir)
  48. ->when($search, function ($q, $search) {
  49. return $q->where('username', 'like', "%{$search}%");
  50. })
  51. ->when($offset > 0, function ($q) use ($offset, $limit) {
  52. return $q->offset($offset * $limit);
  53. })
  54. ->when($trashed, function ($q) {
  55. return $q->where('status', 'deleted')->orWhereNotNull('delete_after');
  56. }, function ($q) {
  57. return $q->whereNull('status')->whereNull('delete_after');
  58. })
  59. ->limit($limit)
  60. ->get()
  61. ->map(function ($u) {
  62. $u['account'] = AccountService::get($u->profile_id, true);
  63. return $u;
  64. });
  65. return view('admin.users.home', compact('users', 'pagination', 'search', 'col', 'dir', 'limit', 'trashed'));
  66. }
  67. public function userShow(Request $request, $id)
  68. {
  69. $user = User::findOrFail($id);
  70. $profile = $user->profile;
  71. return view('admin.users.show', compact('user', 'profile'));
  72. }
  73. public function userEdit(Request $request, $id)
  74. {
  75. $user = User::findOrFail($id);
  76. $profile = $user->profile;
  77. return view('admin.users.edit', compact('user', 'profile'));
  78. }
  79. public function userEditSubmit(Request $request, $id)
  80. {
  81. $user = User::findOrFail($id);
  82. $profile = $user->profile;
  83. $changed = false;
  84. $fields = [];
  85. if ($request->filled('name') && $request->input('name') != $user->name) {
  86. $fields['name'] = ['old' => $user->name, 'new' => $request->input('name')];
  87. $user->name = $profile->name = $request->input('name');
  88. $changed = true;
  89. }
  90. if ($request->filled('username') && $request->input('username') != $user->username) {
  91. $fields['username'] = ['old' => $user->username, 'new' => $request->input('username')];
  92. $user->username = $profile->username = $request->input('username');
  93. $changed = true;
  94. }
  95. if ($request->filled('email') && $request->input('email') != $user->email) {
  96. if (filter_var($request->input('email'), FILTER_VALIDATE_EMAIL) == false) {
  97. abort(500, 'Invalid email address');
  98. }
  99. $fields['email'] = ['old' => $user->email, 'new' => $request->input('email')];
  100. $user->email = $request->input('email');
  101. $changed = true;
  102. }
  103. if ($request->input('bio') != $profile->bio) {
  104. $fields['bio'] = ['old' => $user->bio, 'new' => $request->input('bio')];
  105. $profile->bio = $request->input('bio');
  106. $changed = true;
  107. }
  108. if ($request->input('website') != $profile->website) {
  109. $fields['website'] = ['old' => $user->website, 'new' => $request->input('website')];
  110. $profile->website = $request->input('website');
  111. $changed = true;
  112. }
  113. if ($changed == true) {
  114. ModLogService::boot()
  115. ->objectUid($user->id)
  116. ->objectId($user->id)
  117. ->objectType('App\User::class')
  118. ->user($request->user())
  119. ->action('admin.user.edit')
  120. ->metadata([
  121. 'fields' => $fields,
  122. ])
  123. ->accessLevel('admin')
  124. ->save();
  125. $profile->save();
  126. $user->save();
  127. }
  128. return redirect('/i/admin/users/show/'.$user->id);
  129. }
  130. public function userActivity(Request $request, $id)
  131. {
  132. $user = User::findOrFail($id);
  133. $profile = $user->profile;
  134. $logs = $user->accountLog()->orderByDesc('created_at')->paginate(10);
  135. return view('admin.users.activity', compact('user', 'profile', 'logs'));
  136. }
  137. public function userMessage(Request $request, $id)
  138. {
  139. $user = User::findOrFail($id);
  140. $profile = $user->profile;
  141. return view('admin.users.message', compact('user', 'profile'));
  142. }
  143. public function userMessageSend(Request $request, $id)
  144. {
  145. $this->validate($request, [
  146. 'message' => 'required|string|min:5|max:500',
  147. ]);
  148. $user = User::findOrFail($id);
  149. $profile = $user->profile;
  150. $message = $request->input('message');
  151. Mail::to($user->email)->send(new AdminMessage($message));
  152. ModLogService::boot()
  153. ->objectUid($user->id)
  154. ->objectId($user->id)
  155. ->objectType('App\User::class')
  156. ->user($request->user())
  157. ->action('admin.user.mail')
  158. ->metadata([
  159. 'message' => $message,
  160. ])
  161. ->accessLevel('admin')
  162. ->save();
  163. return redirect('/i/admin/users/show/'.$user->id);
  164. }
  165. public function userModTools(Request $request, $id)
  166. {
  167. $user = User::findOrFail($id);
  168. $profile = $user->profile;
  169. return view('admin.users.modtools', compact('user', 'profile'));
  170. }
  171. public function userModLogs(Request $request, $id)
  172. {
  173. $user = User::findOrFail($id);
  174. $profile = $user->profile;
  175. $logs = ModLog::whereObjectUid($user->id)
  176. ->orderByDesc('created_at')
  177. ->simplePaginate(10);
  178. return view('admin.users.modlogs', compact('user', 'profile', 'logs'));
  179. }
  180. public function userModLogsMessage(Request $request, $id)
  181. {
  182. $this->validate($request, [
  183. 'message' => 'required|string|min:5|max:500',
  184. ]);
  185. $user = User::findOrFail($id);
  186. $profile = $user->profile;
  187. $msg = $request->input('message');
  188. ModLogService::boot()
  189. ->objectUid($user->id)
  190. ->objectId($user->id)
  191. ->objectType('App\User::class')
  192. ->user($request->user())
  193. ->message($msg)
  194. ->accessLevel('admin')
  195. ->save();
  196. return redirect('/i/admin/users/modlogs/'.$user->id);
  197. }
  198. public function userDelete(Request $request, $id)
  199. {
  200. $user = User::findOrFail($id);
  201. $profile = $user->profile;
  202. return view('admin.users.delete', compact('user', 'profile'));
  203. }
  204. public function userDeleteProcess(Request $request, $id)
  205. {
  206. $user = User::findOrFail($id);
  207. $profile = $user->profile;
  208. if (config('pixelfed.account_deletion') == false) {
  209. abort(404);
  210. }
  211. if ($user->is_admin == true) {
  212. $mid = $request->user()->id;
  213. abort_if($user->id < $mid, 403);
  214. }
  215. $ts = now()->addMonth();
  216. $user->status = 'delete';
  217. $profile->status = 'delete';
  218. $user->delete_after = $ts;
  219. $profile->delete_after = $ts;
  220. $user->save();
  221. $profile->save();
  222. ModLogService::boot()
  223. ->objectUid($user->id)
  224. ->objectId($user->id)
  225. ->objectType('App\User::class')
  226. ->user($request->user())
  227. ->action('admin.user.delete')
  228. ->accessLevel('admin')
  229. ->save();
  230. Cache::forget('profiles:private');
  231. DeleteAccountPipeline::dispatch($user);
  232. $msg = "Successfully deleted {$user->username}!";
  233. $request->session()->flash('status', $msg);
  234. return redirect('/i/admin/users/list');
  235. }
  236. public function userModerate(Request $request)
  237. {
  238. $this->validate($request, [
  239. 'profile_id' => 'required|exists:profiles,id',
  240. 'action' => 'required|in:cw,no_autolink,unlisted',
  241. ]);
  242. $pid = $request->input('profile_id');
  243. $action = $request->input('action');
  244. $profile = Profile::findOrFail($pid);
  245. if ($profile->user->is_admin == true) {
  246. $mid = $request->user()->id;
  247. abort_if($profile->user_id < $mid, 403);
  248. }
  249. switch ($action) {
  250. case 'cw':
  251. $profile->cw = ! $profile->cw;
  252. $msg = 'Success!';
  253. break;
  254. case 'no_autolink':
  255. $profile->no_autolink = ! $profile->no_autolink;
  256. $msg = 'Success!';
  257. break;
  258. case 'unlisted':
  259. $profile->unlisted = ! $profile->unlisted;
  260. $msg = 'Success!';
  261. break;
  262. }
  263. $profile->save();
  264. ModLogService::boot()
  265. ->objectUid($profile->user_id)
  266. ->objectId($profile->user_id)
  267. ->objectType('App\User::class')
  268. ->user($request->user())
  269. ->action('admin.user.moderate')
  270. ->metadata([
  271. 'action' => $action,
  272. 'message' => $msg,
  273. ])
  274. ->accessLevel('admin')
  275. ->save();
  276. $request->session()->flash('status', $msg);
  277. return redirect('/i/admin/users/modtools/'.$profile->user_id);
  278. }
  279. public function userModLogDelete(Request $request, $id)
  280. {
  281. $this->validate($request, [
  282. 'mid' => 'required|integer|exists:mod_logs,id',
  283. ]);
  284. $user = User::findOrFail($id);
  285. $uid = $request->user()->id;
  286. $mid = $request->input('mid');
  287. $ml = ModLog::whereUserId($uid)->findOrFail($mid)->delete();
  288. $msg = 'Successfully deleted modlog comment!';
  289. $request->session()->flash('status', $msg);
  290. return redirect('/i/admin/users/modlogs/'.$user->id);
  291. }
  292. }