source: OWR/Model/News.php @ 47c42d

Revision 47c42d, 13.8 KB checked in by pierre-alain <pierre-alain@…>, 3 years ago (diff)

adding support for plugin calls

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Model for 'news' 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\Config,
44    OWR\Logs,
45    OWR\Plugins;
46/**
47 * This class is used to add/edit/delete news
48 * @package OWR
49 * @subpackage Model
50 * @uses OWR\Model extends the base class
51 * @uses OWR\Request the request
52 * @uses OWR\Exception the exception handler
53 * @uses OWR\DAO the DAO
54 * @uses OWR\Logs the log object
55 * @uses OWR\Plugins Plugins manager
56 * @subpackage Model
57 */
58class News extends Model
59{
60    /**
61     * Adds/Edits a stream
62     *
63     * @access public
64     * @param mixed $request the Request instance
65     * @return $this
66     */
67    public function edit(Request $request)
68    {
69        Plugins::pretrigger($request);
70
71        $link = $request->item->get('link');
72        $hash = md5($link.$request->streamid);
73        $pubDate = $request->item->get('pubDate');
74
75        $new = $this->_dao->get(array('hash'=>$hash), 'id,pubDate');
76        if(!empty($new))
77        {
78            $r = new Request(array('id'=>$new->id, 'streamid'=>$request->streamid));
79            $this->insertNewsRelations($r);
80            $response = $r->getResponse();
81            if('error' === $response->getNext())
82                Logs::iGet()->log($response->getError(), $response->getStatus());
83            $request->setResponse(new Response);
84            return $this;
85        }
86        else $new = DAO::getDAO('news');
87
88        $new->rssid = $request->streamid;
89        $new->link = $link;
90        $new->hash = $hash;
91        unset($link, $hash);
92        $new->title = $request->item->get('title');
93        $new->contents = serialize($request->item->get());
94        $new->pubDate = $pubDate;
95        $new->author = $request->item->get('author');
96        if(is_array($new->author)) $new->author = join(', ', $new->author);
97
98        unset($request->item, $pubDate); // free memory
99
100        $this->_db->beginTransaction();
101        try
102        {
103            $request->id = $new->save();
104        }
105        catch(Exception $e)
106        {
107            $this->_db->rollback();
108            throw new Exception($e->getContent(), $e->getCode());
109        }
110
111        $contents = DAO::getDAO('news_contents');
112        $contents->id = $request->id;
113        $contents->contents = $new->contents;
114        unset($new);
115
116        try
117        {
118            $contents->save();
119        }
120        catch(Exception $e)
121        {
122            $this->_db->rollback();
123            throw new Exception($e->getContent(), $e->getCode());
124        }
125        $this->_db->commit();
126        unset($contents);
127
128        $this->insertNewsRelations($request);
129        $response = $request->getResponse();
130        if('error' === $response->getNext())
131            Logs::iGet()->log($response->getError(), $response->getStatus());
132
133        Plugins::trigger($request);
134
135        $request->setResponse(new Response);
136
137        Plugins::posttrigger($request);
138
139        return $this;
140    }
141
142    /**
143     * Deletes a new
144     *
145     * @access public
146     * @param mixed $request the Request instance
147     * @return $this
148     */
149    public function delete(Request $request)
150    {
151        Plugins::pretrigger($request);
152
153        if(empty($request->id))
154        {
155            $request->setResponse(new Response(array(
156                'do'        => 'error',
157                'error'     => 'Missing id',
158                'status'    => Exception::E_OWR_BAD_REQUEST
159            )));
160            return $this;
161        }
162
163        $type = DAO::getType($request->id);
164        if('news' !== $type)
165        {
166            $request->setResponse(new Response(array(
167                'do'        => 'error',
168                'error'     => 'Invalid id',
169                'status'    => Exception::E_OWR_BAD_REQUEST
170            )));
171            return $this;
172        }
173
174        $this->_db->beginTransaction();
175        try
176        {
177            DAO::getCachedDAO('news_relations')->delete(array('newsid' => $request->id));
178        }
179        catch(Exception $e)
180        {
181            $this->_db->rollback();
182            throw new Exception($e->getContent(), $e->getCode());
183        }
184        $this->_db->commit();
185
186        Plugins::trigger($request);
187
188        $request->setResponse(new Response);
189
190        Plugins::posttrigger($request);
191
192        return $this;
193    }
194
195    /**
196     * Gets datas to render a new
197     *
198     * @access public
199     * @author Pierre-Alain Mignot <contact@openwebreader.org>
200     * @param mixed $request the Request instance
201     * @param array $args additional arguments, optionnal
202     * @param string $order the order clause
203     * @param string $groupby the groupby clause
204     * @param string $limit the limit clause
205     * @return $this
206     */
207    public function view(Request $request, array $args = array(), $order = '', $groupby = '', $limit = '')
208    {
209        Plugins::pretrigger($request);
210        $args['FETCH_TYPE'] = 'assoc';
211        $multiple = false;
212
213        if(!empty($request->ids))
214        {
215            $args['id'] = $request->ids;
216            $limit = count($request->ids);
217        }
218        elseif(!empty($request->id))
219        {
220            $args['id'] = $request->id;
221            $limit = 1;
222        }
223
224        $datas = $this->_dao->get($args, 'id,rssid AS streamid,news.lastupd,pubDate,author,title,link,gid,status,streams_relations_name.name,streams_groups.name AS gname,favicon', $order, $groupby, $limit);
225        if(empty($datas))
226        {
227            $request->setResponse(new Response(array(
228                'status'    => 204
229            )));
230            return $this;
231        }
232
233        if(!isset($datas['id']))
234        {
235            $multiple = true;
236            $ids = array();
237            foreach($datas as $k => $data)
238            {
239                $ids[] = $data['id'];
240            }
241            $datas['ids'] = $ids;
242
243            if(!isset($request->getContents) || $request->getContents)
244            {   
245                $contents = DAO::getCachedDAO('news_contents')->get(array('id' => $ids), '*', 'FIELD(id,'. join(',', $ids) .')');
246                foreach($contents as $k => $content)
247                {
248                    $datas[$k]['contents'] = unserialize($content->contents);
249                }
250                unset($contents, $content);
251            }
252        }
253        else
254        {
255            if(!isset($request->getContents) || $request->getContents)
256                $datas['contents'] = unserialize(DAO::getCachedDAO('news_contents')->get(array('id' => $datas['id']), 'contents')->contents);
257        }
258        Plugins::trigger($request);
259        $request->setResponse(new Response(array(
260            'datas'        => $datas,
261            'multiple'     => $multiple
262        )));
263        Plugins::posttrigger($request);
264        return $this;
265    }
266
267    /**
268     * Insert the relations between user(s) and a new
269     *
270     * @author Pierre-Alain Mignot <contact@openwebreader.org>
271     * @param mixed $request the Request instance
272     * @return $this
273     * @access public
274     */
275    public function insertNewsRelations(Request $request)
276    {
277        Plugins::pretrigger($request);
278        $id = (int) $request->id;
279        $streamid = (int) $request->streamid;
280
281        if(empty($request->current))
282        { // add a relation for all users
283            $query = '
284    SELECT uid
285        FROM streams_relations
286        WHERE uid NOT IN (
287            SELECT DISTINCT(uid)
288                FROM news_relations
289                WHERE rssid='.$streamid.' AND newsid='.$id.'
290        ) AND rssid='.$streamid;
291            $users = $this->_db->execute($query);
292
293            if($users->count())
294            {
295                $relations = DAO::getDAO('news_relations');
296                $relations->newsid = $id;
297                $relations->rssid = $streamid;
298                while($users->next())
299                {
300                    $relations->uid = $users->uid;
301                    try
302                    {
303                        $relations->save(true);
304                    }
305                    catch(Exception $e)
306                    {
307                        Logs::iGet()->log($e->getContent(), $e->getCode());
308                    }
309                }
310            }
311        }
312        else
313        {
314            $relations = DAO::getDAO('news_relations');
315            $relations->newsid = $id;
316            $relations->rssid = $streamid;
317            try
318            {
319                $relations->save(true);
320            }
321            catch(Exception $e)
322            {
323                Logs::iGet()->log($e->getContent(), $e->getCode());
324            }
325        }
326
327        Plugins::trigger($request);
328
329        $request->setResponse(new Response);
330        Plugins::posttrigger($request);
331        return $this;
332    }
333
334    /**
335     * Update new(s) status (read/unread)
336     *
337     * @author Pierre-Alain Mignot <contact@openwebreader.org>
338     * @param mixed $request the Request instance
339     * @access public
340     * @return $this
341     */
342    public function update(Request $request)
343    {
344        Plugins::pretrigger($request);
345        $status = (int) $request->status;
346
347        if(!empty($request->ids) && is_array($request->ids))
348        {
349            $query = '
350    UPDATE news_relations
351        SET status='.$status.'
352        WHERE uid='.User::iGet()->getUid().' AND status='.(int) !$status.'
353        AND newsid IN ('.join(',', $request->ids).')';
354        }
355        elseif(0 < $request->id)
356        {
357            $table = DAO::getType($request->id);
358
359            if('streams' === $table)
360            {
361//                if($request->timestamp > 0)
362  //              {
363                    $query = '
364    UPDATE news_relations nr
365        JOIN news n ON (nr.newsid=n.id)
366        SET status='.$status.'
367        WHERE uid='.User::iGet()->getUid().' AND status='.(int) !$status.'
368        AND nr.rssid='.$request->id.' AND lastupd < FROM_UNIXTIME('.User::iGet()->getTimestamp($request->id).')';
369    //            }
370     //           else
371      //         {
372        //            $query = '
373//    UPDATE news_relations
374  //      SET status='.$status.'
375    //    WHERE uid='.User::iGet()->getUid().' AND status='.(int) !$status.' AND rssid='.$request->id;
376      //          }
377            }
378            elseif('streams_groups' === $table)
379            {
380//                if($request->timestamp > 0)
381 //               {
382                    $query = '
383    UPDATE news_relations nr
384        JOIN streams_relations rr ON (nr.rssid=rr.rssid)
385        JOIN news n ON (nr.newsid=n.id)
386        SET status='.$status.'
387        WHERE nr.uid='.User::iGet()->getUid().' AND status='.(int) !$status.'
388        AND rr.gid='.$request->id.' AND lastupd < FROM_UNIXTIME('.User::iGet()->getTimestamp($request->id).')';
389/*                }
390                else
391                {
392                    $query = '
393    UPDATE news_relations nr
394        JOIN streams_relations rr ON (nr.rssid=rr.rssid)
395        SET status='.$status.'
396        WHERE nr.uid='.User::iGet()->getUid().' AND status='.(int) !$status.' AND rr.gid='.$request->id;
397                }*/
398            }
399            elseif('news_tags' === $table)
400            {
401  //              if($request->timestamp > 0)
402//                {
403                    $query = '
404    UPDATE news_relations nr
405        JOIN news_relations_tags nrt ON (nrt.newsid=nr.newsid)
406        JOIN news n ON (nr.newsid=n.id)
407        SET status='.$status.'
408        WHERE nr.uid='.User::iGet()->getUid().' AND status='.(int) !$status.'
409        AND nrt.tid='.$request->id.' AND lastupd < FROM_UNIXTIME('.User::iGet()->getTimestamp($request->id).')';
410/*                }
411                else
412                {
413                    $query = '
414    UPDATE news_relations nr
415        JOIN news_relations_tags nrt ON (nrt.newsid=nr.newsid)
416        SET status='.$status.'
417        WHERE nr.uid='.User::iGet()->getUid().' AND status='.(int) !$status.' AND nrt.tid='.$request->id;
418                }*/
419            }
420            elseif('news' === $table)
421            {
422                $query = '
423    UPDATE news_relations
424        SET status='.$status.'
425        WHERE uid='.User::iGet()->getUid().' AND status='.(int) !$status.' AND newsid='.$request->id;
426            }
427            else
428            {
429                $request->setResponse(new Response(array(
430                    'do'        => 'error',
431                    'error'     => 'Invalid id',
432                    'status'    => Exception::E_OWR_BAD_REQUEST
433                )));
434                return $this;
435            }
436        }
437        else
438        {
439            $query = '
440    UPDATE news_relations nr
441        JOIN news n ON (nr.newsid=n.id)
442        SET status='.$status.'
443        WHERE uid='.User::iGet()->getUid().' AND status='.(int) !$status;
444//            if($request->timestamp > 0)
445  //          {
446                $query .= ' AND lastupd < FROM_UNIXTIME('.User::iGet()->getTimestamp().')';
447
448//            }
449        }
450        $this->_db->set($query);
451        Plugins::trigger($request);
452        $request->setResponse(new Response);
453        Plugins::posttrigger($request);
454        return $this;
455    }
456}
Note: See TracBrowser for help on using the repository browser.