View source
<?php
namespace Drupal\activity;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\node\Entity\Node;
use Drupal\user\Entity\User;
class QueryActivity {
protected $database;
protected $currentUser;
public function __construct(Connection $database, AccountProxyInterface $currentUser) {
$this->database = $database;
$this->currentUser = $currentUser;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('database'), $container
->get('current_user'));
}
public function getActivityEventField($eventId, $field) {
$query = $this->database
->select('activity_events', 'act')
->fields('act', [
$field,
])
->condition('event_id', $eventId)
->execute()
->fetchAll();
return $query;
}
public function countMessages() {
$query = $this->database
->select('activity', 'act');
$query
->fields('act', [
'message',
]);
return $query;
}
public function getActivities() {
$query = $this->database
->select('activity', 'activity');
$query
->fields('activity', [
'action_id',
'event_id',
'entity_type',
'nid',
'uid',
'created',
'status',
'message',
]);
return $query;
}
public function insertActivity($eventId, $entityType, $nid, $uid, $status, $message) {
$window = $this
->validActivity($eventId);
if ($window) {
$this->database
->insert('activity')
->fields([
'event_id' => $eventId,
'entity_type' => $entityType,
'nid' => $nid,
'uid' => $uid,
'created' => \Drupal::time()
->getCurrentTime(),
'status' => $status,
'message' => $message,
])
->execute();
}
}
public function validActivity($eventId) {
$timestamp = \Drupal::time()
->getCurrentTime();
$queryEvent = $this->database
->select('activity_events', 'ev')
->fields('ev', [
'message',
])
->condition('event_id', $eventId, '=')
->execute()
->fetchAll();
$message = $queryEvent[0]->message;
$message = json_decode($message);
$window = $message->window;
$count = $this->database
->select('activity', 'act')
->fields('act', [
'action_id',
])
->condition('event_id', $eventId, '=')
->condition('created', $timestamp - $window, '>')
->countQuery()
->execute()
->fetchField();
return $count == 0;
}
public function getMessage($hook) {
$query = $this->database
->select('activity_events', 'act')
->fields('act', [
'message',
'event_id',
])
->condition('hook', $hook)
->execute()
->fetchAll();
return $query;
}
public function logActivity(EntityInterface $entity, $hook) {
$entityNode = NULL;
$entityUser = NULL;
$entityComment = NULL;
$entityType = $entity
->getEntityTypeId();
switch ($entity
->getEntityTypeId()) {
case 'node':
$activityOption[] = $entity
->getType();
$nodeId = $entity
->get('nid')
->getValue();
$nid = $nodeId[0]['value'];
$userId = $entity
->get('uid')
->getValue();
$uid = $userId[0]['target_id'];
$entityNode = $entity;
$entityUser = User::load($uid);
$status = $entity
->get('status')
->getValue();
break;
case 'comment':
$nodeId = $entity
->get('entity_id')
->getValue();
$nid = $nodeId[0]['target_id'];
$entityNode = Node::load($nid);
$activityOption[] = $entityNode
->getType();
$entityComment = $entity;
$userId = $entity
->get('uid')
->getValue();
$uid = $userId[0]['target_id'];
$entityUser = User::load($uid);
$status = $entity
->get('status')
->getValue();
break;
case 'user':
$rolesOptions = $entity
->get('roles');
$activityOption = [
'0' => 'authenticated',
];
foreach ($rolesOptions as $key => $value) {
$role = $value
->getValue();
$activityOption[] = $role['target_id'];
}
$uid = $this->currentUser
->id();
$nid = NULL;
$entityUser = $entity;
$status = $entity
->get('status')
->getValue();
if ($status[0]['value'] == FALSE) {
$status[0]['value'] = 0;
}
elseif ($status[0]['value'] == TRUE) {
$status[0]['value'] = 1;
}
break;
default:
}
$results = $this
->getMessage($hook);
if (!empty($results)) {
foreach ($results as $key => $value) {
$message = json_decode($value->message);
$types = $message->types;
if (empty($types)) {
$roles = $message->roles;
}
else {
$types = $message->types;
}
if (!empty($activityOption)) {
if (!empty($types)) {
foreach ($activityOption as $act => $activityValue) {
if (in_array($activityValue, $types)) {
$activityMessage = \Drupal::token()
->replace($message->message, [
'node' => $entityNode,
'user' => $entityUser,
'comment' => $entityComment,
]);
$this
->insertActivity($value->event_id, $entityType, $nid, $uid, $status[0]['value'], $activityMessage);
}
}
}
elseif (!empty($roles)) {
if (array_intersect($activityOption, $roles)) {
$activityMessage = \Drupal::token()
->replace($message->message, [
'node' => $entityNode,
'user' => $entityUser,
'comment' => $entityComment,
]);
$this
->insertActivity($value->event_id, $entityType, $nid, $uid, $status[0]['value'], $activityMessage);
}
}
}
}
}
}
}