Skip to content

Commit dedc8b3

Browse files
Internal: Add tracking to all resource event - refs #6134
1 parent 2d1f0e1 commit dedc8b3

File tree

5 files changed

+116
-15
lines changed

5 files changed

+116
-15
lines changed

src/CoreBundle/Controller/Api/UpdateVisibilityDocument.php

+16-5
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,37 @@
66

77
namespace Chamilo\CoreBundle\Controller\Api;
88

9+
use Chamilo\CoreBundle\Entity\Course;
10+
use Chamilo\CoreBundle\Entity\Session;
911
use Chamilo\CoreBundle\ServiceHelper\CidReqHelper;
1012
use Chamilo\CourseBundle\Entity\CDocument;
1113
use Chamilo\CourseBundle\Repository\CDocumentRepository;
1214
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1315
use Symfony\Component\HttpKernel\Attribute\AsController;
16+
use Doctrine\ORM\EntityManagerInterface;
1417

1518
#[AsController]
1619
class UpdateVisibilityDocument extends AbstractController
1720
{
1821
public function __construct(
1922
private readonly CidReqHelper $cidReqHelper,
23+
private readonly EntityManagerInterface $em,
2024
) {}
2125

2226
public function __invoke(CDocument $document, CDocumentRepository $repo): CDocument
2327
{
24-
$repo->toggleVisibilityPublishedDraft(
25-
$document,
26-
$this->cidReqHelper->getCourseEntity(),
27-
$this->cidReqHelper->getSessionEntity()
28-
);
28+
$course = $this->cidReqHelper->getCourseEntity();
29+
$session = $this->cidReqHelper->getSessionEntity();
30+
31+
if ($course) {
32+
$course = $this->em->getRepository(Course::class)->find($course->getId());
33+
}
34+
35+
if ($session) {
36+
$session = $this->em->getRepository(Session::class)->find($session->getId());
37+
}
38+
39+
$repo->toggleVisibilityPublishedDraft($document, $course, $session);
2940

3041
return $document;
3142
}

src/CoreBundle/Entity/Listener/ResourceLinkListener.php

+21
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,33 @@
77
namespace Chamilo\CoreBundle\Entity\Listener;
88

99
use Chamilo\CoreBundle\Entity\ResourceLink;
10+
use Chamilo\CoreBundle\Repository\TrackEDefaultRepository;
1011
use Doctrine\ORM\Event\PostRemoveEventArgs;
12+
use Doctrine\ORM\Event\PostUpdateEventArgs;
1113
use Doctrine\ORM\Exception\ORMException;
1214
use Event;
15+
use Symfony\Bundle\SecurityBundle\Security;
1316

1417
class ResourceLinkListener
1518
{
19+
public function __construct(
20+
protected Security $security,
21+
protected TrackEDefaultRepository $trackEDefaultRepository
22+
) {}
23+
24+
public function postUpdate(ResourceLink $resourceLink, PostUpdateEventArgs $event): void
25+
{
26+
$changeSet = $event->getObjectManager()->getUnitOfWork()->getEntityChangeSet($resourceLink);
27+
28+
if (isset($changeSet['visibility'])) {
29+
$this->trackEDefaultRepository->registerResourceEvent(
30+
$resourceLink->getResourceNode(),
31+
'visibility_change',
32+
$this->security->getUser()?->getId()
33+
);
34+
}
35+
}
36+
1637
/**
1738
* @throws ORMException
1839
*/

src/CoreBundle/Entity/Listener/ResourceListener.php

+44-8
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
use Chamilo\CoreBundle\Entity\ResourceType;
2020
use Chamilo\CoreBundle\Entity\ResourceWithAccessUrlInterface;
2121
use Chamilo\CoreBundle\Entity\User;
22+
use Chamilo\CoreBundle\Repository\TrackEDefaultRepository;
2223
use Chamilo\CoreBundle\Tool\ToolChain;
2324
use Chamilo\CoreBundle\Traits\AccessUrlListenerTrait;
2425
use Chamilo\CourseBundle\Entity\CCalendarEvent;
2526
use Cocur\Slugify\SlugifyInterface;
27+
use Doctrine\ORM\Event\PostPersistEventArgs;
28+
use Doctrine\ORM\Event\PostRemoveEventArgs;
2629
use Doctrine\ORM\Event\PostUpdateEventArgs;
2730
use Doctrine\ORM\Event\PrePersistEventArgs;
2831
use Doctrine\ORM\Event\PreUpdateEventArgs;
@@ -44,7 +47,8 @@ public function __construct(
4447
protected SlugifyInterface $slugify,
4548
protected ToolChain $toolChain,
4649
protected RequestStack $request,
47-
protected Security $security
50+
protected Security $security,
51+
protected TrackEDefaultRepository $trackEDefaultRepository
4852
) {}
4953

5054
/**
@@ -265,6 +269,45 @@ public function prePersist(AbstractResource $resource, PrePersistEventArgs $even
265269
}
266270
}
267271

272+
public function postPersist(AbstractResource $resource, PostPersistEventArgs $event): void
273+
{
274+
$resourceNode = $resource->getResourceNode();
275+
276+
if ($resourceNode) {
277+
$this->trackEDefaultRepository->registerResourceEvent(
278+
$resourceNode,
279+
'creation',
280+
$this->security->getUser()?->getId()
281+
);
282+
}
283+
}
284+
285+
public function postUpdate(AbstractResource $resource, PostUpdateEventArgs $event): void
286+
{
287+
$resourceNode = $resource->getResourceNode();
288+
289+
if ($resourceNode) {
290+
$this->trackEDefaultRepository->registerResourceEvent(
291+
$resourceNode,
292+
'edition',
293+
$this->security->getUser()?->getId()
294+
);
295+
}
296+
}
297+
298+
public function postRemove(AbstractResource $resource, PostRemoveEventArgs $event): void
299+
{
300+
$resourceNode = $resource->getResourceNode();
301+
302+
if ($resourceNode) {
303+
$this->trackEDefaultRepository->registerResourceEvent(
304+
$resourceNode,
305+
'deletion',
306+
$this->security->getUser()?->getId()
307+
);
308+
}
309+
}
310+
268311
/**
269312
* When updating a Resource.
270313
*/
@@ -281,13 +324,6 @@ public function preUpdate(AbstractResource $resource, PreUpdateEventArgs $eventA
281324
// $this->setLinks($resource, $eventArgs->getEntityManager());
282325
}
283326

284-
public function postUpdate(AbstractResource $resource, PostUpdateEventArgs $eventArgs): void
285-
{
286-
// error_log('resource listener postUpdate');
287-
// $em = $eventArgs->getEntityManager();
288-
// $this->updateResourceName($resource, $resource->getResourceName(), $em);
289-
}
290-
291327
public function updateResourceName(AbstractResource $resource): void
292328
{
293329
$resourceName = $resource->getResourceName();

src/CoreBundle/Repository/TrackEDefaultRepository.php

+32-1
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66

77
namespace Chamilo\CoreBundle\Repository;
88

9+
use Chamilo\CoreBundle\Entity\ResourceNode;
910
use Chamilo\CoreBundle\Entity\TrackEDefault;
1011
use Chamilo\CoreBundle\Entity\ValidationToken;
1112
use DateTime;
1213
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
1314
use Doctrine\Persistence\ManagerRegistry;
1415
use Exception;
1516
use RuntimeException;
17+
use Symfony\Bundle\SecurityBundle\Security;
1618

1719
class TrackEDefaultRepository extends ServiceEntityRepository
1820
{
19-
public function __construct(ManagerRegistry $registry)
21+
public function __construct(ManagerRegistry $registry, private readonly Security $security)
2022
{
2123
parent::__construct($registry, TrackEDefault::class);
2224
}
@@ -102,4 +104,33 @@ public function registerTicketUnsubscribeEvent(int $ticketId, int $userId): void
102104
$this->_em->persist($event);
103105
$this->_em->flush();
104106
}
107+
108+
public function registerResourceEvent(
109+
ResourceNode $resourceNode,
110+
string $eventType,
111+
?int $userId = null
112+
): void {
113+
if (!$userId) {
114+
$user = $this->security->getUser();
115+
if ($user && method_exists($user, 'getId')) {
116+
$userId = $user->getId();
117+
}
118+
}
119+
120+
$link = $resourceNode->getResourceLinks()->first();
121+
$courseId = $link?->getCourse()?->getId();
122+
$sessionId = $link?->getSession()?->getId();
123+
124+
$event = new TrackEDefault();
125+
$event->setDefaultUserId($userId ?? 0);
126+
$event->setCId($courseId);
127+
$event->setSessionId($sessionId);
128+
$event->setDefaultDate(new \DateTime());
129+
$event->setDefaultEventType($eventType);
130+
$event->setDefaultValueType('resource_type_' . ($resourceNode->getResourceType()?->getTitle() ?? 'unknown'));
131+
$event->setDefaultValue((string) $resourceNode->getId());
132+
133+
$this->_em->persist($event);
134+
$this->_em->flush();
135+
}
105136
}

src/CoreBundle/Resources/config/listeners.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ services:
108108

109109
Chamilo\CoreBundle\EventListener\MessageStatusListener: ~
110110

111-
Chamilo\CoreBundle\EventListener\ResourceLinkListener: ~
111+
Chamilo\CoreBundle\Entity\Listener\ResourceLinkListener:
112+
tags:
113+
- { name: doctrine.orm.entity_listener, entity_manager: default, lazy: true }
112114

113115
Chamilo\CoreBundle\EventListener\UserRelCourseVoteListener:
114116
tags:

0 commit comments

Comments
 (0)