aboutsummaryrefslogtreecommitdiffhomepage
path: root/routes/pages.php
diff options
context:
space:
mode:
authorwinter2025-03-15 18:35:59 +0000
committerwinter2025-03-15 18:52:54 +0000
commit61b122e88cc6783b4d0cf5142a22002f8e558c60 (patch)
tree847b864a93f716157456891d4526077e5f0b93f7 /routes/pages.php
parentcb904ef3fb05ab106d5e5e12f6273b8117db4216 (diff)
implement pages
Diffstat (limited to 'routes/pages.php')
-rw-r--r--routes/pages.php76
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