diff options
| author | winter | 2025-03-15 18:35:59 +0000 |
|---|---|---|
| committer | winter | 2025-03-15 18:52:54 +0000 |
| commit | 61b122e88cc6783b4d0cf5142a22002f8e558c60 (patch) | |
| tree | 847b864a93f716157456891d4526077e5f0b93f7 /routes/pages.php | |
| parent | cb904ef3fb05ab106d5e5e12f6273b8117db4216 (diff) | |
implement pages
Diffstat (limited to 'routes/pages.php')
| -rw-r--r-- | routes/pages.php | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/routes/pages.php b/routes/pages.php new file mode 100644 index 0000000..03ec4d4 --- /dev/null +++ b/routes/pages.php @@ -0,0 +1,76 @@ +<?php + +use Digitigrade\FormattingProvider\CommonMark; +use Digitigrade\HttpResponseStatus\Forbidden; +use Digitigrade\HttpResponseStatus\NotFound; +use Digitigrade\HttpResponseStatus\PolicyRejected; +use Digitigrade\HttpResponseStatus\TemporaryRedirect; +use Digitigrade\Model\Note; +use Digitigrade\Model\NotePrivacyScope; +use Digitigrade\Model\UserAccount; +use Digitigrade\Page; +use Digitigrade\PolicyManager; +use Digitigrade\Router; + +Router::getInstance()->mount('/pages', function (array $args) { + // list all pages + // it would be silly to show this to logged out users honestly + UserAccount::requireByCurrentSession(); + render_template('pages_list_page'); +}); + +Router::getInstance()->mount('/pages/new', function (array $args) { + // creating a new page + $user = UserAccount::requireByCurrentSession(); + if (isset($_POST['title'])) { + $title = trim($_POST['title']); + $body = trim($_POST['body']); + $note = Note::create( + $user->actor, + $title, + get_ui_language(), // TODO: actual language selector/detection + null, + NotePrivacyScope::from($_POST['scope']) + ); + $note->plainContent .= ' - ' . path_to_uri($note->getLocalUiHref(true)); + $note->setPage(Page::create($title, [ + 'text/markdown' => $body, + 'text/html' => CommonMark::getInstance()->renderToHtml($body) + ])); + if (!PolicyManager::getInstance()->check($note)) { + $note->remove(); + throw new PolicyRejected(); + } + $note->save(); + $note->publish(); + $note->processTimelineAdditions(); + $note->processNotifications(); + + throw new TemporaryRedirect($note->getLocalUiHref(true)); + } else { + render_template('pages_new_page'); + } +}); + +Router::getInstance()->mount('/@/:handle/page/:id', function (array $args) { + $note = Note::find($args['id']); + if ($note == null || $note->deleted) { + throw new NotFound("i don't know that note"); + } + // check the current user is allowed to see it + if ($note->privacy->scope != NotePrivacyScope::PUBLIC ) { + $user = UserAccount::requireByCurrentSession(); + if (!in_array($user->actor, $note->getRelevantActors())) { + throw new Forbidden(); + } + } + // go back to the note if it's not a page + if (!$note->hasPage()) { + throw new TemporaryRedirect($note->getLocalUiHref()); + } + // change the handle in the url if it's wrong + if ($args['handle'] != $note->author->getFullHandle()) { + throw new TemporaryRedirect($note->getLocalUiHref(true)); + } + render_template('note_page', ['note' => $note]); +});
\ No newline at end of file |
