<?php
/**
* @package XenCentral Feedback System
* @author DNF Technology
* @copyright Drnoyan & Nalyan LDA, Portugal, EU
* @license http://dnf.technology/terms/
* @link http://customers.dnf.technology
* @version 2.0.0 Beta 10
* @revision 12
*/
namespace XenCentral\Feedback\Repository;
use XF\Db\Exception;
use XF\Mvc\Entity\Finder;
use XF\Mvc\Entity\Repository;
class Feedback extends Repository
{
use FeedbackAbstractRepository;
protected $_amountFilter;
protected $_fromUserFilter;
protected $_typeFilter;
protected $_fromDateFilter;
protected $_toDateFilter;
protected $_lastIdFilter;
/**
* @param $user
* @return $user
* Sets defaults for feedback stats
*/
public function fillUserDefaults($user)
{
foreach (array('fb_percent', 'fb_positive', 'fb_positivetotal', 'fb_negative', 'fb_neutral') AS $key) {
if (empty($user[$key])) {
$user[$key] = 0;
}
}
return $user;
}
public function getFeedbackForThread($thread_id, $fromuserid, $exceptFeedback)
{
$exceptFeedback=intval($exceptFeedback);
return $this->finder('XenCentral\Feedback:Feedback')->where('threadid', '=', $thread_id)->
where('fromuserid', '=', $fromuserid)->where('fb_id', '!=', $exceptFeedback)->total();
}
public function getFeedbackForItem($dealUrl, $fromuserid, $exceptFeedback)
{
$exceptFeedback=intval($exceptFeedback);
return $this->finder('XenCentral\Feedback:Feedback')->where('dealurl', '=', $dealUrl)->
where('fromuserid', '=', $fromuserid)->limit('1')->where('fb_id', '!=', $exceptFeedback)->total();
}
public function getFeedbackById($fb_id, $prepare = true)
{
$feedback = $this->db()->fetchRow("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE feedback.fb_id = ?
", $fb_id);
if ($prepare == false || $feedback == false) {
return $feedback;
}
return $this->_prepareFeedback($feedback);
}
public function Try_getFeedbackById($fb_id, $prepare = true)
{
$feedback = $this->finder('XenCentral\Feedback:Feedback') ->where('fb_id', '=', $fb_id)
->with('User')->pluckFrom('fromuserid')->pluckFrom('foruserid')->with('FbUser')->pluckFrom('fromuserid')->pluckFrom('foruserid')
->getQuery();
if ($prepare == false || $feedback == false) {
return $feedback;
}
return $this->_prepareFeedback($feedback[0]);
}
public function getAllFeedbackByIdList($fb_id_list, $prepare = true)
{
$fb_id_list = array_values($fb_id_list);
$fb_id_list = array_unique($fb_id_list);
$fb_id_list = array_map('intval', $fb_id_list);
$q = "
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE feedback.fb_id IN (" . implode(',', $fb_id_list) . ")
";
$allFeedback = $this->fetchAllKeyed($q, 'fb_id');
if ($allFeedback == false) {
return array();
}
if (!$prepare) {
return $allFeedback;
}
$allFeedback = array_map(array($this, '_prepareFeedback'), $allFeedback);
return $allFeedback;
}
public function rebuildUserData($user_id)
{
$this->_getUserModel()->rebuildUserData($user_id);
}
public function getAllFeedback($user_id, $limit = false)
{
if ($limit) {
$limit = "LIMIT 0, $limit";
}
$all_feedback = $this->db()->fetchAll("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE foruserid=?
ORDER BY feedback.dateline DESC
$limit
", array($user_id));
foreach ($all_feedback AS $key => $feedback)
{
$all_feedback[$key] = $this->_prepareFeedback($feedback);
}
return $all_feedback;
}
public function getFeedbackLeft($user_id, $limit = false, $fb_id = 0)
{
if ($limit) {
$limit = "LIMIT 0, $limit";
}
if ($fb_id) {
$where = "AND feedback.fb_id<$fb_id";
}
else
{
$where = '';
}
$all_feedback = $this->db()->fetchAll("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE fromuserid=?
$where
ORDER BY feedback.dateline DESC
$limit
", array($user_id));
foreach ($all_feedback AS $key => $feedback)
{
$all_feedback[$key] = $this->_prepareFeedback($feedback);
}
return $all_feedback;
}
public function getLastFeedbackDate($fromuserid, $foruserid)
{
$dateline=$this->db()->fetchOne("
SELECT dateline FROM xf_xc_feedback_feedback
WHERE fromuserid=? AND foruserid=?
ORDER BY dateline DESC
LIMIT 1
", array($fromuserid, $foruserid));
return $dateline;
}
/**
* @param int $fromuserid User ID who left feedback
* @param int $time Time in hours
* @return int Number of feedback left by $fromuserid in $time hours
*/
public function getLeftFeedbackCountForTime($fromuserid, $time)
{
return $this->db()->fetchOne("
SELECT COUNT(*) FROM xf_xc_feedback_feedback
WHERE fromuserid=? AND dateline>=?
", array($fromuserid, \XF::$time - $time * 3600));
}
public function getNumberOfLatestFeedback($userid)
{
return $this->db()->fetchOne("
SELECT COUNT(*) FROM xf_xc_feedback_feedback
WHERE fromuserid=?
AND dateline>" . (\XF::$time - $this->_convertDaysToSeconds(1)) . "
", array($userid));
}
public function getLatestFeedback()
{
$all_feedback = $this->db()->fetchAll("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
ORDER BY feedback.dateline DESC
LIMIT " . \XF::repository('XenCentral\Feedback:Options')->getMainPageLimit() . "
");
foreach ($all_feedback AS $key => $feedback)
{
$all_feedback[$key] = $this->_prepareFeedback($feedback);
}
return $all_feedback;
}
public function getNewFeedback($lastUpdated, $limit)
{
if ($limit) {
$limit = "LIMIT 0, $limit";
}
else
{
$limit = '';
}
$all_feedback = $this->db()->fetchAll("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE feedback.dateline>$lastUpdated
ORDER BY feedback.dateline DESC
$limit
");
foreach ($all_feedback AS $key => $feedback)
{
$all_feedback[$key] = $this->_prepareFeedback($feedback);
}
return $all_feedback;
}
protected function _getFeedbackFieldList()
{
return "ratedinfo.fb_total AS rated_fb_total, feedback.foruserid AS rated_user_id, rateduser.username AS rated_username,
raterinfo.fb_total AS rater_fb_total, feedback.fromuserid AS rater_user_id, rateruser.username AS rater_username";
}
protected function _getFeedbackJoinList()
{
return "LEFT JOIN xf_xc_feedback_user AS ratedinfo ON ratedinfo.user_id=feedback.foruserid
LEFT JOIN xf_xc_feedback_user AS raterinfo ON raterinfo.user_id=feedback.fromuserid
LEFT JOIN xf_user AS rateduser ON rateduser.user_id=feedback.foruserid
LEFT JOIN xf_user AS rateruser ON rateruser.user_id=feedback.fromuserid";
}
protected function _fillFeedbackStatsData($feedback)
{
if ($feedback['amount'] > 0) {
$feedback['feedback_string'] = 'positive';
}
else if ($feedback['amount'] < 0) {
$feedback['feedback_string'] = 'negative';
}
else
{
$feedback['feedback_string'] = 'neutral';
}
return $feedback;
}
protected function _prepareFeedback( $feedback)
{
if(empty($feedback)) {
return false;
}
if ($feedback['amount'] > 0) {
$feedback['feedback_string'] = 'positive';
}
else if ($feedback['amount'] < 0) {
$feedback['feedback_string'] = 'negative';
}
else
{
$feedback['feedback_string'] = 'neutral';
}
if (!isset($feedback['fb_total']) || !$feedback['fb_total']) {
if (isset($feedback['rater_fb_total']) && $feedback['rater_fb_total']) {
$feedback['fb_total'] = $feedback['rater_fb_total'];
}
else
{
$feedback['fb_total'] = 0;
}
}
if (!empty($feedback['threadid']) && !$feedback['dealurl']) {
$thread = $this->em->find('XF:Thread', $feedback['threadid'], []);
$feedbackWriter = $this->em->create( 'XenCentral\Feedback:Feedback' );
if (isset($thread)) {
$feedback['dealurl'] = $this->app()->router('public')->buildLink('full:threads', $thread);
$feedbackWriter->set('dealurl', $feedback['dealurl']);
} else {
$feedbackWriter->set('threadid', 0);
}
}
$feedback['rateduser'] = $feedback['rateruser'] = array();
foreach ($feedback AS $key => $value)
{
if (is_null($value)) {
$value = 0;
}
if (strpos($key, 'rated_') === 0) {
$feedback['rateduser'][str_replace('rated_', '', $key)] = $value;
unset($feedback[$key]);
} else if (strpos($key, 'rater_') === 0) {
$feedback['rateruser'][str_replace('rater_', '', $key)] = $value;
unset($feedback[$key]);
}
}
if (
\XF::visitor()->canAdminFeedback()
|| \XF::visitor()->canGiveFeedback()
&& $feedback['fromuserid'] == \XF::visitor()->user_id
&& \XF::$time - $this->_getOptionsModel()->getEditTimeLimit() < $feedback['dateline']
) {
$feedback['canedit'] = true;
}
else
{
$feedback['canedit'] = false;
}
return $feedback;
}
public function isTrader($feedback, $userid)
{
if ($feedback['foruserid'] == $userid || $feedback['fromuserid'] == $userid) {
return true;
}
return false;
}
public function getRoutMatchingTheURL($prefix){
$escapedPrefix = $this->db()->quote($this->db()->escapeLike($prefix,'?%'));
return $this->db()->fetchOne('
SELECT find_route
FROM xf_route_filter
WHERE replace_route LIKE ' . $escapedPrefix);
}
public function getFeedbackListForStats($options)
{
$where = array('1=1');
if ($options['from']) {
$where[] = 'feedback.dateline>=' . $options['from'];
}
if ($options['to']) {
$where[] = 'feedback.dateline<=' . $options['to'];
}
if (is_array($options['feedback']) && !empty($feedbackType)) {
$where[] = 'feedback.amount IN (' . implode(',', $options['feedback']) . ')';
}
if ($options['foruserid']) {
$where[] = 'feedback.foruserid=' . $options['foruserid'];
}
$all_feedback = $this->db()->fetchAll("
SELECT feedback.dateline, feedback.amount
FROM xf_xc_feedback_feedback AS feedback
WHERE " . implode(' AND ', $where) . "
ORDER BY dateline ASC
");
if (empty($all_feedback)) {
return false;
}
return array_map(array($this, '_fillFeedbackStatsData'), $all_feedback);
}
public function setAmountFilter($amountFilter)
{
$allowedAmountValues = array(-1, 0, 1);
foreach ($amountFilter AS $key => &$value)
{
$value=intval($value);
if (!in_array($value, $allowedAmountValues)) {
unset($amountFilter[$key]);
}
}
if (!empty($amountFilter) && count($amountFilter) != 3) {
$this->_amountFilter = $amountFilter;
}
return $this;
}
public function getAmountFilter()
{
return $this->_amountFilter;
}
public function setFromDateFilter($fromDateFilter)
{
if ($fromDateFilter) {
$this->_fromDateFilter = intval($fromDateFilter);
}
return $this;
}
public function getFromDateFilter()
{
return $this->_fromDateFilter;
}
public function setFromUserFilter($fromUserFilter)
{
if (empty($fromUserFilter)) {
return $this;
}
$fromUserFilter = explode(';', $fromUserFilter);
$fromUserFilter = array_map('trim', $fromUserFilter);
$fromUserFilter = array_map(array($this->_getDb(), 'quote'), $fromUserFilter);
$users = $this->db()->fetchAllKeyed("
SELECT user_id FROM xf_user
WHERE username IN(" . implode(',', $fromUserFilter) . ")
", 'user_id');
if (!empty($users)) {
$this->_fromUserFilter = array_keys($users);
}
return $this;
}
public function getFromUserFilter()
{
return $this->_fromUserFilter;
}
public function setToDateFilter($toDateFilter)
{
if ($toDateFilter) {
$this->_toDateFilter = intval($toDateFilter);
}
return $this;
}
public function getToDateFilter()
{
return $this->_toDateFilter;
}
public function setTypeFilter($typeFilter)
{
$allowedTypes = array('buy', 'sell', 'trade');
foreach ($typeFilter AS $key => $value)
{
if (!in_array($value, $allowedTypes)) {
unset($typeFilter[$key]);
}
}
if (!empty($typeFilter) && count($typeFilter) != 3) {
$this->_typeFilter = $typeFilter;
}
return $this;
}
public function getTypeFilter()
{
return $this->_typeFilter;
}
public function getLastIdFilter()
{
return $this->_lastIdFilter;
}
public function setLastIdFilter($id)
{
$this->_lastIdFilter = $id;
return $this;
}
public function getFilteredFeedbackList($user_id, $limit = false)
{
if ($limit) {
$limit = "LIMIT 0, $limit";
}
$where = array('1=1');
if ($type = $this->getTypeFilter()) {
$type = array_map(array($this->_getDb(), 'quote'), $type);
$where[] = 'feedback.type IN(' . implode(',', $type) . ')';
}
if ($toDate = $this->getToDateFilter()) {
$where[] = 'feedback.dateline<=' . $toDate;
}
if ($fromDate = $this->getFromDateFilter()) {
$where[] = 'feedback.dateline>=' . $fromDate;
}
if ($fromUserIdList = $this->getFromUserFilter()) {
$where[] = 'feedback.fromuserid IN (' . implode(',', $fromUserIdList) . ')';
}
if ($amountFilter = $this->getAmountFilter()) {
$where[] = 'feedback.amount IN(' . implode(',', $amountFilter) . ')';
}
if ($lastId = $this->getLastIdFilter()) {
$where[] = 'feedback.fb_id<' . $lastId;
}
$all_feedback = $this->db()->fetchALL("
SELECT feedback.*,
" . $this->_getFeedbackFieldList() . "
FROM xf_xc_feedback_feedback AS feedback
" . $this->_getFeedbackJoinList() . "
WHERE foruserid=?
AND " . implode(' AND ', $where) . "
ORDER BY feedback.dateline DESC
$limit
", array($user_id));
foreach ($all_feedback AS $key => $feedback)
{
$all_feedback[$key] = $this->_prepareFeedback($feedback);
}
return $all_feedback;
}
public function getResultsAreFiltered()
{
return
$this->getAmountFilter()
OR
$this->getFromDateFilter()
OR
$this->getToDateFilter()
OR
$this->getFromUserFilter()
OR
$this->getTypeFilter()
OR
$this->getLastIdFilter();
}
}