View file upload/src/addons/XenCentral/Feedback/Repository/Feedback.php

File size: 16.17Kb
<?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();
    }

}