source: OWR/Model/Users.php @ 6f7b2e

Revision 6f7b2e, 15.7 KB checked in by pierre-alain <pierre-alain@…>, 3 years ago (diff)

adding stat on dead/unavailable streams

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Model for 'users' object
4 *
5 * PHP 5
6 *
7 * OWR - OpenWebReader
8 *
9 * Copyright (c) 2009, Pierre-Alain Mignot
10 *
11 * Home page: http://openwebreader.org
12 *
13 * E-Mail: contact@openwebreader.org
14 *
15 * All Rights Reserved
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 *
31 * @author Pierre-Alain Mignot <contact@openwebreader.org>
32 * @copyright Copyright (c) 2009, Pierre-Alain Mignot
33 * @license http://www.gnu.org/copyleft/gpl.html
34 * @package OWR
35 * @subpackage Model
36 */
37namespace OWR\Model;
38use OWR\Model,
39    OWR\Request,
40    OWR\Exception,
41    OWR\DAO,
42    OWR\User,
43    OWR\DB\Request as DBRequest,
44    OWR\Object;
45/**
46 * This class is used to add/edit/delete users and his related tables ()
47 * @package OWR
48 * @uses OWR\Model extends the base class
49 * @uses OWR\Request the request
50 * @uses OWR\Exception the exception handler
51 * @uses OWR\DAO the DAO
52 * @uses OWR\User the user
53 * @uses OWR\DB\Request a request sent to DB
54 * @uses OWR\Object transforms an object to an array
55 * @subpackage Model
56 */
57class Users extends Model
58{
59    /**
60     * Adds/Edits a user
61     *
62     * @access public
63     * @param mixed $request the Request instance
64     * @return $this
65     */
66    public function edit(Request $request)
67    {
68        $query = '
69    SELECT COUNT(id) AS nb
70        FROM users';
71        $exists = $this->_db->getOne($query);
72
73        if($exists->next() && $exists->nb && ($request->id !== User::iGet()->getUid() && !User::iGet()->isAdmin()))
74        {
75            $request->setResponse(new Response(array(
76                'do'        => 'redirect',
77                'location'  => 'login',
78                'status'    => Exception::E_OWR_UNAUTHORIZED
79            )));
80            return $this;
81        }
82
83        $nb = $exists->nb;
84
85        $datas = array('id'=>$request->id);
86
87        if(empty($_POST))
88        {
89            $request->setResponse(new Response(array(
90                'tpl'       => 'user',
91                'datas'     => $datas
92            )));
93            return $this;
94        }
95
96        if(!User::iGet()->checkToken())
97        {
98            $request->setResponse(new Response(array(
99                'do'        => 'redirect',
100                'location'  => 'logout',
101                'status'    => Exception::E_OWR_UNAUTHORIZED
102            )));
103            return $this;
104        }
105
106        if(empty($request->login) || (!$request->id && empty($request->passwd)) || empty($request->email))
107        {
108            $request->setResponse(new Response(array(
109                'do'        => 'error',
110                'tpl'       => 'user',
111                'error'     => 'Please fill all the fields.',
112                'datas'     => $datas,
113                'status'    => Exception::E_OWR_BAD_REQUEST
114            )));
115            return $this;
116        }
117
118        if(mb_strlen($request->login, 'UTF-8') > 55)
119        {
120            $request->setResponse(new Response(array(
121                'do'        => 'error',
122                'tpl'       => 'user',
123                'error'     => 'Login too long, please limit it to 55 chars.',
124                'datas'     => $datas,
125                'status'    => Exception::E_OWR_BAD_REQUEST
126            )));
127            return $this;
128        }
129
130        if((empty($request->id) && (empty($request->passwd) ||
131            empty($request->confirmpasswd) || $request->passwd !== $request->confirmpasswd))
132            || (0 < $request->id && !empty($request->passwd) && !empty($request->confirmpasswd)
133                && $request->passwd !== $request->confirmpasswd))
134        {
135            $request->setResponse(new Response(array(
136                'do'        => 'error',
137                'tpl'       => 'user',
138                'error'     => 'Passwords are not identiquals.',
139                'datas'     => $datas,
140                'status'    => Exception::E_OWR_BAD_REQUEST
141            )));
142            return $this;
143        }
144
145        if(!empty($nb))
146        {
147            $args = array($request->login);
148            $query = '
149    SELECT id
150        FROM users
151        WHERE (login=?)';
152
153            if(!empty($request->id))
154            {
155                $query .= ' AND id != '. (int) $request->id;
156            }
157
158            $exists = $this->_db->getOneP($query, new DBRequest($args));
159            unset($args);
160            if($exists->count())
161            {
162                $request->setResponse(new Response(array(
163                    'do'        => 'error',
164                    'tpl'       => 'user',
165                    'datas'     => $datas,
166                    'error'     => 'Login already used. Please choose another.',
167                    'status'    => 409 // conflict
168                )));
169                return $this;
170            }
171
172            $request->rights = (int) $request->rights;
173
174            if($request->rights > User::iGet()->getRights() || $request->rights > User::LEVEL_ADMIN)
175            {
176                $request->setResponse(new Response(array(
177                    'do'        => 'error',
178                    'tpl'       => 'user',
179                    'datas'     => $datas,
180                    'error'     => 'You can\'t create user with rights higher than yours.',
181                    'status'    => Exception::E_OWR_BAD_REQUEST
182                )));
183                return $this;
184            }
185        }
186        else
187        { // first registered user = admin
188            $request->rights = User::LEVEL_ADMIN;
189        }
190
191        $request->timezone = User::iGet()->getTimeZones($request->timezone);
192        $request->ulang = User::iGet()->getLang($request->ulang);
193
194        // TODO : check this dynamicly
195        $cfg = Object::toArray($request->config);
196        $cfg['nbnews'] = (int) (isset($cfg['nbnews']) && $cfg['nbnews'] > 0 && $cfg['nbnews'] <= 50 && !($cfg['nbnews']%10) ? $cfg['nbnews'] : 10);
197        $cfg['blockimg'] = (bool) (isset($cfg['blockimg']) ? $cfg['blockimg'] : false);
198        $cfg['abstract'] = (bool) (isset($cfg['abstract']) ? $cfg['abstract'] : false);
199
200        if(!empty($request->passwd) && !empty($request->confirmpasswd))
201        {
202            $args = array(
203                'login'     => $request->login,
204                'passwd'    => md5($request->login.$request->passwd),
205                'rights'    => $request->rights,
206                'lang'      => $request->ulang,
207                'email'     => $request->email,
208                'timezone'  => $request->timezone,
209                'id'        => $request->id,
210                'config'    => $cfg
211            );
212        }
213        else
214        {
215            $args = array(
216                'login'     => $request->login,
217                'rights'    => $request->rights,
218                'lang'      => $request->ulang,
219                'email'     => $request->email,
220                'timezone'  => $request->timezone,
221                'id'        => $request->id,
222                'config'    => $cfg
223            );
224        }
225
226        unset($request->passwd, $request->confirmpasswd, $cfg); // remove from memory !
227
228        if($request->id)
229        {
230            $user = $this->_dao->get($request->id);
231            if(!$user)
232            {
233                $request->setResponse(new Response(array(
234                    'do'        => 'error',
235                    'error'     => 'Invalid id',
236                    'status'    => Exception::E_OWR_BAD_REQUEST
237                )));
238                return $this;
239            }
240            $request->new = false;
241        }
242        else
243        {
244            $user = $this->_dao;
245            $request->new = true;
246        }
247
248        $user->populate($args);
249        unset($args);
250
251        $this->_db->beginTransaction();
252        try
253        {
254            $request->id = $user->save($request->new);
255
256            if(empty($nb) || (!$request->new && (int)$request->id === (int)User::iGet()->getUid()))
257            {
258                if(!User::iGet()->auth($user->login, $user->passwd))
259                { // ???
260                    unset($user);
261                    $request->setResponse(new Response(array(
262                        'do'        => 'error',
263                        'error'     => 'Internal error',
264                        'status'    => Exception::E_OWR_DIE
265                    )));
266                    return $this;
267                }
268            }
269        }
270        catch(Exception $e)
271        {
272            $request->setResponse(new Response(array(
273                'do'        => 'error',
274                'tpl'       => 'user',
275                'datas'     => $datas,
276                'error'     => $e->getContent(),
277                'status'    => Exception::E_OWR_BAD_REQUEST
278            )));
279            return $this;
280        }
281        $this->_db->commit();
282
283        unset($user);
284
285        $request->setResponse(new Response(array(
286            'do'        => 'redirect',
287            'status'    => $request->new ? 201 : 200, // 201 on creation
288            'datas'     => array('id' => $request->id)
289        )));
290
291        return $this;
292    }
293
294    /**
295     * Deletes a user
296     *
297     * @access public
298     * @param mixed $request the Request instance
299     * @return $this
300     */
301    public function delete(Request $request)
302    {
303        if(empty($request->id))
304        {
305            $request->setResponse(new Response(array(
306                'do'        => 'error',
307                'error'     => 'Missing id',
308                'status'    => Exception::E_OWR_BAD_REQUEST
309            )));
310            return $this;
311        }
312
313        $type = DAO::getType($request->id);
314        if('users' !== $type)
315        {
316            $request->setResponse(new Response(array(
317                'do'        => 'error',
318                'error'     => 'Invalid id',
319                'status'    => Exception::E_OWR_BAD_REQUEST
320            )));
321            return $this;
322        }
323
324
325        $this->_db->beginTransaction();
326        try
327        {
328            DAO::getCachedDAO('objects')->delete($request->id);
329        }
330        catch(Exception $e)
331        {
332            $this->_db->rollback();
333            throw new Exception($e->getContent(), $e->getCode());
334        }
335        $this->_db->commit();
336
337
338        if($request->id === User::iGet()->getUid())
339        {
340            $request->setResponse(new Response(array(
341                'do'        => 'redirect',
342                'location'  => 'logout'
343            )));
344        }
345        else
346        {
347            $request->setResponse(new Response);
348        }
349
350        return $this;
351    }
352
353    /**
354     * Gets datas to render a user
355     *
356     * @access public
357     * @author Pierre-Alain Mignot <contact@openwebreader.org>
358     * @param mixed $request the Request instance
359     * @param array $args additional arguments, optionnal
360     * @param string $order the order clause
361     * @param string $groupby the groupby clause
362     * @param string $limit the limit clause
363     * @return $this
364     */
365    public function view(Request $request, array $args = array(), $order = '', $groupby = '', $limit = '')
366    {
367        $args['FETCH_TYPE'] = 'assoc';
368
369        if(!empty($request->ids))
370        {
371            $args['id'] = $request->ids;
372            $limit = count($request->ids);
373        }
374        elseif(!empty($request->id))
375        {
376            $args['id'] = $request->id;
377            $limit = 1;
378        }
379
380        $datas = $this->_dao->get($args, 'id,login,rights,lang,email,timezone,config', $order, $groupby, $limit);
381        if(empty($datas))
382        {
383            $request->setResponse(new Response(array(
384                'status'    => 204
385            )));
386            return $this;
387        }
388
389        $multiple = !isset($datas['id']);
390
391        if($multiple)
392        {
393            foreach($datas as $row)
394            {
395                $row['config'] = @unserialize($row['config']);
396            }
397        }
398        else $datas['config'] = @unserialize($datas['config']);
399
400        $request->setResponse(new Response(array(
401            'datas'        => $datas,
402            'multiple'     => $multiple
403        )));
404        return $this;
405    }
406
407    /**
408     * Deletes everything related to a user
409     *
410     * @access public
411     * @param mixed $request the Request instance
412     * @return $this
413     */
414    public function deleteRelated(Request $request)
415    {
416        $this->_db->beginTransaction();
417        try
418        {
419            DAO::getCachedDAO('streams_groups')->delete();
420            DAO::getCachedDAO('news_relations')->delete();
421            DAO::getCachedDAO('streams_relations')->delete();
422            DAO::getCachedDAO('streams_relations_name')->delete();
423        }
424        catch(Exception $e)
425        {
426            $this->_db->rollback();
427            throw new Exception($e->getContent(), $e->getCode());
428        }
429        $this->_db->commit();
430
431        $request->setResponse(new Response(array(
432            'status'    => 204 // OK, no content to return
433        )));
434
435        return $this;
436    }
437
438    /**
439     * Changes the user interface language
440     *
441     * @author Pierre-Alain Mignot <contact@openwebreader.org>
442     * @access public
443     * @param mixed $request the Request instance
444     * @return $this
445     */
446    public function changeLang(Request $request)
447    {
448        if(empty($request->newlang))
449        {
450            $request->setResponse(new Response(array(
451                'do'        => 'error',
452                'error'     => 'Empty lang',
453                'status'    => Exception::E_OWR_BAD_REQUEST
454            )));
455            return $this;
456        }
457
458        $newLang = (string) User::iGet()->setLang($request->newlang);
459
460        $user = $this->_dao->get(User::iGet()->getUid(), 'id,lang');
461        if(empty($user))
462        {
463            $request->setResponse(new Response(array(
464                'do'        => 'error',
465                'error'     => 'Invalid user id',
466                'status'    => Exception::E_OWR_BAD_REQUEST
467            )));
468        }
469
470        $user->lang = $newLang;
471        $user->save();
472
473        $request->setResponse(new Response);
474
475        return $this;
476    }
477
478    /**
479     * Return some few statistics about current user
480     *
481     * @author Pierre-Alain Mignot <contact@openwebreader.org>
482     * @access public
483     * @param mixed $request the Request instance
484     * @return $this
485     */
486    public function stat(Request $request)
487    {
488        $datas = array();
489        $datas['nbCategories'] = DAO::getCachedDAO('streams_groups')->count()->nb;
490        $datas['nbStreams'] = DAO::getCachedDAO('streams_relations')->count()->nb;
491        $datas['nbDeadStreams'] = $datas['nbStreams'] - DAO::getCachedDAO('streams_relations')->count(array('streams.status' => 0))->nb;
492        $datas['nbNews'] = DAO::getCachedDAO('news_relations')->count()->nb;
493        $datas['nbUnreads'] = DAO::getCachedDAO('news_relations')->count(array('status' => 1))->nb;
494        $datas['nbTags'] = DAO::getCachedDAO('news_tags')->count()->nb;
495
496        if(User::iGet()->isAdmin())
497        {
498            $datas['nbUsers'] = $this->_dao->count()->nb;
499            $datas['nbTotalStreams'] = DAO::getCachedDAO('streams')->count()->nb;
500            $datas['nbTotalNews'] = DAO::getCachedDAO('news')->count()->nb;
501            $datas['nbTotalDeadStreams'] = $datas['nbTotalStreams'] - DAO::getCachedDAO('streams')->count(array('status' => 0))->nb;
502        }
503
504        $request->setResponse(new Response(array(
505            'datas'     => $datas,
506            'tpl'       => 'stats'
507        )));
508
509        return $this;
510    }
511}
Note: See TracBrowser for help on using the repository browser.