summaryrefslogtreecommitdiff
path: root/src/application/actions/viewtopic/get.php
blob: 636d791af1256fae2d72425a0f209fe459823281 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php

/** @var Post[] $posts */

use mystic\forum\orm\Attachment;
use mystic\forum\orm\Post;
use mystic\forum\orm\TopicLogMessage;
use mystic\forum\orm\User;

$posts = $db->fetchCustom(Post::class, 'WHERE topic_id = $1 ORDER BY post_date', [ $topicId ]);
/** @var TopicLogMessage[] $logMessages */
$logMessages = $db->fetchCustom(TopicLogMessage::class, 'WHERE topic_id = $1 ORDER BY post_date', [ $topicId ]);
$userCache = [];

$topicAuthor = null;
if ($topic->createdBy !== null) {
    $topicAuthor = new User();
    $topicAuthor->id = $topic->createdBy;
    if (!$db->fetch($topicAuthor)) {
        $topicAuthor = null;
    }
}

$allItems = [...$posts, ...$logMessages];
usort($allItems, fn(Post|TopicLogMessage $a, Post|TopicLogMessage $b): int => $a->postDate <=> $b->postDate);

$allItems = array_map(function(Post|TopicLogMessage $item) use (&$db, &$topicAuthor, &$topic): array {
    /** @var ?User $postAuthor */
    $postAuthor = null;
    if ($item->authorId !== null && !isset($userCache[$item->authorId])) {
        $usr = new User();
        $usr->id = $item->authorId;
        if ($db->fetch($usr))
            $userCache[$item->authorId] = &$usr;
    }
    if (isset($userCache[$item->authorId]))
        $postAuthor = &$userCache[$item->authorId];

    if ($item instanceof Post) {
        $attachments = $db->fetchCustom(Attachment::class, 'WHERE post_id = $1', [ $item->id ]);

        return [
            "type" => "post",
            "post" => $item,
            "postAuthor" => $postAuthor,
            "topicAuthor" => $topicAuthor,
            "attachments" => $attachments,
            "topic" => $topic,
        ];
    } else {
        return [
            "type" => "logMessage",
            "logMessage" => $item,
            "postAuthor" => $postAuthor,
            "topicAuthor" => $topicAuthor,
            "topic" => $topic,
        ];
    }
}, $allItems);

render("view_topic.twig", [
    "topic" => $topic,
    "topicAuthor" => $topicAuthor,
    "allItems" => &$allItems,
]);