Skip to content

Commit

Permalink
Merge pull request #42 from prajapati-kaushik/8553-track-page-title-c…
Browse files Browse the repository at this point in the history
…ontent-chagnes-in-wiki_event

perf: track page title content changes in wiki event #8553
  • Loading branch information
prajapati-kaushik committed Jun 5, 2024
2 parents e491f73 + ee906f8 commit a770cb5
Show file tree
Hide file tree
Showing 11 changed files with 317 additions and 89 deletions.
77 changes: 67 additions & 10 deletions Controller/WikiEventController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,48 +4,105 @@

use LinkORB\Bundle\WikiBundle\Entity\Wiki;
use LinkORB\Bundle\WikiBundle\Repository\WikiEventRepository;
use LinkORB\Bundle\WikiBundle\Repository\WikiPageRepository;
use LinkORB\Bundle\WikiBundle\Repository\WikiRepository;
use LinkORB\Bundle\WikiBundle\Services\WikiService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\InvalidArgumentException;

/**
* @Route("/wiki/{wikiName}/events")
* @Route("/wiki/{wikiName}")
*/
class WikiEventController extends AbstractController
{
private $wikiService;
public function __construct(
private WikiService $wikiService,
private WikiRepository $wikiRepository,
private WikiPageRepository $wikiPageRepository,
private WikiEventRepository $wikiEventRepository
) {
}

public function __construct(WikiService $wikiService)
/**
* @Route("/events", name="wiki_event_index", methods={"GET"})
*/
public function indexAction(string $wikiName): Response
{
$this->wikiService = $wikiService;
if (!$wiki = $this->wikiRepository->findOneByName($wikiName)) {
return $this->redirectToRoute('wiki_index');
}

$wikiEvents = $this->wikiEventRepository->findByWikiId($wiki->getId());

if (!$wikiRoles = $this->wikiService->getWikiPermission($wiki)) {
throw new AccessDeniedException('Access denied!');
}
if (!$wikiRoles['readRole']) {
throw new AccessDeniedException('Access denied!');
}

$wikiEvents = $this->wikiEventRepository->findByWikiId($wiki->getId());

$data = $wikiRoles;
$data['wikiEvents'] = $wikiEvents;
$data['wiki'] = $wiki;

return $this->render('@Wiki/wiki_event/index.html.twig', $data);
}

/**
* @Route("", name="wiki_event_index")
* @Route("/events/{eventId}", name="wiki_event_view", methods={"GET"})
*/
public function indexAction($wikiName, WikiRepository $wikiRepository, WikiEventRepository $wikiEventRepository)
public function viewEventAction(string $wikiName, int $eventId): Response
{
if (!$wiki = $wikiRepository->findOneByName($wikiName)) {
if (!$wiki = $this->wikiRepository->findOneByName($wikiName)) {
return $this->redirectToRoute('wiki_index');
}
if (!$wikiRoles = $this->wikiService->getWikiPermission($wiki)) {
throw new AccessDeniedException('Access denied!');
}
if (!$wikiRoles['readRole']) {
throw new AccessDeniedException('Access denied!');
}
if (!$wikiEvent = $this->wikiEventRepository->findOneByWikiIdAndId($wiki->getId(), $eventId)) {
throw new InvalidArgumentException('Event not found!');
}
$data = $wikiRoles;
$data['wikiEvent'] = $wikiEvent;
$data['wiki'] = $wiki;

$wikiEvents = $wikiEventRepository->findByWikiId($wiki->getId());
return $this->render('@Wiki/wiki_event/view.html.twig', $data);
}

/**
* @Route("/{pageName}/events", name="wiki_page_event_index", methods={"GET"})
*/
public function wikiPageEventsAction(string $wikiName, string $pageName): Response
{
if (!$wiki = $this->wikiRepository->findOneByName($wikiName)) {
return $this->redirectToRoute('wiki_index');
}
if (!$wikiRoles = $this->wikiService->getWikiPermission($wiki)) {
throw new AccessDeniedException('Access denied!');
}
if (!$wikiRoles['readRole']) {
throw new AccessDeniedException('Access denied!');
}

$wikiEvents = $wikiEventRepository->findByWikiId($wiki->getId());
if (!$wikiPage = $this->wikiPageRepository->findOneByWikiIdAndName($wiki->getId(), $pageName)) {
throw new InvalidArgumentException('Page not found!');
}

$wikiEvents = $this->wikiEventRepository->findByWikiPageId($wikiPage->getId());

$data = $wikiRoles;
$data['wikiEvents'] = $wikiEvents;
$data['wiki'] = $wiki;
$data['wikiPage'] = $wikiPage;

return $this->render('@Wiki/wiki_event/index.html.twig', $data);
return $this->render('@Wiki/wiki_event/page_event.html.twig', $data);
}
}
85 changes: 59 additions & 26 deletions Controller/WikiPageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ public function editAction(Request $request, Wiki $wiki, WikiEventService $wikiE
throw new AccessDeniedException('Access denied!');
}

$wikiPageBeforeTitle = $wikiPage->getName();
$wikiPageBeforeContent = $wikiPage->getContent();

$form = $this->createForm(WikiPageContentType::class, $wikiPage);
$form->handleRequest($request);

Expand All @@ -174,6 +177,24 @@ public function editAction(Request $request, Wiki $wiki, WikiEventService $wikiE
$this->em->persist($wikiPage);
$this->em->flush();

$eventData = [
'updatedAt' => time(),
'updatedBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
];
if (0 !== strcmp($wikiPageBeforeContent, $wikiPage->getContent())) {
$eventData['changes'][] = $wikiEventService->fieldDataChangeArray(
'content', $wikiPageBeforeContent, $wikiPage->getContent()
);
}

$wikiEventService->createEvent(
'page.updated',
$wikiPage->getWiki()->getId(),
json_encode($eventData),
$wikiPage->getId()
);

$this->publishPage($wikiPage);

return new JsonResponse(['status' => 'success']);
Expand All @@ -182,14 +203,26 @@ public function editAction(Request $request, Wiki $wiki, WikiEventService $wikiE
if ($form->isSubmitted() && $form->isValid()) {
$this->em->flush();

$eventData = [
'updatedAt' => time(),
'updatedBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
];
if (0 !== strcmp($wikiPageBeforeTitle, $wikiPage->getName())) {
$eventData['changes'][] = $wikiEventService->fieldDataChangeArray(
'title', $wikiPageBeforeTitle, $wikiPage->getName()
);
}
if (0 !== strcmp($wikiPageBeforeContent, $wikiPage->getContent())) {
$eventData['changes'][] = $wikiEventService->fieldDataChangeArray(
'content', $wikiPageBeforeContent, $wikiPage->getContent()
);
}

$wikiEventService->createEvent(
'page.updated',
$wikiPage->getWiki()->getId(),
json_encode([
'updatedAt' => time(),
'updatedBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
]),
json_encode($eventData),
$wikiPage->getId()
);

Expand Down Expand Up @@ -252,6 +285,8 @@ protected function getEditForm($request, $wikiPage, WikiEventService $wikiEventS
if (!$wikiRoles['writeRole']) {
throw new AccessDeniedException('Access denied!');
}
$wikiPageBeforeTitle = $wikiPage?->getName();
$wikiPageBeforeContent = $wikiPage?->getContent();

$form = $this->createForm(WikiPageType::class, $wikiPage);
$form->handleRequest($request);
Expand All @@ -268,34 +303,32 @@ protected function getEditForm($request, $wikiPage, WikiEventService $wikiEventS
}
}
}

$this->em->persist($wikiPage);
$this->em->flush();

if ($add) {
$wikiEventService->createEvent(
'page.created',
$wikiPage->getWiki()->getId(),
json_encode([
'createdAt' => time(),
'createdBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
]),
$wikiPage->getId()
$eventData = [
'createdAt' => time(),
'createdBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
];
if (0 !== strcmp($wikiPageBeforeTitle, $wikiPage->getName())) {
$eventData['changes'][] = $wikiEventService->fieldDataChangeArray(
'title', $wikiPageBeforeTitle, $wikiPage->getName()
);
} else {
$wikiEventService->createEvent(
'page.updated',
$wikiPage->getWiki()->getId(),
json_encode([
'updatedAt' => time(),
'updatedBy' => $this->getUser() ? $this->getUser()->getUsername() : '',
'name' => $wikiPage->getName(),
]),
$wikiPage->getId()
}
if (0 !== strcmp($wikiPageBeforeContent, $wikiPage->getContent())) {
$eventData['changes'][] = $wikiEventService->fieldDataChangeArray(
'content', $wikiPageBeforeContent, $wikiPage->getContent()
);
}

$wikiEventService->createEvent(
$add ? 'page.created' : 'page.updated',
$wikiPage->getWiki()->getId(),
json_encode($eventData),
$wikiPage->getId()
);

$this->publishPage($wikiPage);

if ($add) {
Expand Down
7 changes: 7 additions & 0 deletions Entity/WikiEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ class WikiEvent
{
/**
* @ORM\Id()
*
* @ORM\GeneratedValue()
*
* @ORM\Column(type="integer")
*/
private $id;
Expand Down Expand Up @@ -122,4 +124,9 @@ public function setWikiId(?int $wiki_id): self

return $this;
}

public function getDataArray(): ?array
{
return json_decode($this->data, true);
}
}
11 changes: 10 additions & 1 deletion Repository/WikiEventRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use LinkORB\Bundle\WikiBundle\Entity\WikiEvent;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
* @method WikiEvent|null find($id, $lockMode = null, $lockVersion = null)
Expand All @@ -24,4 +23,14 @@ public function findByWikiId($wikiId)
{
return $this->findBy(['wiki_id' => $wikiId]);
}

public function findByWikiPageId(int $wikiPageId)
{
return $this->findBy(['wiki_page_id' => $wikiPageId]);
}

public function findOneByWikiIdAndId(int $wikiId, int $id)
{
return $this->findOneBy(['wiki_id' => $wikiId, 'id' => $id]);
}
}
7 changes: 7 additions & 0 deletions Resources/views/base.wiki.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,13 @@
List pages
</a>

{% if wikiPage is defined %}
<a href="{{ path('wiki_page_event_index',{'wikiName': wiki.name, 'pageName': wikiPage.name}) }}" class="btn btn-sm btn-secondary">
<i class="fa fa-list" aria-hidden="true"></i>
page Events
</a>
{% endif %}

{% if is_granted('ROLE_SUPERUSER') or writeRole is defined %}
<a href="{{ path('wiki_page_add',{'wikiName': wiki.name}) }}" class="btn btn-sm btn-success">
<i class="fa fa-plus" aria-hidden="true"></i>
Expand Down
29 changes: 1 addition & 28 deletions Resources/views/wiki_event/index.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,8 @@
{% block body %}
<h1>Events</h1>


<fieldset>
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Type</th>
<th>Created At</th>
<th>Created By</th>
</tr>
</thead>
<tbody>
{% for wikiEvent in wikiEvents %}
<tr>
<td>{{ wikiEvent.id }}</td>
<td>
<b>{{ wikiEvent.type }}</b><br />
{{ wikiEvent.data }}
</td>
<td>{{ wikiEvent.createdAt|date() }}</td>
<td>{{ wikiEvent.createdBy }}</td>
</tr>
{% else %}
<tr>
<td colspan="5">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
{% include '@Wiki/wiki_event/list.html.twig' %}
</fieldset>

{% endblock %}
29 changes: 29 additions & 0 deletions Resources/views/wiki_event/list.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Type</th>
<th>Created At</th>
<th>Created By</th>
</tr>
</thead>
<tbody>
{% for wikiEvent in wikiEvents %}
<tr>
<th>
<a href="{{ path('wiki_event_view', {'eventId': wikiEvent.id, 'wikiName': wiki.name}) }}">{{ wikiEvent.id }}</a>
</th>
<td>
<b>{{ wikiEvent.type }}</b><br />
{{ wikiEvent.data }}
</td>
<td>{{ wikiEvent.createdAt|date() }}</td>
<td>{{ wikiEvent.createdBy }}</td>
</tr>
{% else %}
<tr>
<td colspan="5">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
12 changes: 12 additions & 0 deletions Resources/views/wiki_event/page_event.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% extends '@Wiki/base.wiki.html.twig' %}

{% block title %}Wiki: {{ wiki.name }} :: page: {{ wikiPage.name }} :Events {% endblock %}

{% block body %}
<h1>Events</h1>

<fieldset>
{% include '@Wiki/wiki_event/list.html.twig' %}
</fieldset>

{% endblock %}
Loading

0 comments on commit a770cb5

Please sign in to comment.