<?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;
}
}