121 lines
3.9 KiB
PHP
121 lines
3.9 KiB
PHP
<?php
|
|
namespace Misuzu;
|
|
|
|
use DateTimeInterface;
|
|
use RuntimeException;
|
|
use Index\DateTime;
|
|
use Misuzu\Changelog\Changelog;
|
|
use Misuzu\Users\User;
|
|
use Misuzu\Users\UserNotFoundException;
|
|
|
|
require_once '../../../misuzu.php';
|
|
|
|
if(!User::hasCurrent() || !perms_check_user(MSZ_PERMS_CHANGELOG, User::getCurrent()->getId(), MSZ_PERM_CHANGELOG_MANAGE_CHANGES)) {
|
|
echo render_error(403);
|
|
return;
|
|
}
|
|
|
|
$changeActions = [];
|
|
foreach(Changelog::ACTIONS as $action)
|
|
$changeActions[$action] = Changelog::actionText($action);
|
|
|
|
$changelog = $msz->getChangelog();
|
|
$changeId = (string)filter_input(INPUT_GET, 'c', FILTER_SANITIZE_NUMBER_INT);
|
|
$loadChangeInfo = fn() => $changelog->getChangeById($changeId, withTags: true);
|
|
$changeTags = $changelog->getAllTags();
|
|
|
|
if(empty($changeId))
|
|
$isNew = true;
|
|
else
|
|
try {
|
|
$isNew = false;
|
|
$changeInfo = $loadChangeInfo();
|
|
} catch(RuntimeException $ex) {
|
|
echo render_error(404);
|
|
return;
|
|
}
|
|
|
|
if($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_GET['delete'])) {
|
|
if(CSRF::validateRequest()) {
|
|
$changelog->deleteChange($changeInfo);
|
|
$msz->createAuditLog('CHANGELOG_ENTRY_DELETE', [$changeInfo->getId()]);
|
|
url_redirect('manage-changelog-changes');
|
|
} else render_error(403);
|
|
return;
|
|
}
|
|
|
|
// make errors not echos lol
|
|
while($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) {
|
|
$action = trim((string)filter_input(INPUT_POST, 'cl_action'));
|
|
$summary = trim((string)filter_input(INPUT_POST, 'cl_summary'));
|
|
$body = trim((string)filter_input(INPUT_POST, 'cl_body'));
|
|
$userId = (int)filter_input(INPUT_POST, 'cl_user', FILTER_SANITIZE_NUMBER_INT);
|
|
$createdAt = trim((string)filter_input(INPUT_POST, 'cl_created'));
|
|
$tags = filter_input(INPUT_POST, 'cl_tags', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
|
|
|
|
if($userId < 1) $userId = null;
|
|
else $userId = (string)$userId;
|
|
|
|
if(empty($createdAt))
|
|
$createdAt = null;
|
|
else {
|
|
$createdAt = DateTime::createFromFormat(DateTimeInterface::ATOM, $createdAt . ':00Z');
|
|
if($createdAt->getUnixTimeSeconds() < 0)
|
|
$createdAt = null;
|
|
}
|
|
|
|
if($isNew) {
|
|
$changeInfo = $changelog->createChange($action, $summary, $body, $userId, $createdAt);
|
|
} else {
|
|
if($action === $changeInfo->getAction())
|
|
$action = null;
|
|
if($summary === $changeInfo->getSummary())
|
|
$summary = null;
|
|
if($body === $changeInfo->getBody())
|
|
$body = null;
|
|
if($createdAt !== null && $createdAt->equals($changeInfo->getCreatedAt()))
|
|
$createdAt = null;
|
|
$updateUserInfo = $userId !== $changeInfo->getUserId();
|
|
|
|
if($action !== null || $summary !== null || $body !== null || $createdAt !== null || $updateUserInfo)
|
|
$changelog->updateChange($changeInfo, $action, $summary, $body, $updateUserInfo, $userId, $createdAt);
|
|
}
|
|
|
|
if(!empty($tags)) {
|
|
$tCurrent = $changeInfo->getTagIds();
|
|
$tApply = $tags;
|
|
$tRemove = [];
|
|
|
|
foreach($tCurrent as $tag)
|
|
if(!in_array($tag, $tApply)) {
|
|
$tRemove[] = $tag;
|
|
$changelog->removeTagFromChange($changeInfo, $tag);
|
|
}
|
|
|
|
$tCurrent = array_diff($tCurrent, $tRemove);
|
|
|
|
foreach($tApply as $tag)
|
|
if(!in_array($tag, $tCurrent)) {
|
|
$changelog->addTagToChange($changeInfo, $tag);
|
|
$tCurrent[] = $tag;
|
|
}
|
|
}
|
|
|
|
$msz->createAuditLog(
|
|
$isNew ? 'CHANGELOG_ENTRY_CREATE' : 'CHANGELOG_ENTRY_EDIT',
|
|
[$changeInfo->getId()]
|
|
);
|
|
|
|
if($isNew) {
|
|
url_redirect('manage-changelog-change', ['change' => $changeInfo->getId()]);
|
|
return;
|
|
} else $changeInfo = $loadChangeInfo();
|
|
break;
|
|
}
|
|
|
|
Template::render('manage.changelog.change', [
|
|
'change_new' => $isNew,
|
|
'change_info' => $changeInfo ?? null,
|
|
'change_tags' => $changeTags,
|
|
'change_actions' => $changeActions,
|
|
]);
|