AdminController.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\{
  4. Contact,
  5. Hashtag,
  6. Newsroom,
  7. OauthClient,
  8. Profile,
  9. Report,
  10. Status,
  11. User
  12. };
  13. use DB, Cache;
  14. use Carbon\Carbon;
  15. use Illuminate\Http\Request;
  16. use App\Http\Controllers\Admin\{
  17. AdminDiscoverController,
  18. AdminInstanceController,
  19. AdminReportController,
  20. AdminMediaController,
  21. AdminSettingsController,
  22. AdminSupportController
  23. };
  24. use Illuminate\Validation\Rule;
  25. use App\Services\AdminStatsService;
  26. class AdminController extends Controller
  27. {
  28. use AdminReportController,
  29. AdminDiscoverController,
  30. AdminMediaController,
  31. AdminSettingsController,
  32. AdminInstanceController;
  33. public function __construct()
  34. {
  35. $this->middleware('admin');
  36. $this->middleware('twofactor');
  37. }
  38. public function home()
  39. {
  40. $data = AdminStatsService::get();
  41. return view('admin.home', compact('data'));
  42. }
  43. public function users(Request $request)
  44. {
  45. $col = $request->query('col') ?? 'id';
  46. $dir = $request->query('dir') ?? 'desc';
  47. $users = User::select('id', 'username', 'status')
  48. ->withCount('statuses')
  49. ->orderBy($col, $dir)
  50. ->simplePaginate(10);
  51. return view('admin.users.home', compact('users'));
  52. }
  53. public function editUser(Request $request, $id)
  54. {
  55. $user = User::findOrFail($id);
  56. $profile = $user->profile;
  57. return view('admin.users.edit', compact('user', 'profile'));
  58. }
  59. public function statuses(Request $request)
  60. {
  61. $statuses = Status::orderBy('id', 'desc')->simplePaginate(10);
  62. return view('admin.statuses.home', compact('statuses'));
  63. }
  64. public function showStatus(Request $request, $id)
  65. {
  66. $status = Status::findOrFail($id);
  67. return view('admin.statuses.show', compact('status'));
  68. }
  69. public function reports(Request $request)
  70. {
  71. $this->validate($request, [
  72. 'filter' => 'nullable|string|in:all,open,closed'
  73. ]);
  74. $filter = $request->input('filter');
  75. $reports = Report::orderBy('created_at','desc')
  76. ->when($filter, function($q, $filter) {
  77. return $filter == 'open' ?
  78. $q->whereNull('admin_seen') :
  79. $q->whereNotNull('admin_seen');
  80. })
  81. ->paginate(4);
  82. return view('admin.reports.home', compact('reports'));
  83. }
  84. public function showReport(Request $request, $id)
  85. {
  86. $report = Report::findOrFail($id);
  87. return view('admin.reports.show', compact('report'));
  88. }
  89. public function profiles(Request $request)
  90. {
  91. $this->validate($request, [
  92. 'search' => 'nullable|string|max:250',
  93. 'filter' => [
  94. 'nullable',
  95. 'string',
  96. Rule::in(['all', 'local', 'remote'])
  97. ],
  98. 'limit' => 'nullable|integer|min:1|max:50'
  99. ]);
  100. $search = $request->input('search');
  101. $filter = $request->input('filter');
  102. $limit = 12;
  103. if($search) {
  104. $profiles = Profile::select('id','username')
  105. ->where('username', 'like', "%$search%")
  106. ->orderBy('id','desc')
  107. ->simplePaginate($limit);
  108. } else if($filter) {
  109. $profiles = Profile::select('id','username')->withCount(['likes','statuses','followers'])->orderBy($filter, $order)->simplePaginate($limit);
  110. } else {
  111. $profiles = Profile::select('id','username')->orderBy('id','desc')->simplePaginate($limit);
  112. }
  113. return view('admin.profiles.home', compact('profiles'));
  114. }
  115. public function profileShow(Request $request, $id)
  116. {
  117. $profile = Profile::findOrFail($id);
  118. $user = $profile->user;
  119. return view('admin.profiles.edit', compact('profile', 'user'));
  120. }
  121. public function appsHome(Request $request)
  122. {
  123. $filter = $request->input('filter');
  124. if(in_array($filter, ['revoked'])) {
  125. $apps = OauthClient::with('user')
  126. ->whereNotNull('user_id')
  127. ->whereRevoked(true)
  128. ->orderByDesc('id')
  129. ->paginate(10);
  130. } else {
  131. $apps = OauthClient::with('user')
  132. ->whereNotNull('user_id')
  133. ->orderByDesc('id')
  134. ->paginate(10);
  135. }
  136. return view('admin.apps.home', compact('apps'));
  137. }
  138. public function hashtagsHome(Request $request)
  139. {
  140. $hashtags = Hashtag::orderByDesc('id')->paginate(10);
  141. return view('admin.hashtags.home', compact('hashtags'));
  142. }
  143. public function messagesHome(Request $request)
  144. {
  145. $messages = Contact::orderByDesc('id')->paginate(10);
  146. return view('admin.messages.home', compact('messages'));
  147. }
  148. public function messagesShow(Request $request, $id)
  149. {
  150. $message = Contact::findOrFail($id);
  151. return view('admin.messages.show', compact('message'));
  152. }
  153. public function messagesMarkRead(Request $request)
  154. {
  155. $this->validate($request, [
  156. 'id' => 'required|integer|min:1'
  157. ]);
  158. $id = $request->input('id');
  159. $message = Contact::findOrFail($id);
  160. if($message->read_at) {
  161. return;
  162. }
  163. $message->read_at = now();
  164. $message->save();
  165. return;
  166. }
  167. public function newsroomHome(Request $request)
  168. {
  169. $newsroom = Newsroom::latest()->paginate(10);
  170. return view('admin.newsroom.home', compact('newsroom'));
  171. }
  172. public function newsroomCreate(Request $request)
  173. {
  174. return view('admin.newsroom.create');
  175. }
  176. public function newsroomEdit(Request $request, $id)
  177. {
  178. $news = Newsroom::findOrFail($id);
  179. return view('admin.newsroom.edit', compact('news'));
  180. }
  181. public function newsroomDelete(Request $request, $id)
  182. {
  183. $news = Newsroom::findOrFail($id);
  184. $news->delete();
  185. return redirect('/i/admin/newsroom');
  186. }
  187. public function newsroomUpdate(Request $request, $id)
  188. {
  189. $this->validate($request, [
  190. 'title' => 'required|string|min:1|max:100',
  191. 'summary' => 'nullable|string|max:200',
  192. 'body' => 'nullable|string'
  193. ]);
  194. $changed = false;
  195. $changedFields = [];
  196. $news = Newsroom::findOrFail($id);
  197. $fields = [
  198. 'title' => 'string',
  199. 'summary' => 'string',
  200. 'body' => 'string',
  201. 'category' => 'string',
  202. 'show_timeline' => 'boolean',
  203. 'auth_only' => 'boolean',
  204. 'show_link' => 'boolean',
  205. 'force_modal' => 'boolean',
  206. 'published' => 'published'
  207. ];
  208. foreach($fields as $field => $type) {
  209. switch ($type) {
  210. case 'string':
  211. if($request->{$field} != $news->{$field}) {
  212. if($field == 'title') {
  213. $news->slug = str_slug($request->{$field});
  214. }
  215. $news->{$field} = $request->{$field};
  216. $changed = true;
  217. array_push($changedFields, $field);
  218. }
  219. break;
  220. case 'boolean':
  221. $state = $request->{$field} == 'on' ? true : false;
  222. if($state != $news->{$field}) {
  223. $news->{$field} = $state;
  224. $changed = true;
  225. array_push($changedFields, $field);
  226. }
  227. break;
  228. case 'published':
  229. $state = $request->{$field} == 'on' ? true : false;
  230. $published = $news->published_at != null;
  231. if($state != $published) {
  232. $news->published_at = $state ? now() : null;
  233. $changed = true;
  234. array_push($changedFields, $field);
  235. }
  236. break;
  237. }
  238. }
  239. if($changed) {
  240. $news->save();
  241. }
  242. $redirect = $news->published_at ? $news->permalink() : $news->editUrl();
  243. return redirect($redirect);
  244. }
  245. public function newsroomStore(Request $request)
  246. {
  247. $this->validate($request, [
  248. 'title' => 'required|string|min:1|max:100',
  249. 'summary' => 'nullable|string|max:200',
  250. 'body' => 'nullable|string'
  251. ]);
  252. $changed = false;
  253. $changedFields = [];
  254. $news = new Newsroom();
  255. $fields = [
  256. 'title' => 'string',
  257. 'summary' => 'string',
  258. 'body' => 'string',
  259. 'category' => 'string',
  260. 'show_timeline' => 'boolean',
  261. 'auth_only' => 'boolean',
  262. 'show_link' => 'boolean',
  263. 'force_modal' => 'boolean',
  264. 'published' => 'published'
  265. ];
  266. foreach($fields as $field => $type) {
  267. switch ($type) {
  268. case 'string':
  269. if($request->{$field} != $news->{$field}) {
  270. if($field == 'title') {
  271. $news->slug = str_slug($request->{$field});
  272. }
  273. $news->{$field} = $request->{$field};
  274. $changed = true;
  275. array_push($changedFields, $field);
  276. }
  277. break;
  278. case 'boolean':
  279. $state = $request->{$field} == 'on' ? true : false;
  280. if($state != $news->{$field}) {
  281. $news->{$field} = $state;
  282. $changed = true;
  283. array_push($changedFields, $field);
  284. }
  285. break;
  286. case 'published':
  287. $state = $request->{$field} == 'on' ? true : false;
  288. $published = $news->published_at != null;
  289. if($state != $published) {
  290. $news->published_at = $state ? now() : null;
  291. $changed = true;
  292. array_push($changedFields, $field);
  293. }
  294. break;
  295. }
  296. }
  297. if($changed) {
  298. $news->save();
  299. }
  300. $redirect = $news->published_at ? $news->permalink() : $news->editUrl();
  301. return redirect($redirect);
  302. }
  303. }