TeamMemberController.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Resources\API\TeamMemberResource;
  5. use App\Models\Project;
  6. use App\Models\TeamMember;
  7. use App\Models\User;
  8. use Carbon\Carbon;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Auth;
  11. class TeamMemberController extends Controller
  12. {
  13. /**
  14. * Display a listing of the resource.
  15. */
  16. public function members(Request $request,string $projectId)
  17. {
  18. return $this->getMembers($request,$projectId);
  19. }
  20. public function publicSearch(Request $request,string $projectId)
  21. {
  22. return $this->getMembers($request,$projectId);
  23. }
  24. protected function getMembers(Request $request,string $projectId)
  25. {
  26. $project = Project::query()->findOrFail($projectId);
  27. // 假设你想根据用户的 name 字段进行筛选
  28. $name = $request->get('name');
  29. $project->load(['teamMembers.user' => function ($query) use ($name) {
  30. if ($name) {
  31. $query->where('name', 'like', "%{$name}%");
  32. }
  33. }]);
  34. $teamMembers=$project->teamMembers->filter(function ($teamMember) {
  35. return $teamMember->user !== null;
  36. });
  37. $newId=1;
  38. foreach ($teamMembers as $teamMember) {
  39. $teamMember->display_id = (string)$newId++;
  40. }
  41. return TeamMemberResource::collection($teamMembers);
  42. }
  43. /**
  44. * Remove the specified resource from storage.
  45. */
  46. public function destroy(string $id)
  47. {
  48. $teamMember = TeamMember::query()->findOrFail($id);
  49. if($teamMember->user_id==$teamMember->created_by){
  50. return $this->badRequest('Not allowed to delete project creator');
  51. }
  52. if ($teamMember->project?->company_id != Auth::user()->company_id) {
  53. return $this->forbidden('No permission to delete');
  54. }
  55. $teamMember->delete();
  56. return $this->noContent();
  57. }
  58. public function manageMembers(Request $request, string $projectId)
  59. {
  60. $project = Project::query()->findOrFail($projectId);
  61. $project->teamMembers()->delete();
  62. foreach ($request->all() as $item) {
  63. if (! isset($item['user_id'])) {
  64. continue;
  65. }
  66. $user = User::query()->where("company_id", Auth::user()->company_id)->find($item['user_id']);
  67. if (! $user) {
  68. return $this->badRequest("Illegal parameters");
  69. }
  70. }
  71. foreach ($request->all() as $item) {
  72. $teamMember = TeamMember::query()->where([
  73. 'project_id' => $project->id,
  74. 'user_id' => $item['user_id'],
  75. ])->first();
  76. if ($teamMember) {
  77. $teamMember->fill([
  78. 'role' => $item['role'] ?? "",
  79. 'limited' => data_get($item, "limited", 1) == 1 ? 1 : 0,
  80. ]);
  81. $teamMember->save();
  82. continue;
  83. }
  84. TeamMember::query()->create([
  85. 'project_id' => $project->id,
  86. 'user_id' => $item['user_id'],
  87. 'role' => $item['role'] ?? "",
  88. 'limited' => data_get($item, "limited", 1) == 1 ? 1 : 0,
  89. 'join_at' => Carbon::now()->toDateString(),
  90. 'created_by' => Auth::id(),
  91. ]);
  92. }
  93. return $this->created();
  94. }
  95. }