TeamMemberController.php 3.6 KB

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