CourseMemberController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\CourseMember;
  4. use App\Models\Course;
  5. use Illuminate\Http\Request;
  6. use App\Http\Resources\CourseMemberResource;
  7. use App\Http\Api\AuthApi;
  8. use Illuminate\Support\Facades\Log;
  9. class CourseMemberController extends Controller
  10. {
  11. /**
  12. * Display a listing of the resource.
  13. *
  14. * @return \Illuminate\Http\Response
  15. */
  16. public function index(Request $request)
  17. {
  18. //
  19. $user = AuthApi::current($request);
  20. if(!$user){
  21. return $this->error(__('auth.failed',[403],403));
  22. }
  23. //判断当前用户是否有指定的 course 的权限
  24. $role = CourseMember::where('course_id', $request->get('id',$request->get('course')))
  25. ->where('user_id',$user['user_uid'])
  26. ->value('role');
  27. if(empty($role)){
  28. return $this->error(__('auth.failed',[403],403));
  29. }
  30. $result=false;
  31. $indexCol = ['id','user_id','course_id',
  32. 'channel_id','role','editor_uid',
  33. 'updated_at','created_at'];
  34. switch ($request->get('view')) {
  35. case 'course':
  36. # 获取 course 内所有 成员
  37. $table = CourseMember::where('course_id', $request->get('id'))
  38. ->where('is_current',true);
  39. break;
  40. case 'timeline':
  41. /**
  42. * 编辑时间线
  43. */
  44. $table = CourseMember::where('user_id',$request->get('userId'));
  45. if($request->get('timeline','current')==='current'){
  46. $table = $table->where('course_id', $request->get('course'));
  47. }
  48. break;
  49. default:
  50. return $this->error('无法识别的参数view',400,400);
  51. break;
  52. }
  53. if(!empty($request->get("search"))){
  54. $table = $table->where('name', 'like', '%'.$request->get("search")."%");
  55. }
  56. $count = $table->count();
  57. $table = $table->orderBy($request->get('order','created_at'),
  58. $request->get('dir','asc'));
  59. $table = $table->skip($request->get('offset',0))
  60. ->take($request->get('limit',1000));
  61. $result = $table->get();
  62. //获取当前用户角色
  63. $role = CourseMember::where('course_id', $request->get('id'))
  64. ->where('user_id', $user['user_uid'])
  65. ->where('is_current',true)
  66. ->value('role');
  67. return $this->ok(["rows"=>CourseMemberResource::collection($result),'role'=>$role,"count"=>$count]);
  68. }
  69. /**
  70. * Store a newly created resource in storage.
  71. *
  72. * @param \Illuminate\Http\Request $request
  73. * @return \Illuminate\Http\Response
  74. */
  75. public function store(Request $request)
  76. {
  77. //
  78. $user = AuthApi::current($request);
  79. if(!$user){
  80. return $this->error(__('auth.failed',[403],403));
  81. }
  82. $validated = $request->validate([
  83. 'user_id' => 'required',
  84. 'course_id' => 'required',
  85. 'role' => 'required',
  86. 'status' => 'required',
  87. ]);
  88. //查找重复的
  89. if($validated['status'] !== 'invited'){
  90. if(CourseMember::where('course_id', $validated['course_id'])
  91. ->where('user_id',$validated['user_id'])
  92. ->exists()){
  93. return $this->error('member exists',[200],200);
  94. }
  95. }
  96. if($validated['status'] === 'invited'){
  97. $userId = $validated['user_id'];
  98. }else{
  99. $userId = $user['user_uid'];
  100. }
  101. CourseMember::where('course_id',$validated['course_id'])
  102. ->where('user_id',$userId)
  103. ->update(['is_current'=>false]);
  104. $newMember = new CourseMember();
  105. $newMember->course_id = $validated['course_id'];
  106. $newMember->role = $validated['role'];
  107. $newMember->editor_uid = $user['user_uid'];
  108. $newMember->status = $validated['status'];
  109. $newMember->user_id = $userId;
  110. /**
  111. * 查找course 信息,根据加入方式设置状态
  112. * open : accepted
  113. * manual: progressing
  114. */
  115. $course = Course::find($validated['course_id']);
  116. if(!$course){
  117. return $this->error('invalid course');
  118. }
  119. switch ($course->join) {
  120. case 'open': //开放学习课程
  121. if($validated['status']!=='joined' &&
  122. $validated['status']!=='invited'
  123. ){
  124. return $this->error('invalid course',[200],200);
  125. }
  126. break;
  127. case 'manual': //人工审核课程
  128. if($validated['status']!=='applied' &&
  129. $validated['status']!=='invited'
  130. ){
  131. return $this->error('invalid course',[200],200);
  132. }
  133. break;
  134. }
  135. $newMember->save();
  136. return $this->ok(new CourseMemberResource($newMember));
  137. }
  138. /**
  139. * Display the specified resource.
  140. *
  141. * @param \Illuminate\Http\Request $request
  142. * @param string $courseId
  143. * @return \Illuminate\Http\Response
  144. */
  145. public function show(Request $request,string $courseId)
  146. {
  147. //
  148. $user = AuthApi::current($request);
  149. if(!$user){
  150. return $this->error(__('auth.failed'));
  151. }
  152. $userId = $user['user_uid'];
  153. if(!empty($request->get('user_uid'))){
  154. $userId = $request->get('user_uid');
  155. }
  156. $member = CourseMember::where('course_id',$courseId)
  157. ->where('user_id',$userId)
  158. ->where('is_current',true)
  159. ->first();
  160. if($member){
  161. return $this->ok(new CourseMemberResource($member));
  162. }else{
  163. return $this->error('no result',200,200);
  164. }
  165. }
  166. /**
  167. * Update the specified resource in storage.
  168. *
  169. * @param \Illuminate\Http\Request $request
  170. * @param \App\Models\CourseMember $courseMember
  171. * @return \Illuminate\Http\Response
  172. */
  173. public function update(Request $request, CourseMember $courseMember)
  174. {
  175. /**
  176. * 保留原有记录
  177. * 增加一条新纪录
  178. * 原有记录变为历史记录
  179. */
  180. $user = AuthApi::current($request);
  181. if(!$user){
  182. return $this->error(__('auth.failed'));
  183. }
  184. $newMember = new CourseMember();
  185. $newMember->user_id = $courseMember->user_id;
  186. $newMember->course_id = $courseMember->course_id;
  187. $newMember->role = $courseMember->role;
  188. $newMember->status = $courseMember->status;
  189. $newMember->channel_id = $courseMember->channel_id;
  190. $newMember->editor_uid = $user['user_uid'];
  191. $courseMember->is_current = false;
  192. $courseMember->save();
  193. if($request->has('channel_id')) {
  194. if($newMember->user_id !== $user['user_uid']){
  195. return $this->error(__('auth.failed'));
  196. }
  197. $newMember->channel_id = $request->get('channel_id');
  198. }
  199. if($request->has('status')) {
  200. $newMember->status = $request->get('status');
  201. }
  202. $newMember->save();
  203. return $this->ok(new CourseMemberResource($newMember));
  204. }
  205. public function set_channel(Request $request)
  206. {
  207. //
  208. $user = AuthApi::current($request);
  209. if(!$user){
  210. return $this->error(__('auth.failed'));
  211. }
  212. if($request->has('channel_id')) {
  213. $courseMember = CourseMember::where('course_id',$request->get('course_id'))
  214. ->where('user_id',$user['user_uid'])
  215. ->first();
  216. if($courseMember){
  217. $courseMember->channel_id = $request->get('channel_id');
  218. $courseMember->save();
  219. return $this->ok(new CourseMemberResource($courseMember));
  220. }else{
  221. return $this->error(__('auth.failed'));
  222. }
  223. }
  224. }
  225. /**
  226. * Remove the specified resource from storage.
  227. *
  228. * @param \Illuminate\Http\Request $request
  229. * @param \App\Models\CourseMember $courseMember
  230. * @return \Illuminate\Http\Response
  231. */
  232. public function destroy(Request $request,CourseMember $courseMember)
  233. {
  234. //查看删除者有没有删除权限
  235. //查询删除者的权限
  236. $user = AuthApi::current($request);
  237. if(!$user){
  238. return $this->error(__('auth.failed'));
  239. }
  240. $isOwner = Course::where('id',$courseMember->course_id)->where('studio_id',$user["user_uid"])->exists();
  241. if(!$isOwner){
  242. $courseUser = CourseMember::where('course_id',$courseMember->course_id)
  243. ->where('user_id',$user["user_uid"])
  244. ->select('role')->first();
  245. //open 课程 可以删除自己
  246. if(!$courseUser){
  247. //被删除的不是自己
  248. if($courseUser->role ==="student"){
  249. //普通成员没有删除权限
  250. return $this->error(__('auth.failed'));
  251. }
  252. }
  253. }
  254. $delete = $courseMember->delete();
  255. return $this->ok($delete);
  256. }
  257. /**
  258. * 获取当前用户权限
  259. *
  260. * @param \Illuminate\Http\Request $request
  261. * @return \Illuminate\Http\Response
  262. */
  263. public function curr(Request $request)
  264. {
  265. $user = AuthApi::current($request);
  266. if(!$user){
  267. return $this->error(__('auth.failed'));
  268. }
  269. $courseUser = CourseMember::where('course_id',$request->get("course_id"))
  270. ->where('user_id',$user["user_uid"])
  271. ->select(['role','channel_id'])->first();
  272. if($courseUser){
  273. return $this->ok($courseUser);
  274. }else{
  275. return $this->error("not member");
  276. }
  277. }
  278. }