Browse Source

requirement query by site id & link plan

moell 1 year ago
parent
commit
d96918f991

+ 26 - 0
app/Http/Controllers/API/RequirementController.php

@@ -4,6 +4,9 @@ namespace App\Http\Controllers\API;
 
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
+use App\Http\Requests\API\Requirement\LinkPlanRequest;
+use App\Http\Resources\API\AssetRequirementResource;
+use App\Models\Plan;
 use App\Models\Requirement;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -18,6 +21,16 @@ class RequirementController extends Controller
         //
     }
 
+    public function byAsset(string $assetId)
+    {
+        $requirements = Requirement::query()
+            ->with(['createdBy', 'plan'])
+            ->where('asset_id', $assetId)
+            ->simplePaginate();
+
+        return AssetRequirementResource::collection($requirements);
+    }
+
     /**
      * Store a newly created resource in storage.
      */
@@ -62,4 +75,17 @@ class RequirementController extends Controller
     {
         //
     }
+
+    public function linkPlan(LinkPlanRequest $request, string $planId)
+    {
+        $plan = Plan::query()->findOrFail($planId);
+
+        Requirement::query()->where("asset_id", $plan->asset_id)
+            ->whereIn('id', $request->get("requirement_ids"))
+            ->update([
+                'plan_id' => $plan->id,
+            ]);
+
+        return $this->noContent();
+    }
 }

+ 31 - 0
app/Http/Requests/API/Requirement/LinkPlanRequest.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Http\Requests\API\Requirement;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class LinkPlanRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     */
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
+     */
+    public function rules(): array
+    {
+        return [
+            'requirement_ids' => [
+                'required',
+                'array',
+            ]
+        ];
+    }
+}

+ 26 - 0
app/Http/Resources/API/AssetRequirementResource.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class AssetRequirementResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'priority' => $this->priority,
+            'title' => $this->title,
+            'created_by' => new UserProfileResource($this->createdBy),
+            'plan' => new SimplePlanResource($this->plan),
+            'status' => $this->status,
+        ];
+    }
+}

+ 13 - 0
app/Models/Requirement.php

@@ -2,6 +2,7 @@
 
 namespace App\Models;
 
+use App\Models\Scopes\CompanyScope;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 
@@ -26,8 +27,20 @@ class Requirement extends Model
         'mailto' => 'array',
     ];
 
+    protected static function booted()
+    {
+        parent::booted(); // TODO: Change the autogenerated stub
+
+        static::addGlobalScope(new CompanyScope);
+    }
+
     public function createdBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(User::class, 'created_by');
     }
+
+    public function plan(): \Illuminate\Database\Eloquent\Relations\BelongsTo
+    {
+        return $this->belongsTo(Plan::class);
+    }
 }

+ 3 - 0
routes/api.php

@@ -34,6 +34,9 @@ Route::middleware(['auth:sanctum'])->group(function () {
         'plan' => API\PlanController::class,
     ]);
 
+    Route::get("requirement/{asset_id}/asset", [API\RequirementController::class, "byAsset"])->name("requirement.byAsset");
+    Route::patch("requirement/{plan_id}/linkPlan", [API\RequirementController::class, "linkPlan"])->name("requirement.linkPlan");
+
     Route::patch("project/{project}/closed", [API\ProjectController::class, "closed"])->name("project.closed");
     Route::patch("project/{project}/start", [API\ProjectController::class, "start"])->name("project.start");
     Route::patch("project/{project}/pause", [API\ProjectController::class, "pause"])->name("project.pause");

+ 1 - 2
tests/Feature/API/ProjectTest.php

@@ -244,6 +244,7 @@ class ProjectTest extends TestCase
 
         $requirement = Requirement::factory()->make();
         $requirement->asset_id = $plan->asset_id;
+        $requirement->plan_id = $plan->id;
         $requirement->save();
 
         PlanRequirement::create([
@@ -280,8 +281,6 @@ class ProjectTest extends TestCase
 
         $response = $this->get(route('project.requirement', ['project' => $project->id]));
 
-        dump($response->getContent());
-
         $response->assertStatus(200)
             ->assertJsonStructure($this->simplePaginateResponseStructure([
                 'id', 'title', 'created_by', 'status'

+ 44 - 0
tests/Feature/API/RequirementTest.php

@@ -2,7 +2,10 @@
 
 namespace Tests\Feature\API;
 
+use App\Models\Asset;
+use App\Models\Plan;
 use App\Models\Requirement;
+use Database\Factories\AssetFactory;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
 use Tests\Feature\TestCase;
@@ -17,4 +20,45 @@ class RequirementTest extends TestCase
 
         $response->assertStatus(201);
     }
+
+    public function test_requirement_query_by_site_id(): void
+    {
+        $asset = AssetFactory::new()->create();
+
+        Requirement::factory(30)->create([
+            'asset_id' => $asset->id,
+        ]);
+
+        $response = $this->get(route('requirement.byAsset', ['asset_id' => $asset->id]));
+
+        $response->assertStatus(200)->assertJsonStructure($this->simplePaginateResponseStructure([
+            'id',
+            'priority',
+            'title',
+            'created_by',
+            'plan',
+            'status',
+        ]));
+    }
+
+    public function test_link_plan(): void
+    {
+        $asset = Asset::factory()->create();
+
+        $plan = Plan::factory()->create([
+            'asset_id' => $asset->id,
+        ]);
+
+        $requirementIds = [];
+
+        for ($i = 0; $i < 10; ++$i) {
+            $requirementIds[] = Requirement::factory()->create(['asset_id' => $asset->id])?->id;
+        }
+
+        $response = $this->patch(route('requirement.linkPlan', ['plan_id' => $plan->id]), [
+            'requirement_ids' => $requirementIds,
+        ]);
+
+        $response->assertStatus(204);
+    }
 }