zend-blog-3-backend
86 строк · 2.4 Кб
1<?php
2
3namespace App\Cron\Hourly;
4
5use App\Cron\HourlyCronServiceInterface;
6use App\Doctrine\DBAL\Type\MillisecondsDateTime;
7use App\Entity\Post;
8use App\Entity\SystemParameters;
9use App\Entity\Tracking;
10use App\Service\SystemParametersStorage;
11use Doctrine\ORM\EntityManagerInterface;
12
13class PageViewCount implements HourlyCronServiceInterface
14{
15/**
16* @var EntityManagerInterface
17*/
18private EntityManagerInterface $em;
19
20/**
21* @var SystemParametersStorage
22*/
23private SystemParametersStorage $paramStorage;
24
25public function __construct(EntityManagerInterface $em, SystemParametersStorage $paramStorage)
26{
27$this->em = $em;
28$this->paramStorage = $paramStorage;
29}
30
31public function run(): void
32{
33$updatesData = json_decode(
34$this->paramStorage->getParameter(SystemParameters::UPDATE_VIEW_COUNTS_DATA) ?? '{}',
35true,
36512,
37JSON_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();
50try {
51$countersData = [];
52foreach ($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
65throw $e;
66}
67}
68
69public function getMessage(): ?string
70{
71return null;
72}
73
74public function merge(array $a, array $b): array
75{
76foreach ($b as $k => $v) {
77if (isset($a[$k])) {
78$a[$k] += $v;
79} else {
80$a[$k] = $v;
81}
82}
83
84return $a;
85}
86}
87