source: trunk/prototype/modules/mail/interceptors/Helpers.php @ 6047

Revision 6047, 11.6 KB checked in by adriano, 12 years ago (diff)

Ticket #2633 - impedimento para sinalizacao de mensagem sem Message-Id

RevLine 
[5533]1<?php
2include_once ROOTPATH."/../expressoMail1_2/inc/class.imap_functions.inc.php";
3
4class Helpers {   
5
6/**
[5540]7 * LABEL
[5533]8 */
[5540]9        //labeled:after.find
[5533]10        public function deepnessLabeleds( &$uri , &$result , &$criteria , $original ){               
11
12                if(isset($original['criteria']['deepness']))
13                {
14                        foreach ($result as $i => $v)
15                        {
16                                if(isset($v['labelId']))
17                                {
18                                        $labels = Controller::find( array( 'concept' => 'label' ) , false, array( 'filter' => array('=', 'id'  ,  $v['labelId']) ));     
19                                        $result[$i]['label'] = $labels[0];
20                                }             
21
22                        }
23                }
24
25                return $result;
26        }
27       
28        /**
29         * Método a ser chamado na exclusão de um label, procedendo com a
30         * desvinculação deste label com todas as mensagens a que estava vinculado
31         */
[5540]32        //label:before.delete
[5533]33        public function clearAllLabeledsOfLabel( &$uri , &$result , &$criteria , $original ){
34               
35                $labeleds = Controller::find( array( 'concept' => 'labeled' ) , false, array( 'filter' => array('=', 'labelId'  ,  $uri['id']) ));
36                if (empty($labeleds))
37                        return;
38               
39                $labeledsIds = array();
40                foreach ($labeleds as $e) {
41                                $labeledsIds[] = $e['id'];
42                }
43               
44                Controller::delete( array( 'concept' => 'labeled' ), false, array( 'filter' => array( 'IN', 'id', $labeledsIds )) );
45
46                //return $result;
47        }
48        /**
[5540]49         * Método a ser chamado ao listar os labeleds, uma vez que as funções de IMAP do PHP não são capazes de
[5533]50         * obter a lista de todos os labels e nem são capazes de obter os labels de uma dada mensagem
51         */
[5540]52        //labeled:before.find
[5533]53        public function makeLabelListFilter( &$uri , &$result , &$criteria , $original ){
54
55                if (!isset($criteria['filter']) || !self::in_arrayr('labelId', $criteria['filter'])) {
56                        $labels = Controller::find( array( 'concept' => 'label' ) );
57
58                        $list = array();
59                        foreach ($labels as $label)
60                                $list[] = $label['id'];
61                               
62                        $filter = array( 'IN' , 'labelId' , $list );
63                       
64                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
65                                $criteria['filter'] = array( 'AND', $criteria['filter'], $filter );
66                        else
67                                $criteria['filter'] =  $filter;
68                }
69        }
[5977]70       
[5533]71        public static function in_arrayr($needle, $haystack) {
[5609]72                //if(!is_array($haystack)) return false;
73               
[5533]74                foreach ($haystack as $v) {
75                                if ($needle == $v) return true;
76                                elseif (is_array($v)) return self::in_arrayr($needle, $v);
77                }
78                return false;
79        }
80       
81/**
[5540]82 * FOLLOWUPFLAG
[5533]83 */
[5972]84        //followupflagged:after.find
85        public function deepnessFollowupflaggeds( &$uri , &$result , &$criteria , $original ){               
86
87                if(isset($original['criteria']['deepness']))
88                {
89                        foreach ($result as $i => $v)
90                        {
91                                if(isset($v['followupflagId']))
92                                {
93                                        $followupflags = Controller::find(array('concept' => 'followupflag'), false, array('filter' => array('=', 'id', $v['followupflagId']) ));
94                                       
95                                        /**
96                                         * Devido há inconsistencias na chamada do interceptor addDefaultElementsFilter (followupflag:before.find)
97                                         * os followupflag defaults são inseridos no retorno, por isso é necessário procurar o objeto correto
98                                         * através do id
99                                         */
100                                        foreach ($followupflags as $followupflag) {
101                                                if ($v['followupflagId'] == $followupflag['id']) {
102                                                        $result[$i]['followupflag'] = $followupflag;
103                                                        break;
104                                                }
105                                        }
106                                }
107                               
108                                if(isset($v['messageNumber']) && isset($v['folderName']))
109                                {
110                                        $details = $original['criteria']['deepness'] == '1' ? 'headers' : 'all';
111                                       
112                                        $imapService = new imap_functions();
113                                        $message = $imapService->getMessages(array('messages' => array($v['folderName'] => array($v['messageNumber'])), 'details' => $details));
114                                        $result[$i]['message'] = $message[$v['folderName']][0];                         
115                                }     
116                        }
117                }
118
119                return $result;
120        }       
121       
122        //followupflagged:PostgreSQL.before.create
123        public function letFollowupflaggedKeepUnique (&$uri , &$params , &$criteria , $original ){
124
125                if (isset($params['folderName']) && isset($params['messageNumber'])) {
126                        $filter = array ('AND', array('=', 'folderName', $params['folderName']), array('=', 'messageNumber', $params['messageNumber']));
127
128                        $imap_result = Controller::find(
[5977]129                                array('concept' => 'message'),
[5972]130                                array('messageId'),
131                                array('filter' => $filter)
132                        );
[5977]133
[5972]134                        if($imap_result) {
[5989]135                                $params['messageId'] = $imap_result[0]['messageId'];
[5972]136                        }
137                }
138
139                $filter = array('=', 'messageId', $params['messageId']);
[5989]140                Controller::delete(array('concept' => 'followupflagged', 'service' => 'PostgreSQL'), null, array('filter' => $filter));
[5977]141
[5972]142        }
143       
[5961]144        //followupflag:before.find
145        public function addDefaultElementsFilter (&$uri , &$params , &$criteria , $original ){
146                //if (!self::in_arrayr('id', $criteria['filter'])) {
147                        $defaultsFilter = array( 'IN' , 'id' , array('1','2','3','4','5','6') );
[5533]148
[5961]149                        if (isset($criteria['filter']) && $criteria['filter']!=NULL && count($criteria['filter']) != 0)
150                                $criteria['filter'] = array( 'OR', $criteria['filter'], $defaultsFilter );
151                        else
152                                $criteria['filter'] =  $defaultsFilter;
153                //}
154        }
155
[5959]156        //Remove as dependencias de uma followupflag
[6024]157        public function clearAllFlaggedOfFollowupflag( &$uri , &$params , &$criteria , $original ){
[5959]158                //remove apenas se vier o id da Followupflag
[5961]159                if(isset($uri['id'])) {
[6030]160                        $result = Controller::find(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
161                        foreach ($result as $flagged) {
162                                Controller::delete(array('concept' => 'followupflagged', 'id' => $flagged['id']), false, false);
163                        }
164
[5959]165                        Controller::deleteALL(array('concept' => 'followupflagged'), null , array('filter' => array('=' , 'followupflagId' , $uri['id'])));
[5961]166                }
[5611]167        }
[5959]168
[6015]169        //followupflagged:PostgreSQL.after.delete
[5959]170        public function doImapDelete( &$uri , &$params , &$criteria , $original ) {
[5989]171
[5959]172                $imap_uri = $uri;
173                $imap_uri['service'] = 'Imap';
[5989]174               
175                $result = Controller::delete($imap_uri, $params, $criteria);
[6015]176               
[5989]177                return $result;
[5540]178
[5959]179        }
[5989]180       
181        //followupflagged:Imap.before.delete
182        public function getReferenceToImapDelete( &$uri , &$params , &$criteria , $original ) {
[6015]183
[6030]184                if (isset($uri['service']) && $uri['service'] == 'Imap' && $uri['id'] /*&& !$criteria*/) {
[5989]185                        $db_uri = $uri;
186                        $db_uri['service'] = 'PostgreSQL';
[6015]187                        $flagged = Controller::read($db_uri, array('messageId'), false);
[5989]188                        if ($flagged) {
189                                if (!$criteria)
190                                        $criteria = array();
191                                $criteria['filter'] = array('=', 'messageId', $flagged['messageId']);
192                        } else {
193                                return false;
194                        }
195                }
[6015]196
[5989]197        }
[5959]198               
199        //followupflagged:PostgreSQL.before.create
200        public function doImapCreate( &$uri , &$params , &$criteria , $original ) {     
[6047]201       
[5959]202                $imap_uri = $uri;
203                $imap_uri['service'] = 'Imap';
[6047]204               
205                if(empty($params['messageId']))
206                {
207                        throw new Exception('Não foi possível sinalizar a mensagem, por falta de uma referência válida.');
208                }
209               
[5959]210                $params = Controller::create($imap_uri, $params);
211               
212                if (!$params)
213                        return false;   
214        }
215       
216        //followupflagged:PostgreSQL.after.read
217        public function doImapRead( &$uri , &$result , &$criteria , $original ) {
[5989]218                /**
219                 * Se a busca for apenas no banco de dados, pula-se todas as verificações
220                 * deste interceptor.
221                 */
222                if ($original['URI']['service'] == 'PostgreSQL') return $result;
223               
[5965]224                if ($result) {
[5989]225                        $imap_uri = $uri;
226                        $imap_uri['service'] = 'Imap';
227                        $imap_result = Controller::find(
228                                $imap_uri,
[5959]229                                false,
230                                array('filter' => array('=', 'messageId', $result['messageId']))
231                        );
[5540]232                }
[5959]233
[5965]234                /**
235                 * Faz a consistência do banco com o imap
236                 */
[5989]237                if (count($imap_result) < 1) {
238                        $r = Controller::delete($uri, null, $criteria);
[5965]239                        return false;
[5989]240                } else {
241                        $imap_result = $imap_result[0];
[5959]242                }
[5708]243               
[5965]244                /**
245                 * Faz a consistência do banco com o imap
246                 */
[5989]247                if ($imap_result['messageId'] !== $result['messageId']) {
[5965]248                        $n = $imap_result;
249                        $n['followupflagId']  = 1;
250                        $n['backgroundColor'] = '#FF2016';
251                        $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
252                        $result = $imap_result + $n;
253                }
254               
[5959]255                $result = $result + $imap_result;
256               
257                return $result;
[5540]258        }
259       
[5959]260       
[5540]261        /**
262         * Método a ser chamado ao listar os sinalizadores, uma vez que as funções de IMAP do PHP não são capazes de
263         * obter a lista de todos os sinalizadores e nem são capazes de obter os sinalizadores de uma dada mensagem
264         */
265        //followupflagged:PostgreSQL.after.find
266        public function doImapFind( &$uri , &$result , &$criteria , $original ){
267
268                $imap_uri = $uri;
269                $imap_uri['service'] = 'Imap';
[5977]270                $imap_criteria = $original['criteria'];
271               
[6030]272                if (self::in_arrayr('alarmDeadline', $original['criteria']) ||
273                        self::in_arrayr('doneDeadline', $original['criteria']) ||
274                        self::in_arrayr('followupflagId', $original['criteria']))
275                {
[5989]276                        if (empty($result)) return $result;
[5977]277                       
278                        $idList = array();
279                        foreach($result as $r) {
280                                $idList[] = $r['messageId'];
281                        }
282                       
283                        $imap_criteria['filter'] = array('IN', 'messageId', $idList);
284                }
285                $imap_result = Controller::find($imap_uri, false, $imap_criteria);
[5959]286
[5540]287                /**
288                 * Mescla os dados vindos do PostgreSQL com os dados vindos do Imap
289                 */
290                $merge_result = array ();
[5970]291                foreach ($imap_result as $j => $ir) {
[5959]292               
[5965]293                        foreach($result as $k => $r) {
[5977]294                       
[5965]295                                if ($r['messageId'] == $ir['messageId']) {
[6047]296                                        if (!empty($r['messageId']))
297                                                $merge_result[] = $r + $ir;
[5977]298                                       
[5965]299                                        unset($result[$k]);
[5977]300                                        unset($imap_result[$j]);
301                                       
[5959]302                                        break;
[5540]303                                }
304                        }
305                }
[5965]306               
307                /**
308                 * Faz a consistência do banco com o imap
309                 */
[6032]310                 /*
[5965]311                if ($result) {
312                        $idList = array();
[6030]313                        foreach ($result as $ir) {
314                                $idList[] = $ir['messageId'];
[5965]315                        }
[6030]316                        $filter = array('IN', 'messageId', $idList);
[5965]317                        Controller::delete(array('concept' => 'followupflagged'), null , array('filter' => $filter));
318                }
[6032]319                */
[5965]320               
321                /**
322                 * Faz a consistência do banco com o imap
323                 */
324                if ($imap_result) {
325                        foreach ($imap_result as $ir ) {
326                                $n = $ir;
327                                $n['followupflagId']  = 1;
328                                $n['backgroundColor'] = '#FF2016';
329                                $n['id'] = Controller::create(array('concept' => 'followupflagged'), $n);
[5977]330                                $merge_result[] = $n;
[5965]331                        }
332                }
[5977]333
[5540]334                return $merge_result;
335        }
336
[5959]337        //followupflagged:PostgreSQL.before.find
338        public function reFilterFind (&$uri , &$params , &$criteria , $original ){
[5708]339                /**
[6024]340                 * Se o filtro incluir atributos da mensagem que o banco de dados não conhece, 
341                 * deve-se obter os messageId dos itens do resultado e passá-los num novo filtro
[5959]342                 * que o banco conheça
[5708]343                 */
[5959]344                if (self::in_arrayr('messageNumber', $criteria) || self::in_arrayr('folderName', $criteria)) {
345                        $result = Controller::find(array('concept' => 'message'), array('messageId'), array('filter' => $criteria['filter']));
346                        $idList = array();
347                        foreach ($result as $message)
348                                $idList[] = $message['messageId'];
349                               
350                        $filter = array( 'IN' , 'messageId' , $idList );
[5708]351
[5959]352                        $criteria['filter'] =  $filter;
353                }       
354        }       
[6024]355
[5983]356        //label:before.create
[6013]357        public function verifyNameLabel(&$uri , &$params , &$criteria , $original){
[6024]358
[5983]359                        if( !!Controller::find( array('concept' => 'label'), false, array('filter' => array('i=', 'name', $params['name'])) ) )
360                        {
[6013]361                                throw new Exception('#LabelNameError');
[6024]362                        }
[6013]363        }
[5983]364
[6024]365        //label:before.create
366        public function validateNumberSlots(&$uri , &$params , &$criteria , $original){
367       
[5983]368                        $used = Controller::read( array( 'concept' => 'label', 'id' => '1' ), array( 'id' ), array( 'uid' => Config::me('uidNumber') ) );
369
370                        if( !isset( $used['id'] ) )
371                        {
372                                $params['id'] = '1';
373                                return;
374                        }
375
376                        $slot = Controller::service('PostgreSQL')->execSql( 'SELECT label.slot + 1 as id FROM expressomail_label as label, phpgw_config as config WHERE label.user_id = '.Config::me('uidNumber').' AND config.config_name = \'expressoMail_limit_labels\' AND label.slot <= config.config_value::integer AND ( SELECT count(slot) FROM expressomail_label WHERE slot = label.slot + 1 AND user_id = '.Config::me('uidNumber').' ) = 0 limit 1', true );
377
378                        if( empty( $slot ) )
379                        {
[6013]380                                throw new Exception('#LabelSlotError');
[5983]381                        }
382
383                        $params['id'] = $slot['id'];
384        }
[5533]385}
386
387?>
Note: See TracBrowser for help on using the repository browser.