GroupsTopicController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace App\Http\Controllers\Groups;
  3. use Illuminate\Support\Facades\Cache;
  4. use Illuminate\Support\Facades\RateLimiter;
  5. use App\Http\Controllers\Controller;
  6. use Illuminate\Http\Request;
  7. use App\Services\AccountService;
  8. use App\Services\GroupService;
  9. use App\Services\Groups\GroupPostService;
  10. use App\Services\Groups\GroupsLikeService;
  11. use App\Follower;
  12. use App\Profile;
  13. use App\Models\Group;
  14. use App\Models\GroupHashtag;
  15. use App\Models\GroupInvitation;
  16. use App\Models\GroupMember;
  17. use App\Models\GroupPostHashtag;
  18. use App\Models\GroupPost;
  19. class GroupsTopicController extends Controller
  20. {
  21. public function __construct()
  22. {
  23. $this->middleware('auth');
  24. }
  25. public function groupTopics(Request $request)
  26. {
  27. $this->validate($request, [
  28. 'gid' => 'required',
  29. ]);
  30. abort_if(!$request->user(), 404);
  31. $pid = $request->user()->profile_id;
  32. $gid = $request->input('gid');
  33. $group = Group::findOrFail($gid);
  34. abort_if(!$group->isMember($pid), 403, 'Not a member of group.');
  35. $posts = GroupPostHashtag::join('group_hashtags', 'group_hashtags.id', '=', 'group_post_hashtags.hashtag_id')
  36. ->selectRaw('group_hashtags.*, group_post_hashtags.*, count(group_post_hashtags.hashtag_id) as ht_count')
  37. ->where('group_post_hashtags.group_id', $gid)
  38. ->orderByDesc('ht_count')
  39. ->limit(10)
  40. ->pluck('group_post_hashtags.hashtag_id', 'ht_count')
  41. ->map(function($id, $key) use ($gid) {
  42. $tag = GroupHashtag::find($id);
  43. return [
  44. 'hid' => $id,
  45. 'name' => $tag->name,
  46. 'url' => url("/groups/{$gid}/topics/{$tag->slug}"),
  47. 'count' => $key
  48. ];
  49. })->values();
  50. return response()->json($posts, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  51. }
  52. public function groupTopicTag(Request $request)
  53. {
  54. $this->validate($request, [
  55. 'gid' => 'required',
  56. 'name' => 'required'
  57. ]);
  58. abort_if(!$request->user(), 404);
  59. $pid = $request->user()->profile_id;
  60. $gid = $request->input('gid');
  61. $limit = $request->input('limit', 3);
  62. $group = Group::findOrFail($gid);
  63. abort_if(!$group->isMember($pid), 403, 'Not a member of group.');
  64. $name = $request->input('name');
  65. $hashtag = GroupHashtag::whereName($name)->first();
  66. if(!$hashtag) {
  67. return [];
  68. }
  69. // $posts = GroupPost::whereGroupId($gid)
  70. // ->select('status_hashtags.*', 'group_posts.*')
  71. // ->where('status_hashtags.hashtag_id', $hashtag->id)
  72. // ->join('status_hashtags', 'group_posts.status_id', '=', 'status_hashtags.status_id')
  73. // ->orderByDesc('group_posts.status_id')
  74. // ->simplePaginate($limit)
  75. // ->map(function($gp) use($pid) {
  76. // $status = StatusService::get($gp['status_id'], false);
  77. // if(!$status) {
  78. // return false;
  79. // }
  80. // $status['favourited'] = (bool) LikeService::liked($pid, $gp['status_id']);
  81. // $status['favourites_count'] = LikeService::count($gp['status_id']);
  82. // $status['pf_type'] = $gp['type'];
  83. // $status['visibility'] = 'public';
  84. // $status['url'] = $gp->url();
  85. // return $status;
  86. // });
  87. $posts = GroupPostHashtag::whereGroupId($gid)
  88. ->whereHashtagId($hashtag->id)
  89. ->orderByDesc('id')
  90. ->simplePaginate($limit)
  91. ->map(function($gp) use($pid) {
  92. $status = GroupPostService::get($gp['group_id'], $gp['status_id']);
  93. if(!$status) {
  94. return false;
  95. }
  96. $status['favourited'] = (bool) GroupsLikeService::liked($pid, $gp['status_id']);
  97. $status['favourites_count'] = GroupsLikeService::count($gp['status_id']);
  98. $status['pf_type'] = $status['pf_type'];
  99. $status['visibility'] = 'public';
  100. return $status;
  101. });
  102. return response()->json($posts, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  103. }
  104. public function showTopicFeed(Request $request, $gid, $tag)
  105. {
  106. abort_if(!$request->user(), 404);
  107. $pid = $request->user()->profile_id;
  108. $group = Group::findOrFail($gid);
  109. $gid = $group->id;
  110. abort_if(!$group->isMember($pid), 403, 'Not a member of group.');
  111. return view('groups.topic-feed', compact('gid', 'tag'));
  112. }
  113. }