Expose core as member of JsonPage
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / GetReplyAjaxPage.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import net.pterodactylus.sone.data.PostReply
4 import net.pterodactylus.sone.data.Sone
5 import net.pterodactylus.sone.utils.jsonObject
6 import net.pterodactylus.sone.utils.let
7 import net.pterodactylus.sone.utils.parameters
8 import net.pterodactylus.sone.utils.render
9 import net.pterodactylus.sone.web.WebInterface
10 import net.pterodactylus.sone.web.page.FreenetRequest
11 import net.pterodactylus.util.template.Template
12
13 /**
14  * This AJAX page returns the details of a reply.
15  */
16 class GetReplyAjaxPage(webInterface: WebInterface, private val template: Template) : LoggedInJsonPage("getReply.ajax", webInterface) {
17
18         override fun needsFormPassword() = false
19
20         override fun createJsonObject(currentSone: Sone, request: FreenetRequest) =
21                         request.parameters["reply"]
22                                         .let(core::getPostReply)
23                                         ?.let { it.toJson(currentSone, request) }
24                                         ?.let { replyJson ->
25                                                 createSuccessJsonObject().apply {
26                                                         put("reply", replyJson)
27                                                 }
28                                         } ?: createErrorJsonObject("invalid-reply-id")
29
30         private fun PostReply.toJson(currentSone: Sone, request: FreenetRequest) = jsonObject(*mapOf(
31                         "id" to id,
32                         "soneId" to sone.id,
33                         "postId" to postId,
34                         "time" to time,
35                         "html" to render(currentSone, request)
36         ).toList().toTypedArray())
37
38         private fun PostReply.render(currentSone: Sone, request: FreenetRequest) =
39                         webInterface.templateContextFactory.createTemplateContext().apply {
40                                 set("core", core)
41                                 set("request", request)
42                                 set("reply", this@render)
43                                 set("currentSone", currentSone)
44                         }.let { template.render(it) }
45
46 }