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

Revision 6528, 11.9 KB checked in by gustavo, 12 years ago (diff)

Ticket #2766 - Merge do branch das novas funcionalidaes para o trunk

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