From 97d8bd5fe483eb53ef4a9b94b22608fa8303148b Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Wed, 1 Apr 2020 12:22:51 +0200
Subject: [PATCH] FEAT #13678 TIME 0:50 Refactoring user email signature

---
 migration/20.10/2010.sql                    | 10 +++
 sql/structure.sql                           | 15 +---
 src/app/user/controllers/UserController.php | 36 ++++-----
 src/app/user/models/UserModelAbstract.php   | 82 ---------------------
 4 files changed, 31 insertions(+), 112 deletions(-)

diff --git a/migration/20.10/2010.sql b/migration/20.10/2010.sql
index 4036ff4880c..0d1d783aa29 100755
--- a/migration/20.10/2010.sql
+++ b/migration/20.10/2010.sql
@@ -13,3 +13,13 @@ DELETE FROM usergroups_services WHERE service_id IN ('reports', 'admin_reports')
 
 ALTER TABLE users DROP COLUMN IF EXISTS refresh_token;
 ALTER TABLE users ADD COLUMN refresh_token jsonb NOT NULL DEFAULT '[]';
+
+DO $$ BEGIN
+    IF (SELECT count(column_name) from information_schema.columns where table_name = 'users_email_signatures' and column_name = 'user_id' and data_type != 'integer') THEN
+        ALTER TABLE users_email_signatures ADD COLUMN user_id_tmp INTEGER;
+        UPDATE users_email_signatures set user_id_tmp = (select id FROM users where users.user_id = users_email_signatures.user_id);
+        ALTER TABLE users_email_signatures ALTER COLUMN user_id_tmp set not null;
+        ALTER TABLE users_email_signatures DROP COLUMN IF EXISTS user_id;
+        ALTER TABLE users_email_signatures RENAME COLUMN user_id_tmp TO user_id;
+    END IF;
+END$$;
diff --git a/sql/structure.sql b/sql/structure.sql
index 3674a5b7a7d..70a29414798 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -473,24 +473,15 @@ CREATE TABLE groupbasket_redirect
 )
 WITH (OIDS=FALSE);
 
-CREATE SEQUENCE email_signatures_id_seq
-  INCREMENT 1
-  MINVALUE 1
-  MAXVALUE 9223372036854775807
-  START 7
-  CACHE 1;
-
 CREATE TABLE users_email_signatures
 (
-  id bigint NOT NULL DEFAULT nextval('email_signatures_id_seq'::regclass),
-  user_id character varying(255) NOT NULL,
+  id serial NOT NULL,
+  user_id INTEGER NOT NULL,
   html_body text NOT NULL,
   title character varying NOT NULL,
   CONSTRAINT email_signatures_pkey PRIMARY KEY (id)
 )
-WITH (
-  OIDS=FALSE
-);
+WITH (OIDS=FALSE);
 
 /* FOLDERS */
 CREATE TABLE folders
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index afbd99d10f8..812117a4242 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -49,6 +49,7 @@ use SrcCore\models\DatabaseModel;
 use SrcCore\models\PasswordModel;
 use Template\models\TemplateModel;
 use User\models\UserBasketPreferenceModel;
+use User\models\UserEmailSignatureModel;
 use User\models\UserEntityModel;
 use User\models\UserGroupModel;
 use User\models\UserModel;
@@ -117,7 +118,7 @@ class UserController
 
         if (PrivilegeController::hasPrivilege(['privilegeId' => 'view_personal_data', 'userId' => $GLOBALS['id']])) {
             $user['signatures'] = UserSignatureModel::getByUserSerialId(['userSerialid' => $aArgs['id']]);
-            $user['emailSignatures'] = UserModel::getEmailSignaturesById(['userId' => $user['user_id']]);
+            $user['emailSignatures'] = UserEmailSignatureModel::getByUserId(['userId' => $user['id']]);
         } else {
             $user['signatures'] = [];
             $user['emailSignatures'] = [];
@@ -502,7 +503,7 @@ class UserController
         $user['external_id']        = json_decode($user['external_id'], true);
         $user['preferences']        = json_decode($user['preferences'], true);
         $user['signatures']         = UserSignatureModel::getByUserSerialId(['userSerialid' => $user['id']]);
-        $user['emailSignatures']    = UserModel::getEmailSignaturesById(['userId' => $user['user_id']]);
+        $user['emailSignatures']    = UserEmailSignatureModel::getByUserId(['userId' => $GLOBALS['id']]);
         $user['groups']             = UserModel::getGroupsByLogin(['login' => $user['user_id']]);
         $user['entities']           = UserModel::getEntitiesByLogin(['login' => $user['user_id']]);
         $user['baskets']            = BasketModel::getBasketsByLogin(['login' => $user['user_id']]);
@@ -1021,14 +1022,14 @@ class UserController
             return $response->withJson(['errors' => 'Bad Request']);
         }
 
-        UserModel::createEmailSignature([
-            'userId'    => $GLOBALS['userId'],
+        UserEmailSignatureModel::create([
+            'userId'    => $GLOBALS['id'],
             'title'     => $data['title'],
             'htmlBody'  => $data['htmlBody']
         ]);
 
         return $response->withJson([
-            'emailSignatures' => UserModel::getEmailSignaturesById(['userId' => $GLOBALS['userId']])
+            'emailSignatures' => UserEmailSignatureModel::getByUserId(['userId' => $GLOBALS['id']])
         ]);
     }
 
@@ -1040,26 +1041,26 @@ class UserController
             return $response->withJson(['errors' => 'Bad Request']);
         }
 
-        UserModel::updateEmailSignature([
+        UserEmailSignatureModel::update([
             'id'        => $aArgs['id'],
-            'userId'    => $GLOBALS['userId'],
+            'userId'    => $GLOBALS['id'],
             'title'     => $data['title'],
             'htmlBody'  => $data['htmlBody']
         ]);
 
         return $response->withJson([
-            'emailSignature' => UserModel::getEmailSignatureWithSignatureIdById(['userId' => $GLOBALS['userId'], 'signatureId' => $aArgs['id']])
+            'emailSignature' => UserEmailSignatureModel::getById(['id' => $aArgs['id']])
         ]);
     }
 
     public function deleteCurrentUserEmailSignature(Request $request, Response $response, array $aArgs)
     {
-        UserModel::deleteEmailSignature([
+        UserEmailSignatureModel::delete([
             'id'        => $aArgs['id'],
-            'userId'    => $GLOBALS['userId']
+            'userId'    => $GLOBALS['id']
         ]);
 
-        return $response->withJson(['emailSignatures' => UserModel::getEmailSignaturesById(['userId' => $GLOBALS['userId']])]);
+        return $response->withJson(['emailSignatures' => UserEmailSignatureModel::getByUserId(['userId' => $GLOBALS['id']])]);
     }
 
     public function addGroup(Request $request, Response $response, array $aArgs)
@@ -1737,7 +1738,7 @@ class UserController
 
     public static function getCurrentUserEmailSignatures(Request $request, Response $response)
     {
-        $signatureModels = UserModel::getEmailSignaturesById(['userId' => $GLOBALS['userId']]);
+        $signatureModels = UserEmailSignatureModel::getByUserId(['userId' => $GLOBALS['id']]);
 
         $signatures = [];
 
@@ -1757,16 +1758,15 @@ class UserController
             return $response->withStatus(400)->withJson(['errors' => 'Body param id is empty or not an integer']);
         }
 
-        $signatureModels = UserModel::getEmailSignatureWithSignatureIdById(['userId' => $GLOBALS['userId'], 'signatureId' => $args['id']]);
-
-        if (empty($signatureModels)) {
+        $signature = UserEmailSignatureModel::getById(['id' => $args['id']]);
+        if (empty($signature) || $signature['userId'] != $GLOBALS['id']) {
             return $response->withStatus(404)->withJson(['errors' => 'Signature not found']);
         }
 
         $signature = [
-            'id'      => $signatureModels['id'],
-            'label'   => $signatureModels['title'],
-            'content' => $signatureModels['html_body']
+            'id'      => $signature['id'],
+            'label'   => $signature['title'],
+            'content' => $signature['html_body']
         ];
 
         return $response->withJson(['emailSignature' => $signature]);
diff --git a/src/app/user/models/UserModelAbstract.php b/src/app/user/models/UserModelAbstract.php
index be620ffe2c4..b4a7f32d7e1 100755
--- a/src/app/user/models/UserModelAbstract.php
+++ b/src/app/user/models/UserModelAbstract.php
@@ -270,88 +270,6 @@ abstract class UserModelAbstract
         return true;
     }
 
-    public static function createEmailSignature(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['userId', 'title', 'htmlBody']);
-        ValidatorModel::stringType($aArgs, ['userId', 'title', 'htmlBody']);
-
-        DatabaseModel::insert([
-            'table'         => 'users_email_signatures',
-            'columnsValues' => [
-                'user_id'   => $aArgs['userId'],
-                'title'     => $aArgs['title'],
-                'html_body' => $aArgs['htmlBody']
-            ]
-        ]);
-
-        return true;
-    }
-
-    public static function updateEmailSignature(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id','userId', 'title', 'htmlBody']);
-        ValidatorModel::stringType($aArgs, ['userId', 'title', 'htmlBody']);
-        ValidatorModel::intVal($aArgs, ['id']);
-
-        DatabaseModel::update([
-            'table'     => 'users_email_signatures',
-            'set'       => [
-                'title'     => $aArgs['title'],
-                'html_body' => $aArgs['htmlBody'],
-            ],
-            'where'     => ['user_id = ?', 'id = ?'],
-            'data'      => [$aArgs['userId'], $aArgs['id']]
-        ]);
-
-        return true;
-    }
-
-    public static function deleteEmailSignature(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['id', 'userId']);
-        ValidatorModel::stringType($aArgs, ['userId']);
-
-        DatabaseModel::delete([
-            'table'     => 'users_email_signatures',
-            'where'     => ['user_id = ?', 'id = ?'],
-            'data'      => [$aArgs['userId'], $aArgs['id']]
-        ]);
-
-        return true;
-    }
-
-    public static function getEmailSignaturesById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['userId']);
-        ValidatorModel::stringType($aArgs, ['userId']);
-
-        $aReturn = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['users_email_signatures'],
-            'where'     => ['user_id = ?'],
-            'data'      => [$aArgs['userId']],
-            'order_by'  => ['id']
-        ]);
-
-        return $aReturn;
-    }
-
-    public static function getEmailSignatureWithSignatureIdById(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['userId', 'signatureId']);
-        ValidatorModel::stringType($aArgs, ['userId']);
-        ValidatorModel::intVal($aArgs, ['signatureId']);
-
-        $aReturn = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['users_email_signatures'],
-            'where'     => ['user_id = ?', 'id = ?'],
-            'data'      => [$aArgs['userId'], $aArgs['signatureId']],
-        ]);
-
-        return $aReturn[0];
-    }
-
     public static function getLabelledUserById(array $aArgs)
     {
         ValidatorModel::intVal($aArgs, ['id']);
-- 
GitLab