Issues (371)

Security Analysis    no vulnerabilities found

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

class/VoteHandler.php (6 issues)

1
<?php declare(strict_types=1);
2
3
namespace XoopsModules\Publisher;
4
5
/*
6
 You may not change or alter any portion of this comment or credits
7
 of supporting developers from this source code or any supporting source code
8
 which is considered copyrighted (c) material of the original comment or credit authors.
9
10
 This program is distributed in the hope that it will be useful,
11
 but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
*/
14
15
/**
16
 * Publisher module for xoops
17
 *
18
 * @copyright      module for xoops
19
 * @license        GPL 3.0 or later
20
 * @since          1.0
21
 * @min_xoops      2.5.10
22
 * @author         XOOPS Development Team
23
 */
24
25
/**
26
 * Class Object VoteHandler
27
 */
28
class VoteHandler extends \XoopsPersistableObjectHandler
29
{
30
    private const TABLE      = 'publisher_rating';
31
    private const ENTITY     = Vote::class;
32
    private const ENTITYNAME = 'Vote';
33
    private const KEYNAME    = 'ratingid';
34
    private const IDENTIFIER = 'itemid';
35
    private const SOURCE     = 'source';
36
    /**
37
     * @var Helper
38
     */
39
    public $helper;
40
41
    /**
42
     * Constructor
43
     * @param \XoopsModules\Publisher\Helper|null $helper
44
     */
45
    public function __construct(?\XoopsDatabase $db = null, ?Helper $helper = null)
46
    {
47
        $this->db = $db;
48
        /** @var Helper $this- >helper */
49
        $this->helper = $helper ?? Helper::getInstance();
50
51
        parent::__construct($db, static::TABLE, static::ENTITY, static::KEYNAME, static::IDENTIFIER);
52
    }
53
54
    /**
55
     * get inserted id
56
     *
57
     * @return int reference to the {@link Get} object
58
     */
59
    public function getInsertId(): int
60
    {
61
        return $this->db->getInsertId();
62
    }
63
64
    /**
65
     * Get Rating per item in the database
66
     * @param int|null $itemId
67
     * @param int|null $source
68
     */
69
    public function getItemRating($itemId = null, $source = null): array
70
    {
71
        $itemId    = $itemId ?? 0;
72
        $source    = $source ?? 0;
73
        $xoopsUser = $GLOBALS['xoopsUser'];
74
75
        $itemRating            = [];
76
        $itemRating['nb_vote'] = 0;
77
        $uid                   = \is_object($xoopsUser) ? $xoopsUser->getVar('uid') : 0;
78
        $voted                 = false;
79
        $ip                    = \getenv('REMOTE_ADDR');
80
        $currentRating         = 0;
81
        $count                 = 0;
82
83
        $max_units       = 10;
84
        $ratingbarsValue = (int)$this->helper->getConfig('ratingbars');
85
        $ratingArray     = [Constants::RATING_5STARS, Constants::RATING_10STARS, Constants::RATING_10NUM];
86
87
        if (\in_array($ratingbarsValue, $ratingArray, true)) {
88
            $rating_unitwidth = 25;
89
            if (Constants::RATING_5STARS === (int)$this->helper->getConfig('ratingbars')) {
90
                $max_units = 5;
91
            }
92
93
            $criteria = new \CriteriaCompo();
94
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
95
            $criteria->add(new \Criteria(static::SOURCE, $source));
96
97
            $voteObjs              = $this->helper->getHandler(static::ENTITYNAME)
98
                                                  ->getObjects($criteria);
0 ignored issues
show
The method getObjects() does not exist on XoopsObjectHandler. It seems like you code against a sub-type of said class. However, the method does not exist in XoopsRankHandler or XoUserHandler or XoopsModules\Publisher\PermissionHandler. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

98
                                                  ->/** @scrutinizer ignore-call */ getObjects($criteria);
Loading history...
99
            $count                 = \count($voteObjs);
100
            $itemRating['nb_vote'] = $count;
101
102
            foreach ($voteObjs as $voteObj) {
103
                $currentRating += $voteObj->getVar('rate');
104
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
105
                    $voted            = true;
106
                    $itemRating['id'] = $voteObj->getVar('ratingid');
107
                }
108
            }
109
            unset($criteria);
110
111
            $itemRating['avg_rate_value'] = 0;
112
            if ($count > 0) {
113
                $itemRating['avg_rate_value'] = \number_format((float)$currentRating / $count, 2);
114
            }
115
            if (1 == $count) {
116
                $text      = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_1);
117
                $shorttext = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_SHORT_1);
118
            } else {
119
                $text      = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_X);
120
                $shorttext = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_SHORT_X);
121
            }
122
            $text                    = \str_replace('%m', (string)$max_units, $text);
123
            $text                    = \str_replace('%t', (string)$itemRating['nb_vote'], $text);
124
            $shorttext               = \str_replace('%t', (string)$itemRating['nb_vote'], $shorttext);
125
            $itemRating['text']      = $text;
126
            $itemRating['shorttext'] = $shorttext;
127
            $itemRating['size']      = ($itemRating['avg_rate_value'] * $rating_unitwidth) . 'px';
128
            $itemRating['maxsize']   = ($max_units * $rating_unitwidth) . 'px';
129
130
            $itemRating['ip']    = $ip;
131
            $itemRating['uid']   = $uid;
132
            $itemRating['voted'] = $voted;
133
            // YouTube Liking  ==========================================
134
        } elseif (Constants::RATING_LIKES === (int)$this->helper->getConfig('ratingbars')) {
135
            // get count of "dislikes"
136
            $criteria = new \CriteriaCompo();
137
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
138
            $criteria->add(new \Criteria(static::SOURCE, $source));
139
            $criteria->add(new \Criteria('rate', 0, '<'));
140
141
            $voteObjs = $this->helper->getHandler(static::ENTITYNAME)
142
                                     ->getObjects($criteria);
143
            $count    = \count($voteObjs);
144
145
            foreach ($voteObjs as $voteObj) {
146
                $currentRating += $voteObj->getVar('rate');
147
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
148
                    $voted            = true;
149
                    $itemRating['id'] = $voteObj->getVar('ratingid');
150
                }
151
            }
152
            unset($criteria);
153
            $itemRating['dislikes'] = $count;
154
155
            // get count of "likes"
156
            $criteria = new \CriteriaCompo();
157
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
158
            $criteria->add(new \Criteria(static::SOURCE, $source));
159
            $criteria->add(new \Criteria('rate', 0, '>'));
160
161
            $voteObjs      = $this->helper->getHandler(static::ENTITYNAME)
162
                                          ->getObjects($criteria);
163
            $count         = \count($voteObjs);
164
            $currentRating = 0;
165
            foreach ($voteObjs as $voteObj) {
166
                $currentRating += $voteObj->getVar('rate');
167
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
168
                    $voted            = true;
169
                    $itemRating['id'] = $voteObj->getVar('ratingid');
170
                }
171
            }
172
            unset($criteria);
173
            $itemRating['likes'] = $count;
174
175
            $itemRating['nb_vote'] = $itemRating['likes'] + $itemRating['dislikes'];
176
            $itemRating['ip']      = $ip;
177
            $itemRating['uid']     = $uid;
178
            $itemRating['voted']   = $voted;
179
            // Facebook Reactions  ==========================================
180
        } elseif (Constants::RATING_REACTION === (int)$this->helper->getConfig('ratingbars')) {
181
            $criteria = new \CriteriaCompo();
182
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
183
            $criteria->add(new \Criteria(static::SOURCE, $source));
184
            $criteria->add(new \Criteria('rate', 0, '<'));
185
186
            $voteObjs              = $this->helper->getHandler(static::ENTITYNAME)
187
                                                  ->getObjects($criteria);
188
            $count                 = \count($voteObjs);
189
            $itemRating['nb_vote'] = $count;
190
191
            foreach ($voteObjs as $voteObj) {
192
                $currentRating += $voteObj->getVar('rate');
193
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
194
                    $voted            = true;
195
                    $itemRating['id'] = $voteObj->getVar('ratingid');
196
                }
197
            }
198
            unset($criteria);
199
            $itemRating['dislikes'] = $count;
200
201
            $criteria = new \CriteriaCompo();
202
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
203
            $criteria->add(new \Criteria(static::SOURCE, $source));
204
            $criteria->add(new \Criteria('rate', 0, '>'));
205
206
            $voteObjs      = $this->helper->getHandler(static::ENTITYNAME)
207
                                          ->getObjects($criteria);
208
            $count         = \count($voteObjs);
209
            $currentRating = 0;
210
            foreach ($voteObjs as $voteObj) {
211
                $currentRating += $voteObj->getVar('rate');
212
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
213
                    $voted            = true;
214
                    $itemRating['id'] = $voteObj->getVar('ratingid');
215
                }
216
            }
217
            unset($criteria);
218
            $itemRating['likes'] = $count;
219
220
            $itemRating['nb_vote'] = $itemRating['likes'] + $itemRating['dislikes'];
221
            $itemRating['ip']      = $ip;
222
            $itemRating['uid']     = $uid;
223
            $itemRating['voted']   = $voted;
224
        } else {
225
            $itemRating['uid']     = $uid;
226
            $itemRating['nb_vote'] = $count;
227
            $itemRating['voted']   = $voted;
228
            $itemRating['ip']      = $ip;
229
        }
230
231
        return $itemRating;
232
    }
233
234
    /**
235
     * Get Rating per item in the database
236
     * @param Item|null $itemObj
237
     * @param int|null  $source
238
     */
239
    public function getItemRating5($itemObj = null, $source = null): array
240
    {
241
        $itemId    = $itemObj->itemid();
0 ignored issues
show
The method itemid() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

241
        /** @scrutinizer ignore-call */ 
242
        $itemId    = $itemObj->itemid();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
The method itemid() does not exist on XoopsModules\Publisher\Item. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

241
        /** @scrutinizer ignore-call */ 
242
        $itemId    = $itemObj->itemid();
Loading history...
242
        $source    = $source ?? 0;
243
        $xoopsUser = $GLOBALS['xoopsUser'];
244
245
        $itemRating            = [];
246
        $itemRating['nb_vote'] = 0;
247
        $uid                   = \is_object($xoopsUser) ? $xoopsUser->getVar('uid') : 0;
248
        $voted                 = false;
249
        $ip                    = \getenv('REMOTE_ADDR');
250
        $currentRating         = 0;
251
        $count                 = 0;
252
253
        $max_units       = 10;
254
        $ratingbarsValue = $itemObj->votetype();
0 ignored issues
show
The method votetype() does not exist on XoopsModules\Publisher\Item. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

254
        /** @scrutinizer ignore-call */ 
255
        $ratingbarsValue = $itemObj->votetype();
Loading history...
255
        $ratingArray     = [Constants::RATING_5STARS, Constants::RATING_10STARS, Constants::RATING_10NUM];
256
257
        if (\in_array($ratingbarsValue, $ratingArray, true)) {
258
            $rating_unitwidth = 25;
259
            if (Constants::RATING_5STARS === $ratingbarsValue) {
260
                $max_units = 5;
261
            }
262
263
            $criteria = new \CriteriaCompo();
264
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
0 ignored issues
show
It seems like $itemId can also be of type array and array; however, parameter $value of Criteria::__construct() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

264
            $criteria->add(new \Criteria(static::IDENTIFIER, /** @scrutinizer ignore-type */ $itemId));
Loading history...
265
            $criteria->add(new \Criteria(static::SOURCE, $source));
266
267
            $voteObjs              = $this->helper->getHandler(static::ENTITYNAME)
268
                                                  ->getObjects($criteria);
269
            $count                 = \count($voteObjs);
270
            $itemRating['nb_vote'] = $count;
271
272
            foreach ($voteObjs as $voteObj) {
273
                $currentRating += $voteObj->getVar('rate');
274
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
275
                    $voted            = true;
276
                    $itemRating['id'] = $voteObj->getVar('ratingid');
277
                }
278
            }
279
            unset($criteria);
280
281
            $itemRating['avg_rate_value'] = 0;
282
            if ($count > 0) {
283
                $itemRating['avg_rate_value'] = \number_format((float)$currentRating / $count, 2);
284
            }
285
            if (1 == $count) {
286
                $text      = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_1);
287
                $shorttext = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_SHORT_1);
288
            } else {
289
                $text      = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_X);
290
                $shorttext = \str_replace('%c', (string)$itemRating['avg_rate_value'], \_MA_PUBLISHER_RATING_CURRENT_SHORT_X);
291
            }
292
            $text                    = \str_replace('%m', (string)$max_units, $text);
293
            $text                    = \str_replace('%t', (string)$itemRating['nb_vote'], $text);
294
            $shorttext               = \str_replace('%t', (string)$itemRating['nb_vote'], $shorttext);
295
            $itemRating['text']      = $text;
296
            $itemRating['shorttext'] = $shorttext;
297
            $itemRating['size']      = ($itemRating['avg_rate_value'] * $rating_unitwidth) . 'px';
298
            $itemRating['maxsize']   = ($max_units * $rating_unitwidth) . 'px';
299
300
            $itemRating['ip']    = $ip;
301
            $itemRating['uid']   = $uid;
302
            $itemRating['voted'] = $voted;
303
            // YouTube Liking  ==========================================
304
        } elseif (Constants::RATING_LIKES === $ratingbarsValue) {
305
            // get count of "dislikes"
306
            $criteria = new \CriteriaCompo();
307
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
308
            $criteria->add(new \Criteria(static::SOURCE, $source));
309
            $criteria->add(new \Criteria('rate', 0, '<'));
310
311
            $voteObjs = $this->helper->getHandler(static::ENTITYNAME)
312
                                     ->getObjects($criteria);
313
            $count    = \count($voteObjs);
314
315
            foreach ($voteObjs as $voteObj) {
316
                $currentRating += $voteObj->getVar('rate');
317
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
318
                    $voted            = true;
319
                    $itemRating['id'] = $voteObj->getVar('ratingid');
320
                }
321
            }
322
            unset($criteria);
323
            $itemRating['dislikes'] = $count;
324
325
            // get count of "likes"
326
            $criteria = new \CriteriaCompo();
327
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
328
            $criteria->add(new \Criteria(static::SOURCE, $source));
329
            $criteria->add(new \Criteria('rate', 0, '>'));
330
331
            $voteObjs      = $this->helper->getHandler(static::ENTITYNAME)
332
                                          ->getObjects($criteria);
333
            $count         = \count($voteObjs);
334
            $currentRating = 0;
335
            foreach ($voteObjs as $voteObj) {
336
                $currentRating += $voteObj->getVar('rate');
337
                if (($voteObj->getVar('ip') == $ip && 0 == $uid) || ($uid > 0 && $uid == $voteObj->getVar('uid'))) {
338
                    $voted            = true;
339
                    $itemRating['id'] = $voteObj->getVar('ratingid');
340
                }
341
            }
342
            unset($criteria);
343
            $itemRating['likes'] = $count;
344
345
            $itemRating['nb_vote'] = $itemRating['likes'] + $itemRating['dislikes'];
346
            $itemRating['ip']      = $ip;
347
            $itemRating['uid']     = $uid;
348
            $itemRating['voted']   = $voted;
349
            // Facebook Reactions  ==========================================
350
        } elseif (Constants::RATING_REACTION === $ratingbarsValue) {
351
            $criteria = new \CriteriaCompo();
352
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
353
            $criteria->add(new \Criteria(static::SOURCE, $source));
354
            $criteria->add(new \Criteria('rate', 1));
355
            $voteObjs            = $this->helper->getHandler(static::ENTITYNAME)
356
                                                ->getObjects($criteria);
357
            $count               = \count($voteObjs);
358
            $itemRating['likes'] = $count;
359
360
            $criteria = new \CriteriaCompo();
361
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
362
            $criteria->add(new \Criteria(static::SOURCE, $source));
363
            $criteria->add(new \Criteria('rate', 2));
364
            $voteObjs           = $this->helper->getHandler(static::ENTITYNAME)
365
                                               ->getObjects($criteria);
366
            $count              = \count($voteObjs);
367
            $itemRating['love'] = $count;
368
369
            $criteria = new \CriteriaCompo();
370
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
371
            $criteria->add(new \Criteria(static::SOURCE, $source));
372
            $criteria->add(new \Criteria('rate', 3));
373
            $voteObjs            = $this->helper->getHandler(static::ENTITYNAME)
374
                                                ->getObjects($criteria);
375
            $count               = \count($voteObjs);
376
            $itemRating['smile'] = $count;
377
378
            $criteria = new \CriteriaCompo();
379
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
380
            $criteria->add(new \Criteria(static::SOURCE, $source));
381
            $criteria->add(new \Criteria('rate', 4));
382
            $voteObjs          = $this->helper->getHandler(static::ENTITYNAME)
383
                                              ->getObjects($criteria);
384
            $count             = \count($voteObjs);
385
            $itemRating['wow'] = $count;
386
387
            $criteria = new \CriteriaCompo();
388
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
389
            $criteria->add(new \Criteria(static::SOURCE, $source));
390
            $criteria->add(new \Criteria('rate', 5));
391
            $voteObjs          = $this->helper->getHandler(static::ENTITYNAME)
392
                                              ->getObjects($criteria);
393
            $count             = \count($voteObjs);
394
            $itemRating['sad'] = $count;
395
396
            $criteria = new \CriteriaCompo();
397
            $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
398
            $criteria->add(new \Criteria(static::SOURCE, $source));
399
            $criteria->add(new \Criteria('rate', 6));
400
            $voteObjs            = $this->helper->getHandler(static::ENTITYNAME)
401
                                                ->getObjects($criteria);
402
            $count               = \count($voteObjs);
403
            $itemRating['angry'] = $count;
404
405
            $itemRating['nb_vote'] = $itemRating['likes'] + $itemRating['love'] + $itemRating['smile'] + $itemRating['wow'] + $itemRating['sad'] + $itemRating['angry'];
406
            $itemRating['ip']      = $ip;
407
            $itemRating['uid']     = $uid;
408
            $itemRating['voted']   = $voted;
409
        } else {
410
            $itemRating['uid']     = $uid;
411
            $itemRating['nb_vote'] = $count;
412
            $itemRating['voted']   = $voted;
413
            $itemRating['ip']      = $ip;
414
        }
415
416
        return $itemRating;
417
    }
418
419
    /**
420
     * delete vote of given item
421
     * @param mixed $itemId
422
     * @param mixed $source
423
     */
424
    public function deleteAllVote($itemId, $source): bool
425
    {
426
        $criteria = new \CriteriaCompo();
427
        $criteria->add(new \Criteria(static::IDENTIFIER, $itemId));
428
        $criteria->add(new \Criteria(static::SOURCE, $source));
429
430
        return $this->deleteAll($criteria);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->deleteAll($criteria) could return the type integer which is incompatible with the type-hinted return boolean. Consider adding an additional type-check to rule them out.
Loading history...
431
    }
432
433
    //TODO
434
    // delete all votes for an item
435
    // delete all votes
436
    // updates Vote counts for an item after new vote
437
    // convert vote type to another
438
    // TopRated
439
    // getAggregate
440
441
    // Average, Sum, Count
442
    // getVotingElement (FiveStarts, Reaction)
443
    // buildForm, getStyle
444
    //
445
    //tableName
446
    //behaviors
447
    //rules
448
    //attributeLabels
449
    //afterSave
450
    //getModelIdByName
451
    //getModelNameById
452
    //getIsAllowGuests
453
    //getIsAllowChangeVote
454
    //updateRating
455
456
    //getId
457
    //getVoterId
458
    //getVoterName
459
    //getVoteableId
460
    //getVotableName
461
    //getValue
462
    //getRange
463
    //getMinValue
464
    //getMaxValue
465
    //getTime
466
467
    //VoteRepositoryInterface:
468
    //find
469
    //findByVoter
470
    //findByVotable
471
    //getCountByVotable
472
    //getAvgByVotable
473
    //create
474
    //delete
475
476
    //VotesRepositoryTest
477
    //repo
478
    //vote
479
    //__construct
480
    //testRepo
481
    //_testCreate
482
    //_testFindByVoter
483
    //_testFindByVotable
484
    //_testAvg
485
    //_testCount
486
    //_testDelete
487
    //_votable
488
    //_voter
489
490
    //FieldVoteResultBase:
491
    //calculateResult
492
    //getVotesForField
493
    //
494
    //
495
    //VotingApiField:
496
    //defaultFieldSettings
497
    //defaultStorageSettings
498
    //fieldSettingsForm
499
    //generateSampleValue
500
    //isEmpty
501
    //mainPropertyName
502
    //postSave
503
    //propertyDefinitions
504
    //schema
505
    //storageSettingsForm
506
    //
507
    //
508
    //VotingApiWidgetBase:
509
    //canVote
510
    //getEntityForVoting
511
    //getForm
512
    //getInitialVotingElement
513
    //getLabel
514
    //getResults
515
    //getValues
516
    //getVoteSummary
517
    //getWindow
518
519
    //Rating
520
    //afterSave
521
    //attributeLabels
522
    //behaviors
523
    //compressIp
524
    //expandIp
525
    //getIsAllowChangeVote
526
    //getIsAllowGuests
527
    //getModelIdByName
528
    //getModelNameById
529
    //rules
530
    //tableName
531
    //updateRating
532
}
533