Completed
Push — master ( 2e6749...8bcd18 )
by Sam
02:24
created

StatisticsManager::getTimeIntervalTimestamp()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 12
rs 9.4285
cc 2
eloc 6
nc 2
nop 1
1
<?php
2
3
namespace Jalle19\StatusManager\Manager;
4
5
use Jalle19\StatusManager\Database\InstanceQuery;
6
use Jalle19\StatusManager\Database\SubscriptionQuery;
7
use Jalle19\StatusManager\Database\UserQuery;
8
use Jalle19\StatusManager\Message\AbstractMessage;
9
use Jalle19\StatusManager\Message\Handler\HandlerInterface;
10
use Jalle19\StatusManager\Message\Request\PopularChannelsRequest;
11
use Jalle19\StatusManager\Message\Request\StatisticsRequest;
12
use Jalle19\StatusManager\Message\Response\PopularChannelsResponse;
13
use Propel\Runtime\ActiveQuery\Criteria;
14
15
/**
16
 * Class StatisticsManager
17
 * @package   Jalle19\StatusManager\Manager
18
 * @copyright Copyright &copy; Sam Stenvall 2016-
19
 * @license   https://www.gnu.org/licenses/gpl.html The GNU General Public License v2.0
20
 */
21
class StatisticsManager extends AbstractManager implements HandlerInterface
22
{
23
24
	/**
25
	 * @inheritdoc
26
	 */
27
	public function handleMessage(AbstractMessage $message)
28
	{
29
		switch ($message->getType())
30
		{
31
			case AbstractMessage::TYPE_POPULAR_CHANNELS_REQUEST:
32
				/* @var PopularChannelsRequest $message */
33
				return new PopularChannelsResponse($message, $this->getPopularChannels(
34
					$message->getInstanceName(),
35
					$message->getUserName(),
36
					$message->getLimit(),
37
					$message->getTimeInterval()));
38
		}
39
40
		return false;
41
	}
42
43
44
	/**
45
	 * @param string      $instanceName
46
	 * @param string|null $userName
47
	 * @param int|null    $limit
48
	 * @param string      $timeInterval
49
	 *
50
	 * @return array the popular channels
51
	 */
52
	private function getPopularChannels($instanceName, $userName, $limit, $timeInterval)
53
	{
54
		// Find the instance and the user
55
		$instance = InstanceQuery::create()->findOneByName($instanceName);
56
		$user     = UserQuery::create()->findOneByName($userName);
57
58
		// Find the subscriptions
59
		$query = SubscriptionQuery::create();
60
		$query->withColumn('channel.name', 'channelName');
61
		$query->withColumn('user.name', 'userName');
62
		$query->withColumn('SUM((julianday(subscription.stopped) - julianday(subscription.started)) * 86400)',
63
			'totalTimeSeconds');
64
65
		$query->select(['channelName', 'userName', 'totalTimeSeconds']);
66
		$query->joinChannel('channel');
67
		$query->joinUser('user');
68
		$query->filterByInstance($instance);
69
		$query->filterByStopped(null, Criteria::NOT_EQUAL);
70
		$query->groupBy('channelName');
71
		$query->orderBy('totalTimeSeconds', Criteria::DESC);
72
73
		// Apply various filters
74
		if ($user !== null)
75
			$query->filterByUser($user);
76
77
		if ($limit !== null)
78
			$query->limit($limit);
79
80
		if ($timeInterval !== StatisticsRequest::TIME_INTERVAL_ALL_TIME)
81
		{
82
			$query->filterByStopped([
83
				'min' => $this->getTimeIntervalTimestamp($timeInterval),
84
			]);
85
		}
86
87
		return $query->find()->getData();
88
	}
89
90
91
	/**
92
	 * @param string $timeInterval
93
	 *
94
	 * @return int
95
	 */
96
	private function getTimeIntervalTimestamp($timeInterval)
97
	{
98
		$dateTime = new \DateTime();
99
100
		switch ($timeInterval)
101
		{
102
			case StatisticsRequest::TIME_INTERVAL_LAST_MONTH:
103
				$dateTime = $dateTime->modify('-1 month');
104
		}
105
106
		return $dateTime->getTimestamp();
107
	}
108
109
}
110