File indexing completed on 2024-03-24 05:57:23

0001 <?php
0002 
0003 /**
0004  *  ocs-apiserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-apiserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  **/
0023 class Application_Model_ProjectComments
0024 {
0025 
0026     /** @var string */
0027     protected $_dataTableName;
0028     /** @var  Application_Model_DbTable_Comments */
0029     protected $_dataTable;
0030     /** @var  array */
0031     protected $data;
0032     /** @var  array */
0033     protected $index;
0034 
0035     /**
0036      * PHP 5 allows developers to declare constructor methods for classes.
0037      * Classes which have a constructor method call this method on each newly-created object,
0038      * so it is suitable for any initialization that the object may need before it is used.
0039      *
0040      * Note: Parent constructors are not called implicitly if the child class defines a constructor.
0041      * In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.
0042      *
0043      * param [ mixed $args [, $... ]]
0044      *
0045      * @param string $_dataTableName
0046      *
0047      * @link http://php.net/manual/en/language.oop5.decon.php
0048      */
0049     public function __construct($_dataTableName = 'Application_Model_DbTable_Comments')
0050     {
0051         $this->_dataTableName = $_dataTableName;
0052         $this->_dataTable = new Application_Model_DbTable_Comments();
0053     }
0054 
0055     public function getCommentWithMember($comment_id)
0056     {
0057         $sql = "    SELECT *
0058                     FROM comments
0059                     STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id
0060                     WHERE comment_id = :comment_id
0061                     ORDER BY comments.comment_created_at DESC, comment_parent_id
0062         ";
0063 
0064         $rowSet = $this->_dataTable->getAdapter()->fetchAll($sql, array('comment_id' => $comment_id));
0065         if (0 == count($rowSet)) {
0066             return array();
0067         }
0068 
0069         return $rowSet[0];
0070     }
0071 
0072     public function getCommentFromSource($type = 0, $source_id, $source_pk)
0073     {
0074         $sql = "
0075                     SELECT *
0076                     FROM comments
0077                     WHERE comment_type = :type AND source_id = :source_id AND source_pk = :source_pk 
0078         ";
0079 
0080         $rowset = $this->_dataTable->getAdapter()->fetchRow($sql,
0081             array('type' => $type, 'source_id' => $source_id, 'source_pk' => $source_pk))
0082         ;
0083         if (!$rowset) {
0084             return false;
0085         }
0086 
0087         return $rowset;
0088     }
0089 
0090     /**
0091      * @param $project_id
0092      *
0093      * @return Zend_Paginator
0094      */
0095     public function getCommentTreeForProject($project_id)
0096     {
0097 
0098         $sql = "
0099                 SELECT comment_id, comment_target_id, comment_parent_id, comment_text, comment_created_at, comment_active, comment_type, member_id, username, profile_image_url 
0100                 ,(SELECT (DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now())  from support  where support.status_id = 2  AND support.member_id = comments.comment_member_id)  AS issupporter    
0101                 FROM comments 
0102                 STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id 
0103                 WHERE comment_active = :status_active AND comment_type = :type_id AND comment_target_id = :project_id AND comment_parent_id = 0 
0104                 ORDER BY comment_created_at DESC
0105                 ";
0106         $rowset = $this->_dataTable->getAdapter()->fetchAll($sql, array(
0107                 'status_active' => 1,
0108                 'type_id'       => Application_Model_DbTable_Comments::COMMENT_TYPE_PRODUCT,
0109                 'project_id'    => $project_id
0110             ))
0111         ;
0112         $sql = "
0113                 SELECT comment_id, comment_target_id, comment_parent_id, comment_text, comment_created_at, comment_active, comment_type, member_id, username, profile_image_url 
0114                 ,(SELECT (DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now())  from support  where support.status_id = 2  AND support.member_id = comments.comment_member_id)  AS issupporter     
0115                 FROM comments 
0116                 STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id 
0117                 WHERE comment_active = :status_active AND comment_type = :type_id AND comment_target_id = :project_id AND comment_parent_id <> 0 
0118                 ORDER BY comment_created_at, comment_id
0119                 ";
0120         $rowset2 = $this->_dataTable->getAdapter()->fetchAll($sql, array(
0121                 'status_active' => 1,
0122                 'type_id'       => Application_Model_DbTable_Comments::COMMENT_TYPE_PRODUCT,
0123                 'project_id'    => $project_id
0124             ))
0125         ;
0126         $rowset = array_merge($rowset, $rowset2);
0127 
0128         /* create array with comment_id as key */
0129         foreach ($rowset as $item) {
0130             $this->data[$item['comment_id']] = $item;
0131         }
0132         /* create an array with all parent_id's and their immediate children */
0133         foreach ($rowset as $item) {
0134             $this->index[$item['comment_parent_id']][] = $item['comment_id'];
0135         }
0136         /* create the final sorted array */
0137         $list = array();
0138         $this->sort_child_nodes(0, 1, $list);
0139 
0140         return new Zend_Paginator(new Zend_Paginator_Adapter_Array($list));
0141     }
0142 
0143     /**
0144      * @param int  $parent_id
0145      * @param int  $level
0146      * @param null $result
0147      *
0148      * @return array|null
0149      */
0150     function sort_child_nodes($parent_id, $level, &$result = null)
0151     {
0152         // array(array('comment' => $rootElement, 'level' => 1));
0153         $parent_id = $parent_id === null ? "NULL" : $parent_id;
0154         if (isset($this->index[$parent_id])) {
0155             foreach ($this->index[$parent_id] as $id) {
0156                 $result[] = array('comment' => $this->data[$id], 'level' => $level);
0157                 $this->sort_child_nodes($id, $level + 1, $result);
0158             }
0159         }
0160     }
0161 
0162     /**
0163      * @param int $project_id
0164      *
0165      * @return Zend_Paginator
0166      */
0167     public function getAllCommentsForProject($project_id)
0168     {
0169         $rootElements = $this->getRootCommentsForProjectNew($project_id);
0170         $returnValue = array();
0171         foreach ($rootElements as $rootElement) {
0172             $resultElement = array(array('comment' => $rootElement, 'level' => 1));
0173             $childs = $this->getAllChildComments($resultElement);
0174             if (0 == count($childs)) {
0175                 $returnValue = array_merge($returnValue, $resultElement);
0176             } else {
0177                 $returnValue = array_merge($returnValue, $childs);
0178             }
0179         }
0180 
0181         return new Zend_Paginator(new Zend_Paginator_Adapter_Array($returnValue));
0182     }
0183 
0184     /**
0185      * @param int $_projectId
0186      *
0187      * @return array
0188      */
0189     public function getRootCommentsForProject($_projectId)
0190     {
0191         $sql = '
0192                 SELECT *
0193                     FROM comments
0194                     STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id
0195                     JOIN project_rating ON project_rating.comment_id = comments.comment_id
0196                     WHERE comment_target_id = :project_id
0197                       AND comment_parent_id = 0
0198                       AND comment_type = :type_id
0199                       AND comment_active = :status
0200                     ORDER BY comments.comment_created_at DESC, comment_parent_id
0201         ';
0202 
0203         $rowset = $this->_dataTable->getAdapter()->fetchAll($sql, array(
0204                 'project_id' => $_projectId,
0205                 'status'     => Application_Model_DbTable_Comments::COMMENT_ACTIVE,
0206                 'type_id'    => Application_Model_DbTable_Comments::COMMENT_TYPE_PRODUCT
0207             ))
0208         ;
0209         if (0 == count($rowset)) {
0210             return array();
0211         }
0212 
0213         return $rowset;
0214     }
0215     
0216     
0217     /**
0218      * @param int $_projectId
0219      *
0220      * @return array
0221      */
0222     public function getRootCommentsForProjectNew($_projectId)
0223     {
0224         $sql = "
0225                 SELECT 
0226                     case when r.rating_id IS NOT NULL then 
0227                             case 
0228                                     when r.score = 1 then 'ugh'
0229                                     when r.score = 2 then 'really bad'
0230                                     when r.score = 3 then 'bad'
0231                                     when r.score = 4 then 'soso'
0232                                     when r.score = 5 then 'average'
0233                                     when r.score = 6 then 'okay'
0234                                     when r.score = 7 then 'good'
0235                                     when r.score = 8 then 'great'
0236                                     when r.score = 9 then 'excellent'
0237                                     when r.score = 10 then 'the best'
0238                             end
0239                     ELSE '' END AS comment_subject
0240                     ,case 
0241                             when r.rating_id IS NOT NULL then 
0242                                     REPLACE(
0243                                             REPLACE(REPLACE(REPLACE(c.comment_text,CONCAT(r.score,' '),''),'+',''),'-','')
0244                                             ,case 
0245                                                     when r.score = 1 then 'ugh'
0246                                                     when r.score = 2 then 'really bad'
0247                                                     when r.score = 3 then 'bad'
0248                                                     when r.score = 4 then 'soso'
0249                                                     when r.score = 5 then 'average'
0250                                                     when r.score = 6 then 'okay'
0251                                                     when r.score = 7 then 'good'
0252                                                     when r.score = 8 then 'great'
0253                                                     when r.score = 9 then 'excellent'
0254                                                     when r.score = 10 then 'the best'
0255                                             END
0256                                             ,''
0257                                     )
0258                             ELSE c.comment_text
0259                     END AS comment_text_trim
0260                     ,case when r.score IS NOT NULL then (r.score*10) ELSE 0 END AS comment_score
0261                     ,c.comment_id, member.username,c.comment_created_at
0262                     FROM comments c
0263                     STRAIGHT_JOIN member ON c.comment_member_id = member.member_id
0264                     LEFT JOIN project_rating r ON r.comment_id = c.comment_id AND r.rating_active = 1
0265                     WHERE comment_target_id = :project_id
0266                     AND comment_parent_id = 0
0267                     AND comment_type = :type_id
0268                     AND comment_active = :status
0269                     ORDER BY comment_created_at DESC, comment_parent_id
0270         ";
0271 
0272         $rowset = $this->_dataTable->getAdapter()->fetchAll($sql, array(
0273                 'project_id' => $_projectId,
0274                 'status'     => Application_Model_DbTable_Comments::COMMENT_ACTIVE,
0275                 'type_id'    => Application_Model_DbTable_Comments::COMMENT_TYPE_PRODUCT
0276             ))
0277         ;
0278         if (0 == count($rowset)) {
0279             return array();
0280         }
0281 
0282         return $rowset;
0283     }
0284 
0285     /**
0286      * @param array $element
0287      *
0288      * @return array
0289      */
0290     private function getAllChildComments($element)
0291     {
0292         $returnValue = array();
0293         $level = $element[0]['level'] + 1;
0294         $childs = $this->getChildCommentsForIdNew($element[0]['comment']['comment_id']);
0295         if (0 == count($childs)) {
0296             return null;
0297         }
0298         foreach ($childs as $child) {
0299             $resultElement = array(array('comment' => $child, 'level' => $level));
0300             $subChilds = $this->getAllChildComments($resultElement);
0301             if (0 == count($subChilds)) {
0302                 $returnValue = array_merge($returnValue, $resultElement);
0303             } else {
0304                 $returnValue = array_merge($returnValue, $subChilds);
0305             }
0306         }
0307 
0308         return array_merge($element, $returnValue);
0309     }
0310 
0311     /**
0312      * @param int $parent_id
0313      *
0314      * @return array
0315      */
0316     public function getChildCommentsForId($parent_id)
0317     {
0318         $sql = "SELECT *
0319                     FROM comments
0320                     STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id
0321                     WHERE comment_parent_id = :parent_id
0322                     AND comment_active = :status
0323                     ORDER BY comments.comment_created_at, comments.comment_id
0324                ";
0325         $rowset = $this->_dataTable->getAdapter()->fetchAll($sql,
0326             array('parent_id' => $parent_id, 'status' => Application_Model_DbTable_Comments::COMMENT_ACTIVE))
0327         ;
0328         if (0 == count($rowset)) {
0329             return array();
0330         }
0331 
0332         return $rowset;
0333     }
0334     
0335     /**
0336      * @param int $parent_id
0337      *
0338      * @return array
0339      */
0340     public function getChildCommentsForIdNew($parent_id)
0341     {
0342         $sql = "SELECT '' AS comment_subject,comments.comment_text AS comment_text_trim, 0 as comment_score, comments.*, member.*
0343                     FROM comments
0344                     STRAIGHT_JOIN member ON comments.comment_member_id = member.member_id
0345                     WHERE comment_parent_id = :parent_id
0346                     AND comment_active = :status
0347                     ORDER BY comments.comment_created_at, comments.comment_id
0348                ";
0349         $rowset = $this->_dataTable->getAdapter()->fetchAll($sql,
0350             array('parent_id' => $parent_id, 'status' => Application_Model_DbTable_Comments::COMMENT_ACTIVE))
0351         ;
0352         if (0 == count($rowset)) {
0353             return array();
0354         }
0355 
0356         return $rowset;
0357     }
0358 
0359     /**
0360      * @param array $data
0361      *
0362      * @return Zend_Db_Table_Row_Abstract
0363      * @throws Exception
0364      */
0365     public function save($data)
0366     {
0367         $writer = new Application_Model_DbTable_Comments(array('db' => 'db2'));
0368         return $writer->save($data);
0369     }
0370 
0371     public function setAllCommentsForUserDeleted($member_id)
0372     {
0373         $sql = '
0374                 UPDATE comments
0375                 SET comment_active = 0
0376                 WHERE comment_member_id = :member_id';
0377         $this->_dataTable->getAdapter()->query($sql, array('member_id' => $member_id))->execute();
0378     }
0379 
0380     public function setAllCommentsForUserActivated($member_id)
0381     {
0382         $sql = '
0383                 UPDATE comments
0384                 SET comment_active = 1
0385                 WHERE comment_member_id = :member_id';
0386         $this->_dataTable->getAdapter()->query($sql, array('member_id' => $member_id))->execute();
0387     }
0388 
0389     public function setAllCommentsForProjectDeleted($project_id)
0390     {
0391         $sql = '
0392                 UPDATE comments
0393                 SET comment_active = 0
0394                 WHERE comment_target_id = :projectId';
0395         $this->_dataTable->getAdapter()->query($sql, array('projectId' => $project_id))->execute();
0396     }
0397 
0398     public function setAllCommentsForProjectActivated($project_id)
0399     {
0400         $sql = '
0401                 UPDATE comments
0402                 SET comment_active = 1
0403                 WHERE comment_target_id = :projectId';
0404         $this->_dataTable->getAdapter()->query($sql, array('projectId' => $project_id))->execute();
0405     }
0406 
0407     public function getCommentsHierarchic($project_id)
0408     {
0409         $rootElements = $this->getRootCommentsForProjectNew($project_id);
0410         $returnValue = array();
0411         foreach ($rootElements as $parentComment) {
0412             $childs = $this->getChildCommentsHierarchic($parentComment);
0413             if (0 == count($childs)) {
0414                 $parentComment['childcount'] = 0;
0415             } else {
0416                 $parentComment['childcount'] = count($childs);
0417                 $parentComment['children'] = $childs;
0418             }
0419             $returnValue[] = $parentComment;
0420         }
0421 
0422         return new Zend_Paginator(new Zend_Paginator_Adapter_Array($returnValue));
0423     }
0424 
0425     protected function getChildCommentsHierarchic($parentComment)
0426     {
0427         $childs = $this->getChildCommentsForIdNew($parentComment['comment_id']);
0428         if (0 == count($childs)) {
0429             return array();
0430         }
0431         $returnValue = array();
0432         foreach ($childs as $child) {
0433             $subChilds = $this->getChildCommentsHierarchic($child);
0434             if (0 == count($subChilds)) {
0435                 $child['childcount'] = 0;
0436             } else {
0437                 $child['childcount'] = count($subChilds);
0438                 $child['children'] = $subChilds;
0439             }
0440             $returnValue[] = $child;
0441         }
0442 
0443         return $returnValue;
0444     }
0445 
0446     
0447     public function deactiveComment($comment_id){
0448         $sql = '
0449                 UPDATE comments
0450                 SET comment_active = 0
0451                 WHERE comment_id = :comment_id';
0452         $writer = new Application_Model_DbTable_Comments(array('db' => 'db2'));
0453         $writer->getAdapter()->query($sql, array('comment_id' => $comment_id))->execute();        
0454     }
0455 }