Browse Source

Container editing, delete, converters and detector implementations

moell 11 months ago
parent
commit
d8eb4e8c17

+ 36 - 3
app/Http/Controllers/API/ContainerController.php

@@ -6,12 +6,14 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Container\CreateOrUpdateRequest;
 use App\Http\Resources\API\ContainerDetailResource;
 use App\Models\Container;
+use App\Models\Enums\ActionObjectType;
 use App\Models\Enums\FileObjectType;
 use App\Models\Enums\ObjectAction;
 use App\Repositories\ActionRepository;
 use App\Repositories\CustomFieldRepository;
 use App\Services\File\FileAssociationService;
 use App\Services\File\ImageUrlService;
+use App\Services\History\ModelChangeDetector;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -79,9 +81,34 @@ class ContainerController extends Controller
     /**
      * Update the specified resource in storage.
      */
-    public function update(Request $request, string $id)
+    public function update(
+        CreateOrUpdateRequest $request,
+        ImageUrlService $imageUrlService,
+        FileAssociationService $service,
+        CustomFieldRepository $customFieldRepo,
+        string $id
+    )
     {
-        //
+        $container = Container::query()->allowed()->findOrFail($id);
+
+        $formData = [
+            ...$request->all(),
+            'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
+            'description' => $imageUrlService->interceptImageUrl($request->description) ,
+        ];
+
+        if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
+            $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
+            $formData['naming_rules'] = $request->only($keys);
+        }
+
+        $container->fill($formData);
+        $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER, $container);
+        $container->save();
+
+        ActionRepository::createByContainer($container, ObjectAction::EDITED, objectChanges: $changes);
+
+        return $this->noContent();
     }
 
     /**
@@ -89,6 +116,12 @@ class ContainerController extends Controller
      */
     public function destroy(string $id)
     {
-        //
+        $container = Container::query()->allowed()->findOrFail($id);
+
+        $container->delete();
+
+        ActionRepository::createByContainer($container, ObjectAction::DELETED);
+
+        return $this->noContent();
     }
 }

+ 5 - 0
app/Models/Enums/ActionObjectType.php

@@ -3,10 +3,12 @@
 namespace App\Models\Enums;
 
 use App\Models\Asset;
+use App\Models\Container;
 use App\Models\Plan;
 use App\Models\Project;
 use App\Models\Requirement;
 use App\Models\Task;
+use App\Services\History\Detector\ContainerDetector;
 use App\Services\History\Detector\ProjectDetector;
 use App\Services\History\Detector\RequirementDetector;
 use App\Services\History\Detector\TaskDetector;
@@ -33,6 +35,7 @@ enum ActionObjectType: string
             self::TASK => Task::query(),
             self::PLAN => Plan::query(),
             self::REQUIREMENT => Requirement::query(),
+            self::CONTAINER => Container::query(),
         };
     }
 
@@ -44,6 +47,7 @@ enum ActionObjectType: string
             self::TASK => Task::query()->allowed($id),
             self::PLAN => Plan::query(),
             self::REQUIREMENT => Requirement::query(),
+            self::CONTAINER => Container::query()->allowed($id),
         };
     }
 
@@ -62,6 +66,7 @@ enum ActionObjectType: string
             ActionObjectType::PROJECT => ProjectDetector::class,
             ActionObjectType::REQUIREMENT => RequirementDetector::class,
             ActionObjectType::TASK => TaskDetector::class,
+            ActionObjectType::CONTAINER => ContainerDetector::class,
             default => null
         };
     }

+ 4 - 2
app/Models/Enums/CustomFieldGroup.php

@@ -4,7 +4,9 @@ namespace App\Models\Enums;
 
 enum CustomFieldGroup: string
 {
-    case PRIVATE = 'private';
+    case TASK = 'task';
 
-    case CUSTOM = 'custom';
+    case PROJECT = 'project';
+
+    case CONTAINER = 'container';
 }

+ 10 - 0
app/Services/History/Converter/ContainerConverter.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Services\History\Converter;
+
+use App\Models\Container;
+
+class ContainerConverter extends ModelConverter
+{
+    protected static string $modelClassName = Container::class;
+}

+ 57 - 0
app/Services/History/Detector/ContainerDetector.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Services\History\Detector;
+
+use App\Models\Enums\CustomFieldGroup;
+use App\Services\History\Converter\ContainerConverter;
+use App\Services\History\Converter\CustomFieldSelectConverter;
+use App\Services\History\Converter\EmailConverter;
+use App\Services\History\Converter\ModelEnumConverter;
+use App\Services\History\Converter\NamingRuleConverter;
+use App\Services\History\Converter\WhitelistConverter;
+
+class ContainerDetector extends DetectorAbstract
+{
+    public static function fields(): array
+    {
+        return [
+            'name',
+            'library_id',
+            'naming_rule_id',
+            'task_type',
+            'doc_stage',
+            'acl',
+            'whitelist',
+            'description',
+            'mailto',
+            'email_subject',
+        ];
+    }
+
+    public static function diffFields(): array
+    {
+        return [
+            'description',
+        ];
+    }
+
+    public static function arrayFields(): array
+    {
+        return [
+            'mailto',
+        ];
+    }
+
+    public static function converters(): array
+    {
+        return [
+            "whitelist" => new WhitelistConverter(),
+            "acl" => new ModelEnumConverter("container.acl"),
+            "doc_stage" => new CustomFieldSelectConverter(CustomFieldGroup::CONTAINER->value, "doc_stage"),
+            "doc_type" => new CustomFieldSelectConverter(CustomFieldGroup::CONTAINER->value, "doc_type"),
+            "naming_rule_id" => new NamingRuleConverter(),
+            "library_id" => new ContainerConverter(),
+            "mailto" => new EmailConverter(),
+        ];
+    }
+}

+ 1 - 0
config/custom-field.php

@@ -7,5 +7,6 @@ return [
     'groups' => [
         'task',
         'project',
+        'container',
     ]
 ];

+ 7 - 0
lang/en/model-enums.php

@@ -4,6 +4,7 @@ use \App\Models\Enums\ProjectStatus;
 use \App\Models\Enums\RequirementStatus;
 use \App\Models\Enums\ProjectACL;
 use \App\Models\Enums\TaskACL;
+use \App\Models\Enums\ContainerACL;
 use \App\Models\Enums\TaskStatus;
 
 return [
@@ -44,4 +45,10 @@ return [
             TaskACL::CUSTOM->value => "Custom",
         ]
     ],
+    'container' => [
+        'acl' => [
+            ContainerACL::PRIVATE->value => "Private",
+            ContainerACL::CUSTOM->value => "Custom",
+        ]
+    ]
 ];