CourseMemberController.php 12 KB

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