Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
49 / 49
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
ReportService
100.00% covered (success)
100.00%
49 / 49
100.00% covered (success)
100.00%
4 / 4
9
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 referer
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
1 / 1
3
 setReferrersCondition
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
4
 addDateFilter
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace Drupal\visitors\Service;
4
5use Drupal\Core\Config\ConfigFactoryInterface;
6use Drupal\Core\Database\Connection;
7use Drupal\Core\StringTranslation\StringTranslationTrait;
8use Drupal\visitors\VisitorsReportInterface;
9use Symfony\Component\HttpFoundation\RequestStack;
10use Drupal\visitors\VisitorsDateRangeInterface;
11
12/**
13 * Report data.
14 *
15 * @package visitors
16 */
17class ReportService implements VisitorsReportInterface {
18  use StringTranslationTrait;
19
20  /**
21   * The database service.
22   *
23   * @var \Drupal\Core\Database\Connection
24   */
25  protected $database;
26
27  /**
28   * Items per page.
29   *
30   * @var int
31   */
32  protected $itemsPerPage;
33
34  /**
35   * The page number.
36   *
37   * @var int
38   */
39  protected $page;
40
41  /**
42   * The date range service.
43   *
44   * @var \Drupal\visitors\VisitorsDateRangeInterface
45   */
46  protected $dateRange;
47
48  /**
49   * Database Service Object.
50   *
51   * @param \Drupal\Core\Database\Connection $database
52   *   The database service.
53   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
54   *   The config factory service.
55   * @param \Symfony\Component\HttpFoundation\RequestStack $stack
56   *   The request stack service.
57   * @param \Drupal\visitors\VisitorsDateRangeInterface $date_range
58   *   The date range service.
59   */
60  public function __construct(
61    Connection $database,
62    ConfigFactoryInterface $config_factory,
63    RequestStack $stack,
64    VisitorsDateRangeInterface $date_range,
65  ) {
66
67    $this->database = $database;
68    $this->itemsPerPage = $config_factory->get('visitors.settings')->get('items_per_page') ?? 10;
69    $this->page = $stack->getCurrentRequest()->query->get('page') ?? 0;
70    $this->dateRange = $date_range;
71  }
72
73  /**
74   * {@inheritdoc}
75   */
76  public function referer(array $header) {
77    /** @var \Drupal\Core\Database\Query\SelectInterface $query */
78    $query = $this->database->select('visitors_event', 'v')
79      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
80      ->extend('Drupal\Core\Database\Query\TableSortExtender');
81    // $query->condition('bot', 1, '<>');
82    $query->addExpression('COUNT(*)', 'count');
83    $query->fields('v', ['referrer_url']);
84    $this->addDateFilter($query);
85    $query = $this->setReferrersCondition($query);
86    $query->condition('referrer_url', '', '<>');
87    $query->groupBy('referrer_url');
88    $query->orderByHeader($header);
89    $query->limit($this->itemsPerPage);
90
91    $count_query = $this->database->select('visitors_event', 'v');
92    // $count_query->condition('bot', 1, '<>');
93    $count_query->condition('referrer_url', '', '<>');
94    $count_query->addExpression('COUNT(DISTINCT referrer_url)');
95    $this->addDateFilter($count_query);
96    $count_query = $this->setReferrersCondition($count_query);
97    $query->setCountQuery($count_query);
98    $results = $query->execute();
99
100    $rows = [];
101    $i = $this->page * $this->itemsPerPage;
102    foreach ($results as $data) {
103
104      $rows[] = [
105        empty($data->referrer_url) ? $this->t('No Referer') : $data->referrer_url,
106        $data->count,
107      ];
108    }
109    return $rows;
110  }
111
112  /**
113   * Build sql query from referer type value.
114   */
115  protected function setReferrersCondition($query) {
116    switch ($_SESSION['referer_type']) {
117      case VisitorsReportInterface::REFERER_TYPE_INTERNAL_PAGES:
118        $query->condition(
119          'referrer_url',
120          sprintf('%%%s%%', $_SERVER['HTTP_HOST']),
121          'LIKE'
122        );
123        $query->condition('referrer_url', '', '<>');
124        break;
125
126      case VisitorsReportInterface::REFERER_TYPE_EXTERNAL_PAGES:
127        $query->condition(
128          'referrer_url',
129          sprintf('%%%s%%', $_SERVER['HTTP_HOST']),
130          'NOT LIKE'
131        );
132        break;
133
134      default:
135        break;
136    }
137
138    return $query;
139  }
140
141  /**
142   * Add date filter to the query.
143   *
144   * @param \Drupal\Core\Database\Query\SelectInterface $query
145   *   The query object.
146   */
147  protected function addDateFilter(&$query) {
148
149    $from = $this->dateRange->getStartTimestamp();
150    $to   = $this->dateRange->getEndTimestamp();
151
152    $query->condition('created', [$from, $to], 'BETWEEN');
153  }
154
155}