201 lines
6.9 KiB
PHP
201 lines
6.9 KiB
PHP
<?php
|
|
|
|
namespace Leantime\Domain\Wiki\Controllers;
|
|
|
|
use Illuminate\Contracts\Container\BindingResolutionException;
|
|
use Leantime\Core\Auth\Permissions\RequiresPermission;
|
|
use Leantime\Core\Controller\Controller;
|
|
use Leantime\Core\Controller\Frontcontroller;
|
|
use Leantime\Domain\Comments\Services\Comments as CommentService;
|
|
use Leantime\Domain\Tickets\Services\Tickets as TicketService;
|
|
use Leantime\Domain\Wiki\Permissions\WikiPermissions;
|
|
use Leantime\Domain\Wiki\Services\Wiki as WikiService;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class Show extends Controller
|
|
{
|
|
private WikiService $wikiService;
|
|
|
|
private CommentService $commentService;
|
|
|
|
private TicketService $ticketService;
|
|
|
|
public function init(WikiService $wikiService, CommentService $commentService, TicketService $ticketService): void
|
|
{
|
|
$this->wikiService = $wikiService;
|
|
$this->commentService = $commentService;
|
|
$this->ticketService = $ticketService;
|
|
}
|
|
|
|
/**
|
|
* @throws BindingResolutionException
|
|
*/
|
|
#[RequiresPermission(WikiPermissions::VIEW)]
|
|
public function get(array $params): Response
|
|
{
|
|
|
|
$currentArticle = '';
|
|
$wikiHeadlines = [];
|
|
|
|
// Get all project wikis, creates one if none exists
|
|
$wikis = $this->wikiService->getAllProjectWikis(session('currentProject'));
|
|
|
|
// Special case: Setting wiki (active action), set wiki, headlines and current Article
|
|
if (isset($_GET['setWiki'])) {
|
|
|
|
$wikiId = (int) $_GET['setWiki'];
|
|
|
|
return $this->setWikiAndRedirect($wikiId);
|
|
|
|
}
|
|
|
|
if (isset($params['id'])) {
|
|
|
|
$currentArticle = $this->wikiService->setCurrentArticle($params['id'], session('usersettings.id'));
|
|
|
|
if ($currentArticle === false) {
|
|
$this->wikiService->clearWikiCache();
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/errors/error404');
|
|
}
|
|
|
|
} elseif (
|
|
session()->exists('lastArticle') &&
|
|
session('lastArticle') != '' &&
|
|
! isset($params['id'])) {
|
|
|
|
$currentArticle = $this->wikiService->setCurrentArticle(session('lastArticle'), session('usersettings.id'));
|
|
|
|
if ($currentArticle) {
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/'.$currentArticle->id);
|
|
}
|
|
|
|
// If neither session is set nor the params id we are coming in fresh. Grab the article from wiki if there is one
|
|
} else {
|
|
|
|
// False is okay, just an empty wiki
|
|
$success = $this->wikiService->setCurrentWiki(session('currentWiki'));
|
|
if ($success === false) {
|
|
|
|
// Try getting the first wiki
|
|
$success = $this->wikiService->setCurrentWiki($wikis[0]->id);
|
|
|
|
if ($success === false) {
|
|
$this->wikiService->clearWikiCache();
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/errors/error404');
|
|
}
|
|
}
|
|
|
|
$defaultArticle = $this->wikiService->getDefaultArticleForWiki(session('currentWiki'), session('userdata.id'));
|
|
if ($defaultArticle !== false) {
|
|
session(['lastArticle' => $defaultArticle->id]);
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/'.$defaultArticle->id);
|
|
}
|
|
// If not it's really just empty.
|
|
|
|
}
|
|
|
|
// At this point we should have a currentWiki. Even if non exist
|
|
$wikiHeadlines = $this->wikiService->getAllWikiHeadlines(session('currentWiki'), session('userdata.id'));
|
|
if (! $wikiHeadlines) {
|
|
$wikiHeadlines = [];
|
|
}
|
|
|
|
// Get the actual wiki content
|
|
$currentWiki = $this->wikiService->getWiki(session('currentWiki'));
|
|
if (empty($currentWiki)) {
|
|
$this->wikiService->clearWikiCache();
|
|
|
|
// If we can't find a current wiki at this point something went wrong
|
|
return Frontcontroller::redirect(BASE_URL.'/errors/error404');
|
|
}
|
|
|
|
// Delete comment
|
|
if (isset($_GET['delComment']) === true) {
|
|
$commentId = (int) ($_GET['delComment']);
|
|
|
|
$this->commentService->deleteComment($commentId);
|
|
|
|
$this->tpl->setNotification($this->language->__('notifications.comment_deleted'), 'success', 'wikicomment_deleted');
|
|
}
|
|
|
|
if (isset($currentArticle->id)) {
|
|
$comment = $this->commentService->getComments('article', $currentArticle->id, 0);
|
|
} else {
|
|
$comment = [];
|
|
}
|
|
|
|
// Get all milestones for the project
|
|
$allProjectMilestones = $this->ticketService->getAllMilestones([
|
|
'sprint' => '',
|
|
'type' => 'milestone',
|
|
'currentProject' => session('currentProject'),
|
|
]);
|
|
|
|
$this->tpl->assign('comments', $comment);
|
|
$this->tpl->assign('numComments', count($comment));
|
|
$this->tpl->assign('currentArticle', $currentArticle);
|
|
$this->tpl->assign('currentWiki', $currentWiki);
|
|
$this->tpl->assign('wikis', $wikis);
|
|
$this->tpl->assign('wikiHeadlines', $wikiHeadlines);
|
|
$this->tpl->assign('milestones', $allProjectMilestones);
|
|
|
|
return $this->tpl->display('wiki.show');
|
|
}
|
|
|
|
/**
|
|
* @throws BindingResolutionException
|
|
*/
|
|
#[RequiresPermission(WikiPermissions::VIEW)]
|
|
public function post(array $params): Response
|
|
{
|
|
|
|
if (isset($_GET['id']) === true) {
|
|
$id = (int) ($_GET['id']);
|
|
$currentArticle = $this->wikiService->getArticle($id, session('currentProject'));
|
|
|
|
if (isset($_POST['comment']) === true) {
|
|
if ($this->commentService->addComment($_POST, 'article', $id, $currentArticle)) {
|
|
$this->tpl->setNotification(
|
|
$this->language->__('notifications.comment_create_success'),
|
|
'success',
|
|
'wikicomment_created'
|
|
);
|
|
} else {
|
|
$this->tpl->setNotification($this->language->__('notifications.comment_create_error'), 'error');
|
|
}
|
|
}
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/'.$id);
|
|
}
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/');
|
|
}
|
|
|
|
protected function setWikiAndRedirect($id): Response
|
|
{
|
|
|
|
$this->wikiService->clearWikiCache();
|
|
|
|
$success = $this->wikiService->setCurrentWiki($id);
|
|
|
|
if ($success === false) {
|
|
$this->wikiService->clearWikiCache();
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/errors/error404');
|
|
}
|
|
|
|
$defaultArticle = $this->wikiService->getDefaultArticleForWiki($id, session('userdata.id'));
|
|
if ($defaultArticle !== false) {
|
|
session(['lastArticle' => $defaultArticle->id]);
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/'.$defaultArticle->id);
|
|
}
|
|
|
|
return Frontcontroller::redirect(BASE_URL.'/wiki/show/');
|
|
|
|
}
|
|
}
|