Pārlūkot izejas kodu

team members manage

moell 1 gadu atpakaļ
vecāks
revīzija
92611389e9

+ 45 - 0
app/Http/Controllers/API/TeamMemberController.php

@@ -6,6 +6,8 @@ use App\Http\Controllers\Controller;
 use App\Http\Resources\API\TeamMemberResource;
 use App\Models\Project;
 use App\Models\TeamMember;
+use App\Models\User;
+use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -36,4 +38,47 @@ class TeamMemberController extends Controller
 
         return $this->noContent();
     }
+
+    public function manageMembers(Request $request, string $projectId)
+    {
+        $project = Project::query()->findOrFail($projectId);
+
+        foreach ($request->all() as $item) {
+            if (! isset($item['user_id'])) {
+                continue;
+            }
+
+            $user = User::query()->where("company_id", Auth::user()->company_id)->find($item['user_id']);
+            if (! $user) {
+                return $this->badRequest("Illegal parameters");
+            }
+        }
+
+        foreach ($request->all() as $item) {
+            $teamMember = TeamMember::query()->where([
+                'project_id' => $project->id,
+                'user_id' => $item['user_id'],
+            ])->first();
+
+            if ($teamMember) {
+                $teamMember->fill([
+                    'role' => $item['role'] ?? "",
+                    'limited' => data_get($item, "limited", 1) == 1 ? 1 : 0,
+                ]);
+                $teamMember->save();
+                continue;
+            }
+
+            TeamMember::query()->create([
+                'project_id' => $project->id,
+                'user_id' => $item['user_id'],
+                'role' => $item['role'] ?? "",
+                'limited' => data_get($item, "limited", 1) == 1 ? 1 : 0,
+                'join_at' => Carbon::now()->toDateString(),
+                'created_by' => Auth::id(),
+            ]);
+        }
+
+        return $this->created();
+    }
 }

+ 2 - 0
app/Models/TeamMember.php

@@ -9,6 +9,8 @@ class TeamMember extends Model
 {
     use HasFactory;
 
+    protected $guarded = ['id'];
+
     public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(User::class);

+ 1 - 0
app/Models/User.php

@@ -3,6 +3,7 @@
 namespace App\Models;
 
 // use Illuminate\Contracts\Auth\MustVerifyEmail;
+use App\Models\Scopes\CompanyScope;
 use Illuminate\Database\Eloquent\Casts\Attribute;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Foundation\Auth\User as Authenticatable;

+ 1 - 0
routes/api.php

@@ -75,6 +75,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
 
         Route::get("team-member/{project}", [API\TeamMemberController::class, "members"])->name("team-member.list");
         Route::delete("team-member/{team_member}", [API\TeamMemberController::class, "destroy"])->name("team-member.destroy");
+        Route::post("team-member/{project}/manage", [API\TeamMemberController::class, "manageMembers"])->name("team-member.manage-members");
 
         Route::get("library/{library}/folder", [API\FolderController::class, "library"])->name("folder.library");
         Route::post("folder", [API\FolderController::class, "store"])->name("folder.store");

+ 27 - 0
tests/Feature/API/TeamMemberTest.php

@@ -4,8 +4,10 @@ namespace Tests\Feature\API;
 
 use App\Models\Project;
 use App\Models\TeamMember;
+use App\Models\User;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Facades\Auth;
 use Tests\Feature\TestCase;
 
 class TeamMemberTest extends TestCase
@@ -41,4 +43,29 @@ class TeamMemberTest extends TestCase
 
         $this->assertNull(TeamMember::find($teamMember->id));
     }
+
+    public function test_team_member_manage(): void
+    {
+        $project = Project::factory()->create();
+
+        $formData = [];
+        for ($i = 0; $i < 10; $i++) {
+            $formData[] = [
+                'user_id' =>  User::query()->create([
+                    ...User::factory()->make()->toArray(),
+                    "company_id" => Auth::user()->company_id,
+                    "password" => uniqid(),
+                ])->id,
+                'role' => fake()->text(20),
+                'limited' => 1
+            ];
+        }
+
+        $response = $this->postJson(route('team-member.manage-members', ['project' => $project->id]), $formData);
+        dump($response->getContent());
+
+        $response->assertStatus(201);
+
+        $this->assertEquals(count($formData), TeamMember::query()->where("project_id", $project->id)->count());
+    }
 }