1 package net.pterodactylus.sone.web.ajax
3 import net.pterodactylus.sone.data.Post
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.web.WebInterface
9 import net.pterodactylus.sone.web.page.FreenetRequest
10 import net.pterodactylus.util.template.Template
11 import net.pterodactylus.util.template.TemplateContext
12 import java.io.StringWriter
15 * This AJAX handler retrieves information and rendered representation of a [Post].
17 class GetPostAjaxPage(webInterface: WebInterface, private val postTemplate: Template) : LoggedInJsonPage("getPost.ajax", webInterface) {
19 override fun needsFormPassword() = false
21 override fun createJsonObject(currentSone: Sone, request: FreenetRequest) =
22 request.parameters["post"]
23 .let(webInterface.core::getPost)
25 createSuccessJsonObject().
26 put("post", jsonObject(
28 "sone" to post.sone.id,
30 "recipient" to post.recipientId.orNull(),
31 "html" to post.render(currentSone, request)
33 } ?: createErrorJsonObject("invalid-post-id")
35 private fun Post.render(currentSone: Sone, request: FreenetRequest) =
36 webInterface.templateContextFactory.createTemplateContext().apply {
37 set("core", webInterface.core)
38 set("request", request)
39 set("post", this@render)
40 set("currentSone", currentSone)
41 set("localSones", webInterface.core.localSones)
42 }.let { postTemplate.render(it) }
46 private fun Template.render(templateContext: TemplateContext) = StringWriter().use { it.also { render(templateContext, it) } }.toString()