ShareApi.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Http\Api;
  3. use App\Models\Article;
  4. use App\Models\Channel;
  5. use App\Models\Collection;
  6. use App\Models\GroupMember;
  7. use App\Models\Project;
  8. use App\Models\Share;
  9. class ShareApi
  10. {
  11. /**
  12. * 获取某用户的可见的协作资源
  13. * $res_type 见readme.md#资源类型 -1全部类型资源
  14. * ## 资源类型
  15. * 1 PCS 文档
  16. * 2 Channel 版本
  17. * 3 Article 文章
  18. * 4 Collection 文集
  19. * 5 版本片段
  20. * power 权限 10: 只读 20:编辑 30: 拥有者
  21. */
  22. public static function getResList($user_uid, $res_type = -1)
  23. {
  24. // 找我加入的群
  25. $my_group = GroupMember::where('user_id', $user_uid)->select('group_id')->get();
  26. $userList[] = $user_uid;
  27. foreach ($my_group as $key => $value) {
  28. // code...
  29. $userList[] = $value['group_id'];
  30. }
  31. if ($res_type == -1) {
  32. // 所有类型资源
  33. $Fetch = Share::whereIn('cooperator_id', $userList)->select(['res_id', 'res_type', 'power'])->get();
  34. } else {
  35. // 指定类型资源
  36. $Fetch = Share::whereIn('cooperator_id', $userList)
  37. ->where('res_type', $res_type)
  38. ->select(['res_id', 'res_type', 'power'])->get();
  39. }
  40. $resOutput = [];
  41. foreach ($Fetch as $key => $value) {
  42. // 查重
  43. if (isset($resOutput[$value['res_id']])) {
  44. if ($value['power'] > $resOutput[$value['res_id']]['power']) {
  45. $resOutput[$value['res_id']]['power'] = $value['power'];
  46. }
  47. } else {
  48. $resOutput[$value['res_id']] = ['power' => $value['power'], 'type' => $value['res_type']];
  49. }
  50. }
  51. $resList = [];
  52. foreach ($resOutput as $key => $value) {
  53. // code...
  54. $resList[] = ['res_id' => $key, 'res_type' => (int) $value['type'], 'power' => (int) $value['power']];
  55. }
  56. foreach ($resList as $key => $res) {
  57. // 获取资源标题 和所有者
  58. $resList[$key]['res_title'] = '_unknown_';
  59. $resList[$key]['res_owner_id'] = '_unknown_';
  60. $resList[$key]['type'] = '_unknown_';
  61. $resList[$key]['status'] = '0';
  62. $resList[$key]['lang'] = '_unknown_';
  63. switch ($res['res_type']) {
  64. case 1:
  65. // pcs 文档
  66. $resList[$key]['res_title'] = 'title';
  67. break;
  68. case 2:
  69. // channel
  70. $channelInfo = Channel::where('uid', $res['res_id'])->first();
  71. if ($channelInfo) {
  72. $resList[$key]['res_title'] = $channelInfo['name'];
  73. $resList[$key]['res_owner_id'] = $channelInfo['owner_uid'];
  74. $resList[$key]['type'] = $channelInfo['type'];
  75. $resList[$key]['status'] = $channelInfo['status'];
  76. $resList[$key]['lang'] = $channelInfo['lang'];
  77. }
  78. break;
  79. case 3:
  80. // 3 Article 文章
  81. $aInfo = Article::where('uid', $res['res_id'])->first();
  82. if ($aInfo) {
  83. $resList[$key]['res_title'] = $aInfo['title'];
  84. $resList[$key]['res_owner_id'] = $aInfo['owner'];
  85. $resList[$key]['status'] = $aInfo['status'];
  86. $resList[$key]['lang'] = '';
  87. }
  88. break;
  89. case 4:
  90. // 4 Collection 文集
  91. $aInfo = Collection::where('uid', $res['res_id'])->first();
  92. if ($aInfo) {
  93. $resList[$key]['res_title'] = $aInfo['title'];
  94. $resList[$key]['res_owner_id'] = $aInfo['owner'];
  95. $resList[$key]['status'] = $aInfo['status'];
  96. $resList[$key]['lang'] = $aInfo['lang'];
  97. }
  98. break;
  99. case 5:
  100. // code...
  101. break;
  102. case 6:
  103. $aInfo = Project::where('uid', $res['res_id'])->first();
  104. if ($aInfo) {
  105. $resList[$key]['res_title'] = $aInfo['title'];
  106. $resList[$key]['res_owner_id'] = $aInfo['owner_id'];
  107. $resList[$key]['status'] = $aInfo['status'];
  108. $resList[$key]['lang'] = '';
  109. }
  110. break;
  111. default:
  112. // code...
  113. break;
  114. }
  115. }
  116. return $resList;
  117. }
  118. /**
  119. * 获取对某个共享资源的权限
  120. */
  121. public static function getResPower($user_uid, $res_id, $res_type = 0)
  122. {
  123. if (empty($user_uid)) {
  124. // 未登录用户 没有共享资源
  125. return 0;
  126. }
  127. // 查看是否为资源拥有者
  128. if ($res_type != 0) {
  129. switch ($res_type) {
  130. case 2:
  131. // channel
  132. $channel = ChannelApi::getById($res_id);
  133. if ($channel) {
  134. if ($channel['studio_id'] === $user_uid) {
  135. return 30;
  136. }
  137. }
  138. break;
  139. case 3:
  140. // Article
  141. $owner = Article::where('uid', $res_id)->value('owner');
  142. if ($owner === $user_uid) {
  143. return 30;
  144. }
  145. break;
  146. case 4:
  147. $owner = Collection::where('uid', $res_id)->value('owner');
  148. if ($owner === $user_uid) {
  149. return 30;
  150. }
  151. // 文集
  152. break;
  153. case 6: // workflow
  154. $owner = Project::where('uid', $res_id)->value('owner_id');
  155. if ($owner === $user_uid) {
  156. return 30;
  157. }
  158. break;
  159. }
  160. }
  161. // 找我加入的群
  162. $my_group = GroupMember::where('user_id', $user_uid)->select('group_id')->get();
  163. $userList[] = $user_uid;
  164. foreach ($my_group as $key => $value) {
  165. $userList[] = $value['group_id'];
  166. }
  167. $Fetch = Share::whereIn('cooperator_id', $userList)
  168. ->where('res_id', $res_id)
  169. ->select(['power'])->get();
  170. $power = 0;
  171. foreach ($Fetch as $key => $value) {
  172. // code...
  173. if ((int) $value['power'] > $power) {
  174. $power = $value['power'];
  175. }
  176. }
  177. return $power;
  178. }
  179. }