aboutsummaryrefslogtreecommitdiffhomepage
path: root/routes
diff options
context:
space:
mode:
authorwinter2025-03-22 19:41:55 +0000
committerwinter2025-03-22 19:41:55 +0000
commit39fcc5d52ac4c6e76ff87d95ef5b4b63300fe071 (patch)
tree75b83a228906064e80160359a76fa3820a9449eb /routes
parentb535baf69b9a2525bc8a33b9c96460b84af8e6e2 (diff)
implement editing pages
Diffstat (limited to 'routes')
-rw-r--r--routes/pages_fragment.php56
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