source: OWR/Model/News/Tags.php @ f0dadb

Revision f0dadb, 8.7 KB checked in by pierre-alain <pierre-alain@…>, 3 years ago (diff)

adding server side check to prevent marking news as unread when user interface is not up to date

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Model for 'news_tags' 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\News;
38use OWR\Model,
39    OWR\Request,
40    OWR\Exception,
41    OWR\DAO,
42    OWR\Model\Response,
43    OWR\Config;
44/**
45 * This class is used to add/edit/delete tags
46 * @package OWR
47 * @subpackage Model
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 * @subpackage Model
53 */
54class Tags extends Model
55{
56    /**
57     * Adds/Edits a tag
58     *
59     * @access public
60     * @param mixed $request the Request instance
61     * @return $this
62     */
63    public function edit(Request $request)
64    {
65        if(empty($request->name))
66        {
67            $request->setResponse(new Response(array(
68                'do'        => 'error',
69                'error'     => 'Missing name',
70                'status'    => Exception::E_OWR_BAD_REQUEST
71            )));
72
73            return $this;
74        }
75
76        if(empty($request->id))
77        {
78            $tag = $this->_dao->get(array('name' => $request->name), 'id');
79            if(empty($tag))
80            {
81                $request->new = true;
82                $tag = DAO::getDAO('news_tags');
83            }
84        }
85        else
86        {
87            $tag = $this->_dao->get($request->id, 'id'); // check
88            if(empty($tag))
89            {
90                $request->setResponse(new Response(array(
91                    'do'        => 'error',
92                    'error'     => 'Invalid id',
93                    'status'    => Exception::E_OWR_BAD_REQUEST
94                )));
95                return $this;
96            }
97        }
98
99        $tag->name = $request->name;
100        $request->id = $tag->save();
101        unset($tag);
102
103        $request->setResponse(new Response(array(
104            'status'    => $request->new ? 201 : 200,
105            'datas'     => array('id' => $request->id)
106        )));
107
108        return $this;
109    }
110
111    /**
112     * Deletes a tag and all contained news
113     *
114     * @access public
115     * @param int $id the id of the group to delete
116     * @return $this
117     */
118    public function delete(Request $request)
119    {
120        if(empty($request->id))
121        {
122            $request->setResponse(new Response(array(
123                'do'        => 'error',
124                'error'     => 'Missing id',
125                'status'    => Exception::E_OWR_BAD_REQUEST
126            )));
127            return $this;
128        }
129
130        $type = DAO::getType($request->id);
131        if('news_tags' !== $type)
132        {
133            $request->setResponse(new Response(array(
134                'do'        => 'error',
135                'error'     => 'Invalid id',
136                'status'    => Exception::E_OWR_BAD_REQUEST
137            )));
138            return $this;
139        }
140
141        $this->_db->beginTransaction();
142        try
143        {
144            DAO::getCachedDAO('objects')->delete($request->id);
145        }
146        catch(Exception $e)
147        {
148            $this->_db->rollback();
149            throw new Exception($e->getContent(), $e->getCode());
150        }
151
152        $this->_db->commit();
153
154        $request->setResponse(new Response);
155
156        return $this;
157    }
158
159    /**
160     * Gets datas to render a group
161     *
162     * @access public
163     * @author Pierre-Alain Mignot <contact@openwebreader.org>
164     * @param mixed $request the Request instance
165     * @param array $args additional arguments, optionnal
166     * @param string $order the order clause
167     * @param string $tagby the groupby clause
168     * @param string $limit the limit clause
169     * @return $this
170     */
171    public function view(Request $request, array $args = array(), $order = '', $tagby = '', $limit = '')
172    {
173        $args['FETCH_TYPE'] = 'assoc';
174
175        if(!empty($request->ids))
176        {
177            $args['id'] = $request->ids;
178            $limit = count($request->ids);
179        }
180        elseif(!empty($request->id))
181        {
182            $args['id'] = $request->id;
183            $limit = 1;
184        }
185
186        $datas = $this->_dao->get($args, 'id,name', $order, $tagby, $limit);
187        if(empty($datas))
188        {
189            $request->setResponse(new Response(array(
190                'status'    => 204
191            )));
192            return $this;
193        }
194
195        $this->_setUserTimestamp($datas);
196
197        $request->setResponse(new Response(array(
198            'datas'        => $datas,
199            'multiple'     => !isset($datas['id'])
200        )));
201        return $this;
202    }
203
204    /**
205     * Renames a tag
206     *
207     * @author Pierre-Alain Mignot <contact@openwebreader.org>
208     * @access public
209     * @param mixed $request the Request instance
210     */
211    public function rename(Request $request)
212    {
213        if(empty($request->name))
214        {
215            $request->setResponse(new Response(array(
216                'do'        => 'error',
217                'error'     => 'Missing name',
218                'status'    => Exception::E_OWR_BAD_REQUEST
219            )));
220            return $this;
221        }
222
223        $tag = $this->_dao->get(array('id'=>$request->id), 'id, uid');
224        if(empty($tag))
225        {
226            $request->setResponse(new Response(array(
227                'do'        => 'error',
228                'error'     => 'Invalid id',
229                'status'    => Exception::E_OWR_BAD_REQUEST
230            )));
231            return $this;
232        }
233
234        $tag->name = $request->name;
235        $tag->save();
236
237        $request->setResponse(new Response);
238
239        return $this;
240    }
241
242    /**
243     * Edits tags and news relations
244     *
245     * @author Pierre-Alain Mignot <contact@openwebreader.org>
246     * @access public
247     * @param mixed $request the Request instance
248     */
249    public function editRelations(Request $request)
250    {
251        if(empty($request->ids))
252        {
253            $request->setResponse(new Response(array(
254                'do'        => 'error',
255                'error'     => 'Missing ids of news',
256                'status'    => Exception::E_OWR_BAD_REQUEST
257            )));
258            return $this;
259        }
260
261        $daoRelations = DAO::getCachedDAO('news_relations_tags');
262        $tags = array_filter(array_map('trim', explode(',', $request->name)));
263
264        // reset all tags for the id(s)
265        if(is_array($request->ids))
266        {
267            foreach($request->ids as $id)
268            {
269                $daoRelations->delete(array('newsid' => $id));
270            }
271        }
272        else
273        {
274            $daoRelations->delete(array('newsid' => $request->ids));
275        }
276
277        if(empty($tags))
278        { // ok we are done, no tags to add
279            $request->setResponse(new Response);
280
281            return $this;
282        }
283
284        $ids = array();
285        $dao = DAO::getCachedDAO('news_tags');
286
287        foreach($tags as $tag)
288        {
289            $exists = $this->_dao->get(array('name'=>$tag), 'id');
290            if(!$exists)
291            {
292                $dao->name = $tag;
293                $daoRelations->tid = $dao->save();
294                $ids[] = $daoRelations->tid;
295                $dao->id = null;
296            }
297            else $daoRelations->tid = $exists->id;
298
299            if(is_array($request->ids))
300            {
301                foreach($request->ids as $id)
302                {
303                    $daoRelations->newsid = (int) $id;
304                    $daoRelations->save();
305                }
306            }
307            else
308            {
309                $daoRelations->newsid = (int) $request->ids;
310                $daoRelations->save();
311            }
312        }
313
314        $request->setResponse(new Response(empty($ids) ? array() : array(
315            'datas'     => array('ids' => $ids),
316            'status'    => 201,
317            'tpl'       => 'tag'
318        )));
319
320        return $this;
321    }
322}
Note: See TracBrowser for help on using the repository browser.