Ignore:
Timestamp:
04/17/12 16:09:39 (12 years ago)
Author:
adriano
Message:

Ticket #2633 - alteracoes de backend e interceptadores para a funcionalidade de sinalizadores

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/prototype/modules/mail/interceptors/Helpers.php

    r5909 r5959  
    6969        } 
    7070         
     71        //label:before.create 
     72        public function verifyNameLabel(&$uri , &$params , &$criteria , $original){ 
     73                $nameLabel = $params['name']; 
     74                $Labels = Controller::find(array('concept' => 'label'), false, array('filter' => array('i=', 'name', $nameLabel) )); 
     75                if($Labels){ 
     76                        Throw new Exception('Já existe um marcador com esse nome.'); 
     77                } 
     78        } 
     79                 
    7180        public static function in_arrayr($needle, $haystack) { 
    7281                //if(!is_array($haystack)) return false; 
     
    7887                return false; 
    7988        }  
    80                  
    8189         
    8290/** 
     
    8492 */  
    8593 
    86         //followupflag:before.find 
    87         public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){ 
    88                 //if (!self::in_arrayr('id', $criteria['filter'])) { 
    89                         $defaultsFilter = array( 'IN' , 'id' , array('1','2','3','4','5','6') ); 
    90                          
    91                         if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0) 
    92                                 $criteria['filter'] = array( 'OR', $criteria['filter'], $defaultsFilter ); 
    93                         else 
    94                                 $criteria['filter'] =  $defaultsFilter; 
    95                 //} 
    96         } 
    97          
    98         //followupflagged:after.find 
    99         public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){                 
    100  
    101                 if(isset($original['criteria']['deepness'])) 
    102                 { 
    103                         foreach ($result as $i => $v) 
    104                         { 
    105                                 if(isset($v['followupflagId'])) 
    106                                 { 
    107                                         $followupflags = Controller::find(array('concept' => 'followupflag'), false, array('filter' => array('=', 'id', $v['followupflagId']) )); 
    108                                          
    109                                         /** 
    110                                          * Devido há inconsistencias na chamada do interceptor addDefaultElementsFilter (followupflag:before.find) 
    111                                          * os followupflag defaults são inseridos no retorno, por isso é necessário procurar o objeto correto 
    112                                          * através do id 
    113                                          */ 
    114                                         foreach ($followupflags as $followupflag) { 
    115                                                 if ($v['followupflagId'] == $followupflag['id']) { 
    116                                                         $result[$i]['followupflag'] = $followupflag; 
    117                                                         break; 
    118                                                 } 
    119                                         } 
    120                                 } 
    121                                  
    122                                 if(isset($v['messageNumber']) && isset($v['folderName'])) 
    123                                 { 
    124                                         $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all'; 
    125                                          
    126                                         $imapService = new imap_functions(); 
    127                                         $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details)); 
    128                                         $result[$i]['message'] = $message[$v['folderName']][0];                          
    129                                 }      
    130                         } 
    131                 } 
    132  
     94        //Remove as dependencias de uma followupflag  
     95        public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){ 
     96                //remove apenas se vier o id da Followupflag 
     97                if(isset($uri['id'])) 
     98                        Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id']))); 
     99 
     100        } 
     101 
     102 
     103        //followupflagged:PostgreSQL.before.delete 
     104        public function doImapDelete( &$uri , &$params , &$criteria , $original ) { 
     105         
     106                $imap_uri = $uri; 
     107                $imap_uri['service'] = 'Imap'; 
     108                list($messageId, $uri['id']) = explode('#', $uri['id']); 
     109 
     110                $result = Controller::delete($imap_uri, $params, $imap_criteria); 
     111 
     112                if (!$result) 
     113                        return false; 
     114        } 
     115         
     116 
     117         
     118                 
     119 
     120         
     121         
     122         
     123         
     124         
     125         
     126         
     127         
     128         
     129         
     130         
     131         
     132         
     133         
     134         
     135         
     136         
     137         
     138         
     139         
     140         
     141         
     142        //followupflagged:PostgreSQL.before.create 
     143        public function doImapCreate( &$uri , &$params , &$criteria , $original ) {      
     144                 
     145                $imap_uri = $uri; 
     146                $imap_uri['service'] = 'Imap'; 
     147 
     148                $params = Controller::create($imap_uri, $params); 
     149                 
     150                if (!$params) 
     151                        return false;    
     152        } 
     153         
     154        //followupflagged:PostgreSQL.after.read 
     155        public function doImapRead( &$uri , &$result , &$criteria , $original ) { 
     156 
     157                if ($reusult) { 
     158                        $imap_result = Controller::read( 
     159                                array('concept' => 'followupflagged', 'service' => 'Imap'),  
     160                                false,  
     161                                array('filter' => array('=', 'messageId', $result['messageId'])) 
     162                        ); 
     163                } 
     164 
     165                if (!$imap_result) { 
     166                        /** 
     167                         * TODO - deletar do banco se não existe no imap  
     168                         */ 
     169                         return false; 
     170                } 
     171                 
     172                $result = $result + $imap_result; 
     173                 
    133174                return $result; 
    134         }        
    135          
    136         //followupflagged:PostgreSQL.before.find 
    137         public function clearFilterAtFind( &$uri , &$params , &$criteria , $original ) { 
    138          
    139                 if ($criteria['filter'] &&  
    140                                 (self::in_arrayr('messageNumber', $criteria['filter']) || self::in_arrayr('folderName', $criteria['filter'])) ) { 
    141                         unset($criteria['filter']); 
    142                 } 
    143                  
    144                 /** 
    145                  * TODO - fazer parse do $criteria['filter'] para fazer strip no id composto 
    146                  */ 
    147         } 
     175        } 
     176         
    148177         
    149178        /** 
     
    153182        //followupflagged:PostgreSQL.after.find 
    154183        public function doImapFind( &$uri , &$result , &$criteria , $original ){ 
    155                 /** 
    156                  * TODO - ver implicações de busca com id no filtro  
    157                  */ 
    158  
    159                 if ($result) { 
    160                         $list = array(); 
    161                         foreach ($result as $followupflagged) 
    162                                 $list[] = $followupflagged['id']; 
    163                                  
    164                         $filter = array( 'IN' , 'id' , $list ); 
    165                          
    166                         if (isset($original['criteria']['filter']) && $original['criteria']['filter']!=NULL && count($original['criteria']['filter']) != 0) 
    167                                 $criteria['filter'] = array( 'AND', $original['criteria']['filter'], $filter ); 
    168                         else 
    169                                 $criteria['filter'] =  $filter; 
    170                 } 
    171                  
     184 
    172185                $imap_uri = $uri; 
    173186                $imap_uri['service'] = 'Imap'; 
    174                 $imap_result = Controller::find($imap_uri, $result, $criteria); 
    175                  
     187                $imap_result = Controller::find($imap_uri, false, $original['criteria']); 
     188 
    176189                /** 
    177190                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap 
     
    179192                $merge_result = array (); 
    180193                foreach ($imap_result as $ir) { 
    181                         list($messageId, $flagId) = explode('#', $ir['id']); 
    182                          
     194                 
    183195                        foreach($result as $r) { 
    184                                 if ($r['id'] == $flagId) { 
    185                                         $r['id'] = $ir['id']; 
    186                                         $r['messageNumber'] = $ir['messageNumber']; 
    187                                         $r['folderName'] = $ir['folderName']; 
    188                                          
    189                                         $merge_result[] = $r; 
     196                                if ($r['messageId'] == $ir['messageId']) {                       
     197                                        $merge_result[] = $r + $ir; 
     198                                        break; 
    190199                                } 
    191200                        } 
     
    195204        } 
    196205 
    197         //followupflagged:Imap.before.create 
    198         public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){ 
    199  
    200                 if (isset($params['folderName']) && isset($params['messageNumber'])) { 
    201                         $filter = array ('AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber'])); 
    202                         $toClearURI = array('concept' => 'followupflagged', 'service' => 'Imap'); 
    203  
    204                         //Obtém do banco um possível sinalizador existente 
    205                         $imap_result = Controller::find($toClearURI, false, array('filter' => $filter)); 
    206                          
    207                         //Se existe um sinalizador nesta mensagem, deleta-o 
    208                         foreach ($imap_result as $r) { 
    209                                 /** 
    210                                  * TODO - deletar sem id 
    211                                  */ 
     206        //followupflagged:PostgreSQL.before.find 
     207        public function reFilterFind (&$uri , &$params , &$criteria , $original ){ 
     208                /** 
     209                 * Se p filtor incluir atributos da mensagem que o banco de dados não conhece,   
     210                 * deve-se obter os messageId dos itens do resultado e passálos num novo filtro 
     211                 * que o banco conheça 
     212                 */ 
     213                if (self::in_arrayr('messageNumber', $criteria) || self::in_arrayr('folderName', $criteria)) { 
     214                        $result = Controller::find(array('concept' => 'message'), array('messageId'), array('filter' => $criteria['filter'])); 
     215                        $idList = array(); 
     216                        foreach ($result as $message) 
     217                                $idList[] = $message['messageId']; 
    212218                                 
    213                                 //deleta no Imap 
    214                                 $toClearURI['id'] = $r['id']; 
    215                                 Controller::delete($toClearURI, false, false); 
    216                                  
    217                                 //deleta no PostgreSQL 
    218                                 list($messageId, $toClearURI['id']) = explode('#', $r['id']); 
    219                                 $toClearURI['service'] = 'PostgreSQL'; 
    220                                 Controller::delete($toClearURI, false, false); 
    221                         } 
    222                 } 
    223  
    224         } 
    225  
    226         //Remove as dependencias de uma followupflag  
    227         public function clearAllFlaggedOfFollowupflag( &$uri , &$result , &$criteria , $original ){ 
    228                 //remove apenas se vier o id da Followupflag 
    229                 if(isset($uri['id'])) 
    230                         Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id']))); 
    231  
    232         } 
    233          
    234  
    235         //followupflagged:PostgreSQL.after.create 
    236         public function doImapCreate( &$uri , &$result , &$criteria , $original ) {      
    237                 /** 
    238                  * Se não consegue salvar no banco, ele retorna objeto válido, porém sem id 
    239                  */ 
    240                 if (!isset($result['id'])) return false; 
    241                  
    242                 $imap_uri = $original['URI'];; 
    243                 $imap_uri['service'] = 'Imap'; 
    244  
    245                 $imap_params = array_merge($original['properties'], $result); 
    246                  
    247                 $result = array(); 
    248                 if ($imap_params['folderName'] && $imap_params['messageNumber'] && $imap_params['id']) { 
    249                         $imap_params['id'] = $imap_params['folderName'] . '/' . $imap_params['messageNumber'] . '#' . $imap_params['id'];  
    250                         $result = Controller::create($imap_uri, $imap_params); 
    251                 } 
    252  
    253                 if (!$result) { 
    254                         //TODO - rollback 
    255                 } 
    256         } 
    257          
    258         //followupflagged:PostgreSQL.after.read 
    259         public function doImapRead( &$uri , &$result , &$criteria , $original ) { 
    260                  
    261                 $imap_uri = $original['URI']; 
    262                 $imap_uri['service'] = 'Imap'; 
    263  
    264                 $imap_result = Controller::read($imap_uri, $params, $imap_criteria); 
    265                  
    266                 if (!$imap_result) 
    267                         return false;            
    268                  
    269                 $result = array_merge($result, $imap_result); 
    270  
    271         } 
    272          
    273         //followupflagged:PostgreSQL.before.<...> 
    274         public function stripURIAttrs( &$uri , &$params , &$criteria , $original ) { 
    275                 list($messageId, $uri['id']) = explode('#', $uri['id']); 
    276                 $params['id'] = $uri['id']; 
    277         } 
    278  
    279         //followupflagged:PostgreSQL.before.delete 
    280         public function doImapDelete( &$uri , &$params , &$criteria , $original ) { 
    281          
    282                 $imap_uri = $uri; 
    283                 $imap_uri['service'] = 'Imap'; 
    284                 list($messageId, $uri['id']) = explode('#', $uri['id']); 
    285  
    286                 $result = Controller::delete($imap_uri, $params, $imap_criteria); 
    287  
    288                 if (!$result) 
    289                         return false; 
    290         } 
    291          
    292         //followupflagged:PostgreSQL.before.update 
    293         public function doImapUpdate( &$uri , &$params , &$criteria , $original ) { 
    294                 /** 
    295                  * Para os conceitos "labeled" e "followupflagged", só faz sentido o update de  
    296                  * atributos gravados no banco de dados e nunca no IMAP. 
    297                  */ 
    298                 //$imap_uri = $uri; 
    299                 //$imap_uri['service'] = 'Imap'; 
    300                 //$result = Controller::update($imap_uri, $params, $criteria); 
    301         } 
    302          
    303                  
    304         //label:before.create 
    305         public function verifyNameLabel(&$uri , &$params , &$criteria , $original){ 
    306                 $nameLabel = $params['name']; 
    307                 $Labels = Controller::find(array('concept' => 'label'), false, array('filter' => array('i=', 'name', $nameLabel) )); 
    308                 if($Labels){ 
    309                         Throw new Exception('Já existe um marcador com esse nome.'); 
    310                 } 
    311         } 
     219                        $filter = array( 'IN' , 'messageId' , $idList ); 
     220 
     221                        $criteria['filter'] =  $filter; 
     222                }        
     223        }        
    312224 
    313225} 
Note: See TracChangeset for help on using the changeset viewer.