source: branches/2.4/prototype/rest/catalog/UserContactsResource.php @ 6819

Revision 6819, 15.5 KB checked in by eduardow, 12 years ago (diff)

Ticket #2963 - Corrigido verificação da preferencia do contato dinamico.

  • Property svn:executable set to *
Line 
1<?php
2
3if (!defined('ROOTPATH'))
4    define('ROOTPATH', dirname(__FILE__) . '/..');
5
6require_once(ROOTPATH . '/rest/hypermedia/hypermedia.php');
7
8use prototype\api\Config as Config;
9
10class UserContactsResource extends Resource {
11
12    /**
13     * Retorna uma lista de grupos
14     *
15     * @license    http://www.gnu.org/copyleft/gpl.html GPL
16     * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
17     * @sponsor    Caixa Econômica Federal
18     * @author     Adrino Coutinho da Silva.
19     * @return     Retorna uma lista de Contatos Dinâmicos, Grupos, Contatos Pessoais, Grupos Compartilhados e Contatos Compartilhados
20     * @access     public
21     * */
22    function get($request) {
23
24        $this->secured();
25
26        //verificar se a preferencia de contatos dinamicos nao esta ativada
27        if(!$this->isEnabledDynamicContacts(Config::me("uidNumber")) ){
28                $response = new Response($request);
29                $this->createException($request, $response, Response::UNAUTHORIZED, 'Resource unauthorized', 'disabled dynamic contacts preference');
30                return $response;
31        }
32
33        $response = new Response($request);
34        $response->addHeader('Content-type', 'aplication/json');
35        $response->code = Response::OK;
36
37        $h = new Hypermedia();
38        $c = new Collection($request->resources, 'UserContactsResource');
39
40        try {
41
42            $d = new Data();
43
44            $d->setName('User Contacts');
45            $d->setValue(null);
46            $d->setPrompt('Contatos do usuário');
47            $d->setDataType(null);
48            $d->setMaxLength(null);
49            $d->setMinLength(null);
50            $d->setRequired(null);
51
52            $c->addData($d);
53
54//Recupera os contatos dinâmicos do usuario
55            $dynamicContacts = Controller::find(
56                            array('concept' => 'dynamicContact'), false, array('filter' => array('=', 'owner', Config::me("uidNumber")),
57                        'order' => array('number_of_messages', 'name', 'mail'),
58                        'orderDesc' => array(true, false, false))
59            );
60
61            if ($dynamicContacts) {
62                foreach ($dynamicContacts as $value) {
63                    $d = new Data();
64                    $i = new Item($request->resources, 'DynamicContactsResource', $value['id']);
65
66                    $d->setName('name');
67                    $d->setValue($value['name']);
68                    $d->setPrompt('Nome do Contato Recente');
69                    $d->setDataType('string');
70                    $d->setMaxLength('100');
71                    $d->setMinLength(null);
72                    $d->setRequired(true);
73
74                    $i->addData($d);
75
76                    $d = new Data();
77                    $d->setName('mail');
78                    $d->setValue($value['mail']);
79                    $d->setPrompt('Email do Contato Recente');
80                    $d->setDataType('string');
81                    $d->setMaxLength('100');
82                    $d->setMinLength(null);
83                    $d->setRequired(true);
84
85                    $i->addData($d);
86
87                    $d = new Data();
88                    $d->setName('number_of_messages');
89                    $d->setValue((int)$value['number_of_messages']);
90                    $d->setPrompt('Quantidade de mensagens enviadas');
91                    $d->setDataType('integer');
92                    $d->setMaxLength('100');
93                    $d->setMinLength(null);
94                    $d->setRequired(false);
95
96                    $i->addData($d);
97
98                    $d = new Data();
99                    $d->setName('id');
100                    $d->setValue($value['id']);
101                    $d->setPrompt('Id do contato dinamico');
102                    $d->setDataType('integer');
103                    $d->setMaxLength('100');
104                    $d->setMinLength(null);
105                    $d->setRequired(false);
106
107                    $i->addData($d);
108
109                    $l = new Link();
110
111                    $l->setHref('');
112                    $l->setRel('delete');
113                    $l->setAlt('Remover');
114                    $l->setPrompt('Remover');
115                    $l->setRender('link');
116
117                    $i->addLink($l);
118
119                    $l = new Link();
120                    $l->setHref('');
121                    $l->setRel('put');
122                    $l->setAlt('Atualizar');
123                    $l->setPrompt('Atualizar');
124                    $l->setRender('link');
125
126                    $i->addLink($l);
127
128                    $l = new Link();
129                    $l->setHref('/dynamiccontact/' . $value['id']);
130                    $l->setRel('get');
131                    $l->setAlt('Buscar');
132                    $l->setPrompt('Buscar');
133                    $l->setRender('link');
134
135                    $i->addLink($l);
136                    $c->addItem($i);
137                }
138            }
139
140            $idS = array(Config::me("uidNumber"));
141            $acl = array();
142
143//Recupera o uidNumber de todos os usuários que compartilham suas agendas com o usuário logado
144            $shareds = Controller::service('PostgreSQL')->execResultSql('select acl_account as "uidNumber", acl_rights as "acl" from phpgw_acl where (acl_location =   \'' . Config::me("uidNumber") . '\' AND acl_appname =  \'contactcenter\' )');
145
146            if (!empty($shareds) && $shareds)
147                foreach ($shareds as $s) {
148                    array_push($idS, $s['uidNumber']);
149                    $acl[$s['uidNumber']] = $this->decodeAcl(decbin($s['acl']));
150                }
151
152            //Recupera os grupos do usuario
153            $groups = Controller::find(array('concept' => 'contactGroup'), false, array('filter' => array('IN', 'user', $idS), 'order' => array('name')));
154
155            if ($groups) {
156                foreach ($groups as $value) {
157                    if (($value['user'] == Config::me("uidNumber")) || ($acl[$value['user']]['read'])) {
158
159                        $i = new Item($request->resources, ($value['user'] == Config::me("uidNumber") ? 'GroupsResource' : 'SharedGroupResource'), $value['id']);
160
161                        $d = new Data();
162                        $d->setName('id');
163                        $d->setValue($value['id']);
164                        $d->setPrompt('Id do Grupo');
165                        $d->setDataType('string');
166                        $d->setMaxLength('100');
167                        $d->setMinLength(null);
168                        $d->setRequired(true);
169                        $i->addData($d);
170
171                        $d = new Data();
172                        $d->setName('owner');
173                        $d->setValue($value['user']);
174                        $d->setPrompt('Id Dono do Grupo');
175                        $d->setDataType('string');
176                        $d->setMaxLength('100');
177                        $d->setMinLength(null);
178                        $d->setRequired(true);
179                        $i->addData($d);
180
181                        $d = new Data();
182                        $d->setName('name');
183                        $d->setValue($value['name']);
184                        $d->setPrompt('Nome do Grupo');
185                        $d->setDataType('string');
186                        $d->setMaxLength('100');
187                        $d->setMinLength(null);
188                        $d->setRequired(true);
189                        $i->addData($d);
190
191                        $d = new Data();
192                        $d->setName('mail');
193                        $d->setValue($value['email']);
194                        $d->setPrompt('Email do Grupo');
195                        $d->setDataType('string');
196                        $d->setMaxLength('100');
197                        $d->setMinLength(null);
198                        $d->setRequired(true);
199                        $i->addData($d);
200
201                        if (Config::me("uidNumber") != $value['user']) {
202                            /* Descomentar ao implementar os métodos
203                              if ($acl[$value['user']]['delete']) {
204                              $l = new Link();
205                              $l->setHref('');
206                              $l->setRel('delete');
207                              $l->setAlt('Remover');
208                              $l->setPrompt('Remover');
209                              $l->setRender('link');
210                              $i->addLink($l);
211                              }
212
213                              if ($acl[$value['user']]['update']) {
214                              $l = new Link();
215                              $l->setHref('');
216                              $l->setRel('put');
217                              $l->setAlt('Atualizar');
218                              $l->setPrompt('Atualizar');
219                              $l->setRender('link');
220                              $i->addLink($l);
221                              }
222
223                              if ($acl[$value['user']]['write']) {
224                              $l = new Link();
225                              $l->setHref('');
226                              $l->setRel('post');
227                              $l->setAlt('Criar');
228                              $l->setPrompt('Criar novo');
229                              $l->setRender('link');
230                              $i->addLink($l);
231                              }
232                             */
233
234                            $l = new Link();
235                            $l->setHref('/sharedgroup/' . $value['id']);
236                            $l->setRel('get');
237                            $l->setAlt('Buscar');
238                            $l->setPrompt('Buscar');
239                            $l->setRender('link');
240                            $i->addLink($l);
241                        } else {
242                            /* Descomentar ao implementar métodos no recurso
243                              $l = new Link();
244                              $l->setHref('');
245                              $l->setRel('delete');
246                              $l->setAlt('Remover');
247                              $l->setPrompt('Remover');
248                              $l->setRender('link');
249                              $i->addLink($l);
250
251                              $l = new Link();
252                              $l->setHref('');
253                              $l->setRel('put');
254                              $l->setAlt('Atualizar');
255                              $l->setPrompt('Atualizar');
256                              $l->setRender('link');
257                              $i->addLink($l);
258                             */
259
260                            $l = new Link();
261                            $l->setHref('/group/' . $value['id']);
262                            $l->setRel('get');
263                            $l->setAlt('Buscar');
264                            $l->setPrompt('Buscar');
265                            $l->setRender('link');
266
267                            $i->addLink($l);
268                        }
269                        $c->addItem($i);
270                    }
271                }
272            }
273
274//Recupera os contatos pessoais do usuario
275            $contacts = Controller::find(array('concept' => 'contact'), false, array('filter' => array('IN', 'user', $idS)));
276
277            if ($contacts) {
278
279                foreach ($contacts as $value) {
280
281                    if (($value['user'] == Config::me("uidNumber")) || ($acl[$value['user']]['read'])) {
282
283                        $d = new Data();
284                        $i = new Item($request->resources, (($value['user'] == Config::me("uidNumber")) ? 'ContactsResource' : 'SharedContactResource'), $value['id']);
285                        $d->setName('id');
286                        $d->setValue($value['id']);
287                        $d->setPrompt('Id do Contato');
288                        $d->setDataType('string');
289                        $d->setMaxLength('100');
290                        $d->setMinLength(null);
291                        $d->setRequired(true);
292
293                        $i->addData($d);
294
295                        $d = new Data();
296                        $d->setName('owner');
297                        $d->setValue($value['user']);
298                        $d->setPrompt('Id Dono do Contato');
299                        $d->setDataType('string');
300                        $d->setMaxLength('100');
301                        $d->setMinLength(null);
302                        $d->setRequired(true);
303
304                        $i->addData($d);
305
306                        $d = new Data();
307                        $d->setName('name');
308                        $d->setValue($value['name']);
309                        $d->setPrompt('Nome do Contato');
310                        $d->setDataType('string');
311                        $d->setMaxLength('100');
312                        $d->setMinLength(null);
313                        $d->setRequired(true);
314
315                        $i->addData($d);
316
317                        $d = new Data();
318                        $d->setName('mail');
319                        $d->setValue(isset($value['email']) ? $value['email'] : null);
320                        $d->setPrompt('Email do Contato');
321                        $d->setDataType('string');
322                        $d->setMaxLength('100');
323                        $d->setMinLength(null);
324                        $d->setRequired(true);
325
326                        $i->addData($d);
327
328                        $d = new Data();
329                        $d->setName('telephone');
330                        $d->setValue(isset($value['telephone']) ? $value['telephone'] : null);
331                        $d->setPrompt('Telefone do Contato');
332                        $d->setDataType('string');
333                        $d->setMaxLength('100');
334                        $d->setMinLength(null);
335                        $d->setRequired(true);
336
337                        $i->addData($d);
338
339                        if (Config::me("uidNumber") != $value['user']) {
340
341                            $l = new Link();
342                            $l->setHref('/sharedcontact/' . $value['id']);
343                            $l->setRel('get');
344                            $l->setAlt('Buscar');
345                            $l->setPrompt('Buscar');
346                            $l->setRender('link');
347                            $i->addLink($l);
348
349                            /* Descomentar ao criar recursos
350                              if ($acl[$value['user']]['delete']) {
351                              $l = new Link();
352                              $l->setHref('');
353                              $l->setRel('delete');
354                              $l->setAlt('Remover');
355                              $l->setPrompt('Remover');
356                              $l->setRender('link');
357                              $i->addLink($l);
358                              }
359
360                              if ($acl[$value['user']]['put']) {
361                              $l = new Link();
362                              $l->setHref('');
363                              $l->setRel('put');
364                              $l->setAlt('Atualizar');
365                              $l->setPrompt('Atualizar');
366                              $l->setRender('link');
367                              $i->addLink($l);
368                              }
369                             */
370                        } else {
371                            /* Descomentar ao criar recursos
372                              $l = new Link();
373
374                              $l->setHref('');
375                              $l->setRel('delete');
376                              $l->setAlt('Remover');
377                              $l->setPrompt('Remover');
378                              $l->setRender('link');
379
380                              $i->addLink($l);
381
382                              $l = new Link();
383                              $l->setHref('');
384                              $l->setRel('put');
385                              $l->setAlt('Atualizar');
386                              $l->setPrompt('Atualizar');
387                              $l->setRender('link');
388
389                              $i->addLink($l);
390                             */
391                            $l = new Link();
392                            $l->setHref('/contact/' . $value['id']);
393                            $l->setRel('get');
394                            $l->setAlt('Buscar');
395                            $l->setPrompt('Buscar');
396                            $l->setRender('link');
397
398                            $i->addLink($l);
399                        }
400                        $c->addItem($i);
401                    }
402                }
403            }
404
405
406            if (!$contacts && !$dynamicContacts && !$groups) {
407                $this->createException($request, $response, Response::NOTFOUND, 'Bad request', 'Resource not found.');
408                return $response;
409            }
410
411
412            $t = new Template();
413
414            $d = new Data();
415
416            $d->setName('id');
417            $d->setValue(null);
418            $d->setPrompt('Id do Grupo');
419            $d->setDataType('string');
420            $d->setMaxLength('100');
421            $d->setMinLength(null);
422            $d->setRequired(true);
423
424            $t->addData($d);
425
426            $d = new Data();
427            $d->setName('user');
428            $d->setValue(null);
429            $d->setPrompt('Id Dono do Grupo');
430            $d->setDataType('string');
431            $d->setMaxLength('100');
432            $d->setMinLength(null);
433            $d->setRequired(true);
434
435            $t->addData($d);
436
437            $d = new Data();
438            $d->setName('name');
439            $d->setValue(null);
440            $d->setPrompt('Nome do Grupo');
441            $d->setDataType('string');
442            $d->setMaxLength('100');
443            $d->setMinLength(null);
444            $d->setRequired(true);
445
446            $t->addData($d);
447            $c->setTemplate($t);
448            $h->setCollection($c);
449
450            $response->body = $h->getHypermedia($request->accept[10][0]);
451            return $response;
452        } catch (Exception $ex) {
453            $this->createException($request, $response, Response::INTERNALSERVERERROR, 'Internal Server Error', $ex);
454            return $response;
455        }
456    }
457
458    function decodeAcl($bin) {
459
460        $acl = array();
461        $bin = str_split($bin);
462        $acl['read'] = (isset($bin[0]) && $bin[0] == 1) ? true : false;
463        $acl['write'] = (isset($bin[1]) && $bin[1] == 1) ? true : false;
464        $acl['update'] = (isset($bin[2]) && $bin[2] == 1) ? true : false;
465        $acl['delete'] = (isset($bin[3]) && $bin[3] == 1) ? true : false;
466
467        return $acl;
468    }
469
470    private function createException($request, &$response, $code, $title, $description) {
471        $response->code = $code;
472
473        $h = new Hypermedia();
474        $c = new Collection($request->resources, 'DynamicContactResource');
475        $e = new Error();
476
477        $e->setCode($code);
478        $e->setTitle($title);
479        $e->setDescription($description);
480
481        $c->setError($e);
482        $h->setCollection($c);
483
484        $response->body = $h->getHypermedia($request->accept[10][0]);
485    }
486
487    private function isEnabledDynamicContacts($user){
488
489                        //recuperando as preferencias (suas preferencias, preferencia padrão, preferencia obrigatoria)
490                        //dos contatos dinamicos
491                $sql = 'SELECT preference_owner, preference_value '.
492                'FROM phpgw_preferences '.
493                'WHERE preference_app = \'expressoMail\' AND '.
494                        'preference_owner in (-1,-2, ' . $user . ')';
495                 
496        $preferences = Controller::service('PostgreSQL')->execResultSql($sql);
497 
498                $array = array();
499        if(count($preferences) > 0){
500                        foreach($preferences as $preference){
501                                //recupera a preferencia
502                $preference_value = unserialize( $preference['preference_value'] );
503                 
504                                //gera um array com o owner e o valor da preferencia:
505                                //true: SIM  (1)
506                                //false: NAO (0)
507                                //null: escolha pelo usuario/ usar padrao / sem padrao
508                                $value = null;
509                                if(isset($preference_value['use_dynamic_contacts'])){
510                                        $value = (isset($preference_value['use_dynamic_contacts'])) ? $preference_value['use_dynamic_contacts'] == '1' : false;
511                                }
512                                $array[ $preference['preference_owner'] ] = $value;
513                        }
514        }
515        //preferencia obrigatoria (SIM)
516        if(array_key_exists(-1,$array) && $array[-1]){
517                return true;
518        }
519        //preferencia do user (SIM)
520        else if(array_key_exists($user,$array) && $array[$user] ){
521                return true;
522        }
523        //preferencia padrao (SIM) escolhida pelo user
524        else if(array_key_exists($user, $array) && $array[$user] === null &&
525                array_key_exists(-2, $array) && $array[-2]){
526                return true;
527        }
528        return false;
529    }
530}
531
532?>
Note: See TracBrowser for help on using the repository browser.