瀏覽代碼

Requirement Group add, edit, list, delete and other APIs

moell 1 年之前
父節點
當前提交
205c1f24e5

+ 71 - 0
app/Http/Controllers/API/RequirementGroupController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Http\Controllers\API;
+
+use App\Http\Controllers\Controller;
+use App\Http\Requests\API\RequirementGroup\CreateOrUpdateRequest;
+use App\Http\Resources\API\RequirementGroupResource;
+use App\Models\RequirementGroup;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class RequirementGroupController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     */
+    public function index()
+    {
+        $groups = RequirementGroup::query()->get();
+
+        return RequirementGroupResource::collection($groups);
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     */
+    public function store(CreateOrUpdateRequest $request)
+    {
+        RequirementGroup::create([
+            ...$request->all(),
+            'company_id' => Auth::user()->company_id,
+        ]);
+
+        return $this->created();
+    }
+
+    /**
+     * Display the specified resource.
+     */
+    public function show(string $id)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     */
+    public function update(CreateOrUpdateRequest $request, string $id)
+    {
+        $group = RequirementGroup::query()->findOrFail($id);
+
+        $group->fill($request->only(
+            'name', 'abbr_name'
+        ));
+        $group->save();
+
+        return $this->noContent();
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     */
+    public function destroy(string $id)
+    {
+        $group = RequirementGroup::query()->findOrFail($id);
+
+        $group->delete();
+
+        return $this->noContent();
+    }
+}

+ 29 - 0
app/Http/Requests/API/RequirementGroup/CreateOrUpdateRequest.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Requests\API\RequirementGroup;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class CreateOrUpdateRequest 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 [
+            'name' => 'required|max:255',
+            'abbr_name' => 'required|max:30',
+        ];
+    }
+}

+ 19 - 0
app/Http/Resources/API/RequirementGroupResource.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class RequirementGroupResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return parent::toArray($request);
+    }
+}

+ 15 - 0
app/Models/RequirementGroup.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class RequirementGroup extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'name', 'abbr_name', 'company_id'
+    ];
+}

+ 25 - 0
database/factories/RequirementGroupFactory.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace Database\Factories;
+
+use Illuminate\Database\Eloquent\Factories\Factory;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\RequirementGroup>
+ */
+class RequirementGroupFactory extends Factory
+{
+    /**
+     * Define the model's default state.
+     *
+     * @return array<string, mixed>
+     */
+    public function definition(): array
+    {
+        return [
+            'name' => fake()->text(100),
+            'abbr_name' => fake()->text(10),
+            'company_id' => 1,
+        ];
+    }
+}

+ 30 - 0
database/migrations/2024_01_19_132204_create_requirement_groups_table.php

@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('requirement_groups', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->string('abbr_name', 30);
+            $table->integer('company_id');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('requirement_groups');
+    }
+};

+ 1 - 0
routes/api.php

@@ -28,5 +28,6 @@ Route::middleware(['auth:sanctum'])->group(function () {
     Route::apiResources([
         'asset-group' => API\AssetGroupController::class,
         'asset' => API\AssetController::class,
+        'requirement-group' => API\RequirementGroupController::class,
     ]);
 });

+ 66 - 0
tests/Feature/API/RequirementGroupTest.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace Tests\Feature\API;
+
+
+use App\Models\RequirementGroup;
+use Tests\Feature\TestCase;
+
+class RequirementGroupTest extends TestCase
+{
+    public function test_requirement_group_list()
+    {
+        RequirementGroup::factory(30)->create();
+
+        $response = $this->get(route('requirement-group.index'));
+
+        $response->assertStatus(200)
+            ->assertJsonStructure([
+                'data' => [
+                    '*' => [
+                        'name',
+                        'abbr_name'
+                    ]
+                ]
+            ]);
+    }
+
+    public function test_requirement_group_create(): void
+    {
+        $response = $this->post(route('requirement-group.store'), [
+            'abbr_name' => fake()->text(10),
+            'name' => fake()->text(100),
+        ]);
+
+        $response->assertStatus(201);
+    }
+
+    public function test_requirement_group_update(): void
+    {
+        $group = RequirementGroup::factory()->create();
+
+        $form = [
+            'name' => fake()->text(100),
+            'abbr_name' => fake()->text(15),
+        ];
+
+        $response = $this->put(route('requirement-group.update', ['requirement_group' => $group->id]), $form);
+
+        $response->assertStatus(204);
+
+        $newRequirementGroup = RequirementGroup::find($group->id);
+        $this->assertEquals($form['name'], $newRequirementGroup->name);
+        $this->assertEquals($form['abbr_name'], $newRequirementGroup->abbr_name);
+    }
+
+    public function test_requirement_group_delete(): void
+    {
+        $group = RequirementGroup::factory()->create();
+
+        $response = $this->delete(route('requirement-group.destroy', ['requirement_group' => $group->id]));
+
+        $response->assertStatus(204);
+
+        $this->assertNull(RequirementGroup::find($group->id));
+    }
+}