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