zend-blog-3-backend

Форк
0
/
PageViewCount.php 
86 строк · 2.4 Кб
1
<?php
2

3
namespace App\Cron\Hourly;
4

5
use App\Cron\HourlyCronServiceInterface;
6
use App\Doctrine\DBAL\Type\MillisecondsDateTime;
7
use App\Entity\Post;
8
use App\Entity\SystemParameters;
9
use App\Entity\Tracking;
10
use App\Service\SystemParametersStorage;
11
use Doctrine\ORM\EntityManagerInterface;
12

13
class PageViewCount implements HourlyCronServiceInterface
14
{
15
    /**
16
     * @var EntityManagerInterface
17
     */
18
    private EntityManagerInterface $em;
19

20
    /**
21
     * @var SystemParametersStorage
22
     */
23
    private SystemParametersStorage $paramStorage;
24

25
    public function __construct(EntityManagerInterface $em, SystemParametersStorage $paramStorage)
26
    {
27
        $this->em = $em;
28
        $this->paramStorage = $paramStorage;
29
    }
30

31
    public function run(): void
32
    {
33
        $updatesData = json_decode(
34
            $this->paramStorage->getParameter(SystemParameters::UPDATE_VIEW_COUNTS_DATA) ?? '{}',
35
            true,
36
            512,
37
            JSON_THROW_ON_ERROR
38
        );
39

40
        $from = $this->paramStorage->getParameter(SystemParameters::UPDATE_VIEW_COUNTS_FROM) ?? '2023-06-01 00:00:00';
41
        $now = (new \DateTime())->format(MillisecondsDateTime::FORMAT_TIME);
42

43
        $trackingRepo = $this->em->getRepository(Tracking::class);
44
        $info = $trackingRepo->getViewCountsInfo($from, $now);
45

46
        $articleRepository = $this->em->getRepository(Post::class);
47
        $conn = $this->em->getConnection();
48

49
        $conn->beginTransaction();
50
        try {
51
            $countersData = [];
52
            foreach ($info as $item) {
53
                $articleRepository->increaseViewCounter($item['id'], (int)$item['cnt']);
54
                $countersData['ID' . $item['id']] = (int)$item['cnt'];
55
            }
56

57
            $countersData = $this->merge($countersData, $updatesData);
58
            $this->paramStorage->saveParameter(SystemParameters::UPDATE_VIEW_COUNTS_DATA, json_encode($countersData));
59

60
            $this->paramStorage->saveParameter(SystemParameters::UPDATE_VIEW_COUNTS_FROM, $now);
61
            $conn->commit();
62
        } catch (\Throwable $e) {
63
            $conn->rollBack();
64

65
            throw $e;
66
        }
67
    }
68

69
    public function getMessage(): ?string
70
    {
71
        return null;
72
    }
73

74
    public function merge(array $a, array $b): array
75
    {
76
        foreach ($b as $k => $v) {
77
            if (isset($a[$k])) {
78
                $a[$k] += $v;
79
            } else {
80
                $a[$k] = $v;
81
            }
82
        }
83

84
        return $a;
85
    }
86
}
87

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.