Browse Source

project edit & delete

moell 1 year ago
parent
commit
5dec3cdb16
2 changed files with 75 additions and 3 deletions
  1. 38 3
      app/Http/Controllers/API/ProjectController.php
  2. 37 0
      tests/Feature/API/ProjectTest.php

+ 38 - 3
app/Http/Controllers/API/ProjectController.php

@@ -76,9 +76,40 @@ class ProjectController extends Controller
     /**
      * Update the specified resource in storage.
      */
-    public function update(Request $request, string $id)
+    public function update(CreateOrUpdateRequest $request, string $id)
     {
-        //
+        $project = Project::findOrFail($id);
+
+        $project->fill([
+            ...$request->all(),
+            'whitelist' => $request->whitelist ? sprintf(",%s", implode(',', $request->whitelist)) : null,
+        ]);
+
+        $project->save();
+
+        if ($request->has("assets")) {
+            ProjectAsset::where('project_id', $project->id)->delete();
+
+            foreach ($request->get("assets", []) as $assetId) {
+                ProjectAsset::create([
+                    'project_id' => $project->id,
+                    'asset_id' => $assetId,
+                ]);
+            }
+        }
+
+        if ($request->has("plans")) {
+            ProjectPlan::where('project_id', $project->id)->delete();
+
+            foreach ($request->get("plans", []) as $planId) {
+                ProjectPlan::create([
+                    'project_id' => $project->id,
+                    'plan_id' => $planId,
+                ]);
+            }
+        }
+
+        return $this->noContent();
     }
 
     /**
@@ -86,6 +117,10 @@ class ProjectController extends Controller
      */
     public function destroy(string $id)
     {
-        //
+        $project = Project::findOrFail($id);
+
+        $project->delete();
+
+        return $this->noContent();
     }
 }

+ 37 - 0
tests/Feature/API/ProjectTest.php

@@ -56,4 +56,41 @@ class ProjectTest extends TestCase
 
         $response->assertStatus(201);
     }
+
+    public function test_project_update(): void
+    {
+        $project = Project::factory()->create();
+
+        $form = Project::factory()->make();
+        $form->whitelist = [1];
+
+        $form->plans = [
+            Plan::factory()->create()->id,
+            Plan::factory()->create()->id,
+        ];
+
+        $form->assets = [
+            Asset::factory()->create()->id,
+            Asset::factory()->create()->id,
+        ];
+
+        $response = $this->put(route('project.update', ['project' => $project->id]), $form->toArray());
+
+        $response->assertStatus(204);
+
+        $newAsset = Project::find($project->id);
+
+        $this->assertEquals($form->name, $newAsset->name);
+    }
+
+    public function test_asset_group_delete(): void
+    {
+        $project = Project::factory()->create();
+
+        $response = $this->delete(route('project.destroy', ['project' => $project->id]));
+
+        $response->assertStatus(204);
+
+        $this->assertNull(Project::find($project->id));
+    }
 }