GroupsMemberController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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\Models\Group;
  7. use App\Models\GroupCategory;
  8. use App\Models\GroupHashtag;
  9. use App\Models\GroupPostHashtag;
  10. use App\Models\GroupMember;
  11. use App\Services\AccountService;
  12. use App\Services\FollowerService;
  13. use App\Services\Groups\GroupAccountService;
  14. use App\Services\Groups\GroupHashtagService;
  15. use App\Jobs\GroupsPipeline\MemberJoinApprovedPipeline;
  16. use App\Jobs\GroupsPipeline\MemberJoinRejectedPipeline;
  17. class GroupsMemberController extends Controller
  18. {
  19. public function getGroupMembers(Request $request)
  20. {
  21. $this->validate($request, [
  22. 'gid' => 'required',
  23. 'limit' => 'nullable|integer|min:3|max:10'
  24. ]);
  25. abort_if(!$request->user(), 404);
  26. $pid = $request->user()->profile_id;
  27. $gid = $request->input('gid');
  28. $group = Group::findOrFail($gid);
  29. abort_if(!$group->isMember($pid), 403, 'Not a member of group.');
  30. $members = GroupMember::whereGroupId($gid)
  31. ->whereJoinRequest(false)
  32. ->simplePaginate(10)
  33. ->map(function($member) use($pid) {
  34. $account = AccountService::get($member['profile_id']);
  35. $account['role'] = $member['role'];
  36. $account['joined'] = $member['created_at'];
  37. $account['following'] = $pid != $member['profile_id'] ?
  38. FollowerService::follows($pid, $member['profile_id']) :
  39. null;
  40. $account['url'] = url("/groups/{$member->group_id}/user/{$member['profile_id']}");
  41. return $account;
  42. });
  43. return response()->json($members->toArray(), 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  44. }
  45. public function getGroupMemberJoinRequests(Request $request)
  46. {
  47. abort_if(!$request->user(), 404);
  48. $id = $request->input('gid');
  49. $group = Group::findOrFail($id);
  50. $pid = $request->user()->profile_id;
  51. abort_if(!$group->isMember($pid), 404);
  52. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  53. return GroupMember::whereGroupId($group->id)
  54. ->whereJoinRequest(true)
  55. ->whereNull('rejected_at')
  56. ->paginate(10)
  57. ->map(function($member) {
  58. return AccountService::get($member->profile_id);
  59. });
  60. }
  61. public function handleGroupMemberJoinRequest(Request $request)
  62. {
  63. abort_if(!$request->user(), 404);
  64. $id = $request->input('gid');
  65. $group = Group::findOrFail($id);
  66. $pid = $request->user()->profile_id;
  67. abort_if(!$group->isMember($pid), 404);
  68. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  69. $mid = $request->input('pid');
  70. abort_if($group->isMember($mid), 404);
  71. $this->validate($request, [
  72. 'gid' => 'required',
  73. 'pid' => 'required',
  74. 'action' => 'required|in:approve,reject'
  75. ]);
  76. $action = $request->input('action');
  77. $member = GroupMember::whereGroupId($group->id)
  78. ->whereProfileId($mid)
  79. ->firstOrFail();
  80. if($action == 'approve') {
  81. MemberJoinApprovedPipeline::dispatch($member)->onQueue('groups');
  82. } else if ($action == 'reject') {
  83. MemberJoinRejectedPipeline::dispatch($member)->onQueue('groups');
  84. }
  85. return $request->all();
  86. }
  87. public function getGroupMember(Request $request)
  88. {
  89. $this->validate($request, [
  90. 'gid' => 'required',
  91. 'pid' => 'required'
  92. ]);
  93. abort_if(!$request->user(), 404);
  94. $gid = $request->input('gid');
  95. $group = Group::findOrFail($gid);
  96. $pid = $request->user()->profile_id;
  97. abort_if(!$group->isMember($pid), 404);
  98. abort_if(!in_array($group->selfRole($pid), ['founder', 'admin']), 404);
  99. $member_id = $request->input('pid');
  100. $member = GroupMember::whereGroupId($gid)
  101. ->whereProfileId($member_id)
  102. ->firstOrFail();
  103. $account = GroupAccountService::get($group->id, $member['profile_id']);
  104. $account['role'] = $member['role'];
  105. $account['joined'] = $member['created_at'];
  106. $account['following'] = $pid != $member['profile_id'] ?
  107. FollowerService::follows($pid, $member['profile_id']) :
  108. null;
  109. $account['url'] = url("/groups/{$gid}/user/{$member_id}");
  110. return response()->json($account, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  111. }
  112. public function getGroupMemberCommonIntersections(Request $request)
  113. {
  114. abort_if(!$request->user(), 404);
  115. $cid = $request->user()->profile_id;
  116. // $this->validate($request, [
  117. // 'gid' => 'required',
  118. // 'pid' => 'required'
  119. // ]);
  120. $gid = $request->input('gid');
  121. $pid = $request->input('pid');
  122. if($pid === $cid) {
  123. return [];
  124. }
  125. $group = Group::findOrFail($gid);
  126. abort_if(!$group->isMember($cid), 404);
  127. abort_if(!$group->isMember($pid), 404);
  128. $self = GroupPostHashtag::selectRaw('group_post_hashtags.*, count(*) as countr')
  129. ->whereProfileId($cid)
  130. ->groupBy('hashtag_id')
  131. ->orderByDesc('countr')
  132. ->take(20)
  133. ->pluck('hashtag_id');
  134. $user = GroupPostHashtag::selectRaw('group_post_hashtags.*, count(*) as countr')
  135. ->whereProfileId($pid)
  136. ->groupBy('hashtag_id')
  137. ->orderByDesc('countr')
  138. ->take(20)
  139. ->pluck('hashtag_id');
  140. $topics = $self->intersect($user)
  141. ->values()
  142. ->shuffle()
  143. ->take(3)
  144. ->map(function($id) use($group) {
  145. $tag = GroupHashtagService::get($id);
  146. $tag['url'] = url("/groups/{$group->id}/topics/{$tag['slug']}?src=upt");
  147. return $tag;
  148. });
  149. // $friends = DB::table('followers as u')
  150. // ->join('followers as s', 'u.following_id', '=', 's.following_id')
  151. // ->where('s.profile_id', $cid)
  152. // ->where('u.profile_id', $pid)
  153. // ->inRandomOrder()
  154. // ->take(10)
  155. // ->pluck('s.following_id')
  156. // ->map(function($id) use($gid) {
  157. // $res = AccountService::get($id);
  158. // $res['url'] = url("/groups/{$gid}/user/{$id}");
  159. // return $res;
  160. // });
  161. $mutualGroups = GroupService::mutualGroups($cid, $pid, [$gid]);
  162. $mutualFriends = collect(FollowerService::mutualIds($cid, $pid))
  163. ->map(function($id) use($gid) {
  164. $res = AccountService::get($id);
  165. if(GroupService::isMember($gid, $id)) {
  166. $res['url'] = url("/groups/{$gid}/user/{$id}");
  167. } else if(!$res['local']) {
  168. $res['url'] = url("/i/web/profile/_/{$id}");
  169. }
  170. return $res;
  171. });
  172. $mutualFriendsCount = FollowerService::mutualCount($cid, $pid);
  173. $res = [
  174. 'groups_count' => $mutualGroups['count'],
  175. 'groups' => $mutualGroups['groups'],
  176. 'topics' => $topics,
  177. 'friends_count' => $mutualFriendsCount,
  178. 'friends' => $mutualFriends,
  179. ];
  180. return response()->json($res, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  181. }
  182. }