Completed
Push — master ( c3ce72...f2565d )
by Paweł
20s
created

ArticleStatisticsService::addNewPageViewEvent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
nc 1
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Superdesk Web Publisher Analytics Bundle.
7
 *
8
 * Copyright 2017 Sourcefabric z.ú. and contributors.
9
 *
10
 * For the full copyright and license information, please see the
11
 * AUTHORS and LICENSE files distributed with this source code.
12
 *
13
 * @copyright 2017 Sourcefabric z.ú
14
 * @license http://www.superdesk.org/license
15
 */
16
17
namespace SWP\Bundle\AnalyticsBundle\Services;
18
19
use SWP\Bundle\AnalyticsBundle\Model\ArticleStatisticsInterface;
20
use SWP\Bundle\ContentBundle\Doctrine\ArticleRepositoryInterface;
21
use SWP\Bundle\ContentBundle\Model\ArticleInterface;
22
use SWP\Component\Storage\Factory\FactoryInterface;
23
use SWP\Component\Storage\Repository\RepositoryInterface;
24
25
/**
26
 * Class ArticleStatisticsService.
27
 */
28
class ArticleStatisticsService implements ArticleStatisticsServiceInterface
29
{
30
    /**
31
     * @var ArticleRepositoryInterface
32
     */
33
    protected $articleRepository;
34
35
    /**
36
     * @var RepositoryInterface
37
     */
38
    protected $articleStatisticsRepository;
39
40
    /**
41
     * @var FactoryInterface
42
     */
43
    protected $articleStatisticsFactory;
44
45
    /**
46
     * @var FactoryInterface
47
     */
48
    protected $articleEventFactory;
49
50
    /**
51
     * ArticleStatisticsService constructor.
52
     *
53
     * @param ArticleRepositoryInterface $articleRepository
54
     * @param RepositoryInterface        $articleStatisticsRepository
55
     * @param FactoryInterface           $articleStatisticsFactory
56
     * @param FactoryInterface           $articleEventFactory
57
     */
58
    public function __construct(ArticleRepositoryInterface $articleRepository, RepositoryInterface $articleStatisticsRepository, FactoryInterface $articleStatisticsFactory, FactoryInterface $articleEventFactory)
59
    {
60
        $this->articleRepository = $articleRepository;
61
        $this->articleStatisticsRepository = $articleStatisticsRepository;
62
        $this->articleStatisticsFactory = $articleStatisticsFactory;
63
        $this->articleEventFactory = $articleEventFactory;
64
    }
65
66
    /**
67
     * @param int    $articleId
68
     * @param string $action
69
     *
70
     * @return ArticleStatisticsInterface
71
     */
72
    public function addArticleEvent(int $articleId, string $action): ArticleStatisticsInterface
73
    {
74
        $articleStatistics = $this->getOrCreateNewArticleStatistics($articleId);
75
        switch ($action) {
76
            case ArticleEventsInterface::ACTION_PAGEVIEW:
77
                $this->addNewPageViewEvent($articleStatistics, $articleId);
78
79
                break;
80
        }
81
82
        return $articleStatistics;
83
    }
84
85
    /**
86
     * @param int $articleId
87
     *
88
     * @return mixed
89
     */
90
    protected function getOrCreateNewArticleStatistics(int $articleId)
91
    {
92
        $articleStatistics = $this->articleStatisticsRepository->findOneBy(['article' => $articleId]);
93
        if (null === $articleStatistics) {
94
            $articleStatistics = $this->articleStatisticsFactory->create();
95
        }
96
97
        return $articleStatistics;
98
    }
99
100
    /**
101
     * @param ArticleStatisticsInterface $articleStatistics
102
     * @param int                        $articleId
103
     */
104
    protected function addNewPageViewEvent(ArticleStatisticsInterface $articleStatistics, int $articleId)
105
    {
106
        /** @var ArticleInterface $article */
107
        $article = $this->articleRepository->findOneBy(['id' => $articleId]);
108
        /** @var ArticleEventsInterface $articleEvent */
109
        $articleEvent = $this->articleEventFactory->create();
110
        $articleEvent->setAction(ArticleEventsInterface::ACTION_PAGEVIEW);
111
        $articleEvent->setArticleStatistics($articleStatistics);
112
        $this->articleStatisticsRepository->persist($articleEvent);
113
        $articleStatistics->addEvent($articleEvent);
114
        $articleStatistics->setArticle($article);
115
        $articleStatistics->increasePageViewsNumber();
116
        $this->articleStatisticsRepository->add($articleStatistics);
117
    }
118
}
119