diff options
| author | winter | 2025-03-22 19:41:55 +0000 |
|---|---|---|
| committer | winter | 2025-03-22 19:41:55 +0000 |
| commit | 39fcc5d52ac4c6e76ff87d95ef5b4b63300fe071 (patch) | |
| tree | 75b83a228906064e80160359a76fa3820a9449eb /routes/pages_fragment.php | |
| parent | b535baf69b9a2525bc8a33b9c96460b84af8e6e2 (diff) | |
implement editing pages
Diffstat (limited to 'routes/pages_fragment.php')
| -rw-r--r-- | routes/pages_fragment.php | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/routes/pages_fragment.php b/routes/pages_fragment.php new file mode 100644 index 0000000..886fc81 --- /dev/null +++ b/routes/pages_fragment.php @@ -0,0 +1,56 @@ +<?php + +use Digitigrade\FormattingProvider\CommonMark; +use Digitigrade\HttpResponseStatus\BadRequest; +use Digitigrade\HttpResponseStatus\Forbidden; +use Digitigrade\HttpResponseStatus\PolicyRejected; +use Digitigrade\Model\Note; +use Digitigrade\Model\UserAccount; +use Digitigrade\Notification\AdminEditedNoteNotif; +use Digitigrade\PolicyManager; +use Digitigrade\Router; + +Router::getInstance()->mount('/fragment/page/:id', function (array $args) { + $note = Note::find($args['id']); + render_template('pages/page_item', ['note' => $note, 'page' => $note->getPage()]); +}); + +Router::getInstance()->mount('/fragment/page/:id/edit', function (array $args) { + // edit form for a page + $note = Note::find($args['id']); + $user = UserAccount::requireByCurrentSession(); + if ($note->author != $user->actor && !$user->isAdmin) { + throw new Forbidden('you may not edit that page!'); + } + if (!$note->author->isLocal) { + throw new BadRequest("can't edit a non-local page"); + } + + if (isset($_POST['title'])) { + $title = trim($_POST['title']); + $body = trim($_POST['body']); + + $page = $note->getPage(); + $page->title = $title; + $page->content = [ + 'text/markdown' => $body, + 'text/html' => CommonMark::getInstance()->renderToHtml($body) + ]; + + $note->setPage($page); + $note->modified = new DateTimeImmutable(); + if (!PolicyManager::getInstance()->check($note)) { + throw new PolicyRejected(); + } + $note->save(); + $note->publish(); + + if ($user->actor != $note->author) { + (new AdminEditedNoteNotif($user, $note))->processNotifications(); + } + + render_template('pages/page_item', ['note' => $note, 'page' => $page]); + } else { + render_template('pages/editable', ['note' => $note, 'page' => $note->getPage()]); + } +});
\ No newline at end of file |
