From 03e46dc87a9e7fbd00fcab3a25103550f0e697f5 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Fri, 10 Jan 2020 16:01:12 +0100
Subject: [PATCH] FEAT #11695 TIME 1:30 second refactoring list_templates

---
 .../entity/controllers/EntityController.php   |  27 +++-
 .../controllers/ListTemplateController.php    |   2 +-
 src/app/user/controllers/UserController.php   |  23 ++--
 .../app/entity/ListTemplateControllerTest.php | 122 ++++++++----------
 4 files changed, 90 insertions(+), 84 deletions(-)

diff --git a/src/app/entity/controllers/EntityController.php b/src/app/entity/controllers/EntityController.php
index bca2211b034..250e6d8555d 100755
--- a/src/app/entity/controllers/EntityController.php
+++ b/src/app/entity/controllers/EntityController.php
@@ -318,9 +318,9 @@ class EntityController
             }
         }
 
-        $children = EntityModel::get(['select' => [1], 'where' => ['parent_entity_id = ?'], 'data' => [$aArgs['id']]]);
+        $children  = EntityModel::get(['select' => [1], 'where' => ['parent_entity_id = ?'], 'data' => [$aArgs['id']]]);
         $documents = ResModel::get(['select' => [1], 'where' => ['destination = ?'], 'data' => [$aArgs['id']]]);
-        $users = EntityModel::getUsersById(['select' => [1], 'id' => $aArgs['id']]);
+        $users     = EntityModel::getUsersById(['select' => [1], 'id' => $aArgs['id']]);
         $templates = TemplateAssociationModel::get(['select' => [1], 'where' => ['value_field = ?'], 'data' => [$aArgs['id']]]);
         $instances = ListInstanceModel::get(['select' => [1], 'where' => ['item_id = ?', 'item_type = ?'], 'data' => [$aArgs['id'], 'entity_id']]);
         $redirects = GroupBasketRedirectModel::get(['select' => [1], 'where' => ['entity_id = ?'], 'data' => [$aArgs['id']]]);
@@ -339,7 +339,17 @@ class EntityController
             $entities['deleted'] = $control['deleted'];
         }
 
-        ListTemplateModel::delete(['where' => ['object_id = ?'], 'data' => [$aArgs['id']]]);
+        $templateLists = ListTemplateModel::get(['select' => ['id'], 'where' => ['entity_id = ?'], 'data' => [$entity['id']]]);
+        if (!empty($templateLists)) {
+            foreach ($templateLists as $templateList) {
+                ListTemplateModel::delete([
+                    'where' => ['id = ?'],
+                    'data'  => [$templateList['id']]
+                ]);
+                ListTemplateItemModel::delete(['where' => ['list_template_id = ?'], 'data' => [$templateList['id']]]);
+            }
+        }
+
         GroupModel::update([
             'postSet'   => ['indexation_parameters' => "jsonb_set(indexation_parameters, '{entities}', (indexation_parameters->'entities') - '{$entity['id']}')"],
             'where'     => ['1=1']
@@ -426,7 +436,16 @@ class EntityController
         //ListInstances
         ListInstanceModel::update(['set' => ['item_id' => $aArgs['newEntityId']], 'where' => ['item_id = ?', 'item_type = ?'], 'data' => [$aArgs['id'], 'entity_id']]);
         //ListTemplates
-        ListTemplateModel::delete(['where' => ['object_id = ?'], 'data' => [$aArgs['id']]]);
+        $templateLists = ListTemplateModel::get(['select' => ['id'], 'where' => ['entity_id = ?'], 'data' => [$dyingEntity['id']]]);
+        if (!empty($templateLists)) {
+            foreach ($templateLists as $templateList) {
+                ListTemplateModel::delete([
+                    'where' => ['id = ?'],
+                    'data'  => [$templateList['id']]
+                ]);
+                ListTemplateItemModel::delete(['where' => ['list_template_id = ?'], 'data' => [$templateList['id']]]);
+            }
+        }
         //Templates
         TemplateAssociationModel::update(['set' => ['value_field' => $aArgs['newEntityId']], 'where' => ['value_field = ?'], 'data' => [$aArgs['id']]]);
         //GroupIndexing
diff --git a/src/app/entity/controllers/ListTemplateController.php b/src/app/entity/controllers/ListTemplateController.php
index 78864a9f549..448d7a15d2c 100755
--- a/src/app/entity/controllers/ListTemplateController.php
+++ b/src/app/entity/controllers/ListTemplateController.php
@@ -379,7 +379,7 @@ class ListTemplateController
 
         $queryParams = $request->getQueryParams();
 
-        $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => ['object_id = ?'], 'data' => [$entity['entity_id']]]);
+        $listTemplates = ListTemplateModel::get(['select' => ['*'], 'where' => ['entity_id = ?'], 'data' => [$args['entityId']]]);
 
         foreach ($listTemplates as $key => $value) {
             if ($value['item_type'] == 'entity_id') {
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 5aa5ac2e585..8a7471d1503 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -1274,7 +1274,7 @@ class UserController
         if (!empty($error['error'])) {
             return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]);
         }
-        if (empty(entitymodel::getByEntityId(['entityId' => $aArgs['entityId']]))) {
+        if (empty(EntityModel::getByEntityId(['entityId' => $aArgs['entityId']]))) {
             return $response->withStatus(400)->withJson(['errors' => 'Entity not found']);
         }
 
@@ -1290,7 +1290,8 @@ class UserController
         if (!empty($error['error'])) {
             return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]);
         }
-        if (empty(entitymodel::getByEntityId(['entityId' => $aArgs['entityId']]))) {
+        $entityInfo = EntityModel::getByEntityId(['entityId' => $aArgs['entityId'], 'select' => ['id']]);
+        if (empty($entityInfo)) {
             return $response->withStatus(400)->withJson(['errors' => 'Entity not found']);
         }
 
@@ -1298,12 +1299,15 @@ class UserController
 
         $data = $request->getParams();
         if (!empty($data['mode'])) {
+            $templateLists = ListTemplateModel::get(['select' => ['id'], 'where' => ['entity_id = ?'], 'data' => [$entityInfo['id']]]);
+            if (!empty($templateLists)) {
+                foreach ($templateLists as $templateList) {
+                    ListTemplateItemModel::delete(['where' => ['list_template_id = ?'], 'data' => [$templateList['id']]]);
+                }
+            }
+
             if ($data['mode'] == 'reaffect') {
-                ListTemplateModel::update([
-                    'set'   => ['item_id' => $data['newUser']],
-                    'where' => ['object_id = ?', 'item_id = ?'],
-                    'data'  => [$aArgs['entityId'], $user['user_id']]
-                ]);
+
                 $listInstances = ListInstanceModel::getWithConfidentiality(['select' => ['listinstance.res_id'], 'entityId' => $aArgs['entityId'], 'userId' => $user['user_id']]);
                 $resIdsToReplace = [];
                 foreach ($listInstances as $listInstance) {
@@ -1317,11 +1321,6 @@ class UserController
                     ]);
                 }
             } else {
-                ListTemplateModel::delete([
-                    'where' => ['object_id = ?', 'item_id = ?', 'item_mode != ?'],
-                    'data'  => [$aArgs['entityId'], $user['user_id'], 'dest']
-                ]);
-
                 $ressources = ResModel::getOnView([
                     'select'    => ['res_id'],
                     'where'     => ['confidentiality = ?', 'destination = ?', 'closing_date is null'],
diff --git a/test/unitTests/app/entity/ListTemplateControllerTest.php b/test/unitTests/app/entity/ListTemplateControllerTest.php
index f8ba260f989..8cfce771c94 100755
--- a/test/unitTests/app/entity/ListTemplateControllerTest.php
+++ b/test/unitTests/app/entity/ListTemplateControllerTest.php
@@ -22,27 +22,27 @@ class ListTemplateControllerTest extends TestCase
         $request        = \Slim\Http\Request::createFromEnvironment($environment);
 
         $aArgs = [
-            'object_type'       => 'VISA_CIRCUIT',
+            'type'              => 'visaCircuit',
             'title'             => 'TEST-LISTTEMPLATE123-TITLE',
             'description'       => 'TEST LISTTEMPLATE123 DESCRIPTION',
             'items'             => [
                 [
                     'sequence'  => 0,
-                    'item_id'   => 'bbain',
-                    'item_type' => 'user_id',
-                    'item_mode' => 'visa'
+                    'id'   => 1,
+                    'type' => 'user',
+                    'mode' => 'visa'
                 ],
                 [
                     'sequence'  => 1,
-                    'item_id'   => 'ssissoko',
-                    'item_type' => 'user_id',
-                    'item_mode' => 'visa'
+                    'id'   => 2,
+                    'type' => 'user',
+                    'mode' => 'visa'
                 ],
                 [
                     'sequence'  => 0,
-                    'item_id'   => 'bboule',
-                    'item_type' => 'user_id',
-                    'item_mode' => 'sign'
+                    'id'   => 3,
+                    'type' => 'user',
+                    'mode' => 'sign'
                 ]
             ],
         ];
@@ -62,8 +62,8 @@ class ListTemplateControllerTest extends TestCase
         foreach ($responseBody->listTemplates as $listTemplate) {
             if ($listTemplate->title == 'TEST-LISTTEMPLATE123-TITLE') {
                 self::$id = $listTemplate->id;
-                $this->assertSame('VISA_CIRCUIT', $listTemplate->object_type);
-                $this->assertSame('VISA_CIRCUIT_', substr($listTemplate->object_id, 0, 13));
+                $this->assertSame('visaCircuit', $listTemplate->type);
+                $this->assertSame('TEST-LISTTEMPLATE123-TITLE', $listTemplate->title);
                 $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION', $listTemplate->description);
             }
         }
@@ -76,32 +76,24 @@ class ListTemplateControllerTest extends TestCase
         $response       = $listTemplateController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
         $responseBody   = json_decode((string)$response->getBody());
 
-        $this->assertSame('VISA_CIRCUIT', $responseBody->listTemplate->diffusionList[0]->object_type);
-        $this->assertSame('TEST-LISTTEMPLATE123-TITLE', $responseBody->listTemplate->diffusionList[0]->title);
-        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION', $responseBody->listTemplate->diffusionList[0]->description);
-        $this->assertSame(0, $responseBody->listTemplate->diffusionList[0]->sequence);
-        $this->assertSame('bbain', $responseBody->listTemplate->diffusionList[0]->item_id);
-        $this->assertSame('user_id', $responseBody->listTemplate->diffusionList[0]->item_type);
-        $this->assertSame('visa', $responseBody->listTemplate->diffusionList[0]->item_mode);
-        $this->assertSame('Y', $responseBody->listTemplate->diffusionList[0]->visible);
-
-        $this->assertSame('VISA_CIRCUIT', $responseBody->listTemplate->diffusionList[1]->object_type);
-        $this->assertSame('TEST-LISTTEMPLATE123-TITLE', $responseBody->listTemplate->diffusionList[1]->title);
-        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION', $responseBody->listTemplate->diffusionList[1]->description);
-        $this->assertSame(1, $responseBody->listTemplate->diffusionList[1]->sequence);
-        $this->assertSame('ssissoko', $responseBody->listTemplate->diffusionList[1]->item_id);
-        $this->assertSame('user_id', $responseBody->listTemplate->diffusionList[1]->item_type);
-        $this->assertSame('visa', $responseBody->listTemplate->diffusionList[1]->item_mode);
-        $this->assertSame('Y', $responseBody->listTemplate->diffusionList[1]->visible);
-
-        $this->assertSame('VISA_CIRCUIT', $responseBody->listTemplate->diffusionList[2]->object_type);
-        $this->assertSame('TEST-LISTTEMPLATE123-TITLE', $responseBody->listTemplate->diffusionList[2]->title);
-        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION', $responseBody->listTemplate->diffusionList[2]->description);
-        $this->assertSame(0, $responseBody->listTemplate->diffusionList[2]->sequence);
-        $this->assertSame('bboule', $responseBody->listTemplate->diffusionList[2]->item_id);
-        $this->assertSame('user_id', $responseBody->listTemplate->diffusionList[2]->item_type);
-        $this->assertSame('sign', $responseBody->listTemplate->diffusionList[2]->item_mode);
-        $this->assertSame('Y', $responseBody->listTemplate->diffusionList[2]->visible);
+        $this->assertSame('TEST-LISTTEMPLATE123-TITLE', $responseBody->listTemplate->title);
+        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION', $responseBody->listTemplate->description);
+        $this->assertSame('visaCircuit', $responseBody->listTemplate->type);
+
+        $this->assertSame(0, $responseBody->listTemplate->items[0]->sequence);
+        $this->assertSame(1, $responseBody->listTemplate->items[0]->item_id);
+        $this->assertSame('user', $responseBody->listTemplate->items[0]->item_type);
+        $this->assertSame('visa', $responseBody->listTemplate->items[0]->item_mode);
+
+        $this->assertSame(1, $responseBody->listTemplate->items[1]->sequence);
+        $this->assertSame(2, $responseBody->listTemplate->items[1]->item_id);
+        $this->assertSame('user', $responseBody->listTemplate->items[1]->item_type);
+        $this->assertSame('visa', $responseBody->listTemplate->items[1]->item_mode);
+
+        $this->assertSame(2, $responseBody->listTemplate->items[2]->sequence);
+        $this->assertSame(3, $responseBody->listTemplate->items[2]->item_id);
+        $this->assertSame('user', $responseBody->listTemplate->items[2]->item_type);
+        $this->assertSame('sign', $responseBody->listTemplate->items[2]->item_mode);
     }
 
     public function testUpdate()
@@ -117,15 +109,15 @@ class ListTemplateControllerTest extends TestCase
             'items'             => [
                 [
                     'sequence'  => 0,
-                    'item_id'   => 'kkaar',
-                    'item_type' => 'user_id',
-                    'item_mode' => 'visa'
+                    'id'   => 4,
+                    'type' => 'user',
+                    'mode' => 'visa'
                 ],
                 [
                     'sequence'  => 0,
-                    'item_id'   => 'ppetit',
-                    'item_type' => 'user_id',
-                    'item_mode' => 'sign'
+                    'id'   => 5,
+                    'type' => 'user',
+                    'mode' => 'sign'
                 ]
             ],
         ];
@@ -135,7 +127,7 @@ class ListTemplateControllerTest extends TestCase
         $response     = $listTemplateController->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
         $responseBody = json_decode((string)$response->getBody());
 
-        $this->assertInternalType('int', $responseBody->id);
+        $this->assertSame(204, $response->getStatusCode());
 
         //  READ
         $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
@@ -147,8 +139,8 @@ class ListTemplateControllerTest extends TestCase
         foreach ($responseBody->listTemplates as $listTemplate) {
             if ($listTemplate->title == 'TEST-LISTTEMPLATE123-TITLE-UPDATED') {
                 self::$id = $listTemplate->id;
-                $this->assertSame('VISA_CIRCUIT', $listTemplate->object_type);
-                $this->assertSame('VISA_CIRCUIT_', substr($listTemplate->object_id, 0, 13));
+                $this->assertSame('visaCircuit', $listTemplate->type);
+                $this->assertSame('TEST-LISTTEMPLATE123-TITLE-UPDATED', $listTemplate->title);
                 $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION UPDATED', $listTemplate->description);
             }
         }
@@ -160,25 +152,21 @@ class ListTemplateControllerTest extends TestCase
         $response       = $listTemplateController->getById($request, new \Slim\Http\Response(), ['id' => self::$id]);
         $responseBody   = json_decode((string)$response->getBody());
 
-        $this->assertSame('VISA_CIRCUIT', $responseBody->listTemplate->diffusionList[0]->object_type);
-        $this->assertSame('TEST-LISTTEMPLATE123-TITLE-UPDATED', $responseBody->listTemplate->diffusionList[0]->title);
-        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION UPDATED', $responseBody->listTemplate->diffusionList[0]->description);
-        $this->assertSame(0, $responseBody->listTemplate->diffusionList[0]->sequence);
-        $this->assertSame('kkaar', $responseBody->listTemplate->diffusionList[0]->item_id);
-        $this->assertSame('user_id', $responseBody->listTemplate->diffusionList[0]->item_type);
-        $this->assertSame('visa', $responseBody->listTemplate->diffusionList[0]->item_mode);
-        $this->assertSame('Y', $responseBody->listTemplate->diffusionList[0]->visible);
-
-        $this->assertSame('VISA_CIRCUIT', $responseBody->listTemplate->diffusionList[1]->object_type);
-        $this->assertSame('TEST-LISTTEMPLATE123-TITLE-UPDATED', $responseBody->listTemplate->diffusionList[1]->title);
-        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION UPDATED', $responseBody->listTemplate->diffusionList[1]->description);
-        $this->assertSame(0, $responseBody->listTemplate->diffusionList[1]->sequence);
-        $this->assertSame('ppetit', $responseBody->listTemplate->diffusionList[1]->item_id);
-        $this->assertSame('user_id', $responseBody->listTemplate->diffusionList[1]->item_type);
-        $this->assertSame('sign', $responseBody->listTemplate->diffusionList[1]->item_mode);
-        $this->assertSame('Y', $responseBody->listTemplate->diffusionList[1]->visible);
-
-        $this->assertSame(null, $responseBody->listTemplate->diffusionList[2]);
+        $this->assertSame('TEST-LISTTEMPLATE123-TITLE-UPDATED', $responseBody->listTemplate->title);
+        $this->assertSame('TEST LISTTEMPLATE123 DESCRIPTION UPDATED', $responseBody->listTemplate->description);
+        $this->assertSame('visaCircuit', $responseBody->listTemplate->type);
+
+        $this->assertSame(0, $responseBody->listTemplate->items[0]->sequence);
+        $this->assertSame(4, $responseBody->listTemplate->items[0]->item_id);
+        $this->assertSame('user', $responseBody->listTemplate->items[0]->item_type);
+        $this->assertSame('visa', $responseBody->listTemplate->items[0]->item_mode);
+
+        $this->assertSame(1, $responseBody->listTemplate->items[1]->sequence);
+        $this->assertSame(5, $responseBody->listTemplate->items[1]->item_id);
+        $this->assertSame('user', $responseBody->listTemplate->items[1]->item_type);
+        $this->assertSame('sign', $responseBody->listTemplate->items[1]->item_mode);
+
+        $this->assertSame(null, $responseBody->listTemplate->items[2]);
     }
 
     public function testDelete()
@@ -191,7 +179,7 @@ class ListTemplateControllerTest extends TestCase
         $response       = $listTemplateController->delete($request, new \Slim\Http\Response(), ['id' => self::$id]);
         $responseBody   = json_decode((string)$response->getBody());
 
-        $this->assertSame('success', $responseBody->success);
+        $this->assertSame(204, $response->getStatusCode());
 
         //  READ
         $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
-- 
GitLab