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

File size: 10.4Kb
<?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 Activity extends Repository
{
    use FeedbackAbstractRepository;


    protected static $_activityCache;

    protected $_typeFilter;

    protected $_userNameFilter;

    protected function _saveActivity($info)
    {
        if (!isset($info['args']))
        {
            $info['args']=array();
        }

        self::$_activityCache[]=$info;
    }

    public function save()
    {
        if (empty(self::$_activityCache))
        {
            return;
        }
        $visitor=\XF::visitor();

       try {
               foreach ( self::$_activityCache AS $info ) {
                    $log_hash = substr($this->app()->db()->quote(md5( $this->generateRandomString() . $visitor->user_id . $info['phrase'] . $info['link'] )), 0 , 32);
                    $activityWriter = $this->em->create('XenCentral\Feedback:FeedbackActivity');

                    $activityWriter->set('user_id', $visitor->user_id);
                    $activityWriter->set('log_hash', $log_hash);
                    $activityWriter->set('phrase', $info['phrase']);
                    $activityWriter->set('args', serialize($info['args']));
                    $activityWriter->set('link', $info['link']);
                    $activityWriter->set('state', $info['state']);
                    $activityWriter->save();

                }

            } catch ( Exception $ex ) {

            }

        self::$_activityCache=array();
    }

    public function viewHome()
    {
        $phrase='xcfs_logactivity_home';
       $link=\XF::app()->router('public')->buildLink('feedback');

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'link' => $link,
            'state' => 'public'
        ));
    }

    public function viewUser($user)
    {
        $phrase='xcfs_logactivity_view_user';
        $link=$this->app()->router('public')->buildLink('feedback', $user);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'public'
        ));
    }

    public function addFeedback($user)
    {
        $phrase='xcfs_logactivity_add_feedback';
        $link=\XF::app()->router('public')->buildLink('feedback/add-feedback', $user);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'public'
        ));
    }

    public function addedFeedback($fb_id, $user)
    {
        //$feedback=$this->_getFeedbackModel()->getFeedbackById($fb_id);

        $phrase='xcfs_logactivity_added_feedback';

        $link=$this->app()->router('public')->buildLink('feedback/feedback/view');

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'public'
        ));
    }

    public function viewFeedback($user, $feedback)
    {
        $phrase='xcfs_logactivity_viewing_feedback';

        $link=$this->app()->router('public')->buildLink('feedback/feedback/view');

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'public'
        ));
    }

    public function addComment($feedback, $user)
    {
        $phrase='xcfs_logactivity_adding_comment';

        $link=$this->app()->router('public')->buildLink('feedback/feedback/add-comment', $feedback);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function commentSaved($feedback, $user)
    {
        $phrase='xcfs_logactivity_added_comment';

        $link=$this->app()->router('public')->buildLink('feedback/feedback/view', $feedback);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function editFeedback($feedback, $user)
    {
        $phrase='xcfs_logactivity_editing_feedback';

        $link=\XF::app()->router('public')->buildLink('feedback/feedback/edit', $user);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function savedFeedback($feedback, $user)
    {
        $phrase='xcfs_logactivity_saved_feedback';

        $link=\XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function deletedFeedback($user)
    {
        $phrase='xcfs_logactivity_deleting_feedback';

        $link=\XF::app()->router('public')->buildLink('feedback', $user);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function reportedFeedback($feedback, $user)
    {
        $phrase='xcfs_logactivity_reported_feedback';
        $link=\XF::app()->router('public')->buildLink('feedback/view', $feedback);

        $this->_saveActivity(array (
            'phrase' => $phrase,
            'args'=>array('username'=>$user['username']),
            'link' => $link,
            'state' => 'private'
        ));
    }

    public function getUserActivity($user_id, $limit)
    {
        $activity=$this->db()->fetchAll("
			SELECT activity.*, user.username 
			FROM xf_xc_feedback_activity AS activity
			LEFT JOIN xf_user AS user ON user.user_id=activity.user_id
			WHERE activity.user_id=?
			ORDER BY activity.dateline DESC
			LIMIT 0, ?
		", array($user_id, $limit));

        $activity=array_map(array($this, '_prepareLog'), $activity);

        return $activity;
    }

    public function getLatestActivity($limit)
    {
        $where=array();

        if($types=$this->getTypeFilter())
        {

            $where[]= "activity.phrase IN(" . "'" .implode("', '", $types) . "'" . ")";

        }

        if($userFilter=$this->getUserNameFilter()) {
            $where[] = "activity.user_id IN(" .$userFilter[0]['user_id']. ")";
        }

        if(!$this->_getOptionsModel()->getEnableGuestAcitivity()) {
            $where[]="activity.user_id > 0";
        } else {
            $where[] = "activity.user_id >= 0";
        }

        $activity=$this->db()->fetchAll("
			SELECT activity.*, user.username, user.user_group_id, user.secondary_group_ids, preference.*
			FROM xf_xc_feedback_activity AS activity
			LEFT JOIN xf_user AS user ON user.user_id=activity.user_id
			LEFT JOIN xf_xc_feedback_preference AS preference ON preference.pr_user_id=activity.user_id WHERE
			activity.state = 'public'
			AND ". implode(" AND ", $where) . " ORDER BY activity.dateline DESC
			LIMIT 0, ?
		", array($limit));
        foreach($activity AS $key=>$user)
        {

            if($user['xc_feedback_is_invisible']==1)
            {
                if(!\XF::visitor()->canBeInvisibleFeedback($user))
                {
                    $user['xc_feedback_is_invisible']=0;
                }
            }

            if($user['xc_feedback_is_invisible']==1 && !\XF::visitor()->canBeInvisibleFeedback())
            {
                unset($activity[$key]);
            }
        }

        $activity=array_map(array($this, '_prepareLog'), $activity);

        return $activity;
    }

    public function getActivityTypes()
    {
        $types=array(
            'all',
            'view_user',
            'add_feedback',
            'added_feedback',
            'viewing_feedback',
            'adding_comment',
            'added_comment',
            'editing_feedback',
            'saved_feedback',
            'deleting_feedback',
            'reported_feedback',
            'home'
        );

        $phrase=array();
        foreach($types AS $type)
        {
            $phrase[$type]=\XF::phrase('xcfs_logactivity_'.$type.'_title');
        }

        return $phrase;
    }

    protected function _prepareLog($log)
    {
        $log['args']=(array)@unserialize($log['args']);
        $log['phrase']=\XF::phrase($log['phrase'], $log['args']);

        return $log;
    }

    public function setTypeFilter($typeFilter)
    {
        $this->_typeFilter=array();

        $types=$this->getActivityTypes();

        foreach($typeFilter AS $type)
        {
            if($type!=='all' && array_key_exists($type, $types))
            {
                $this->_typeFilter[]="xcfs_logactivity_$type";
            }
        }

        return $this;
    }

    public function getTypeFilter()
    {
        return $this->_typeFilter;
    }

    public function setUserNameFilter($userNameFilter)
    {
        $this->_userNameFilter=array();

        if(!$userNameFilter)
        {
            return $this;
        }

        $userNameFilter=explode(';', $userNameFilter);

        $userNameFilter=array_map('trim', $userNameFilter);

        $userNameFilter=array_map(array($this->db(), 'quote'), $userNameFilter);

        $users=$this->db()->fetchAll("
			SELECT user_id FROM xf_user
			WHERE username IN(".implode(',', $userNameFilter).")
		");

        if(!empty($users))
        {
            $this->_userNameFilter=array_values($users);
        }

        return $this;
    }

    public function getUserNameFilter()
    {
        return $this->_userNameFilter;
    }
    public function generateRandomString($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }
}