source: branches/2.4/prototype/modules/mail/interceptors/Helpers.php @ 6630

Revision 6630, 11.9 KB checked in by eduardow, 12 years ago (diff)

Ticket #2884 - Inconsistência ao remover marcadores.

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