760c1de2d753f6ed64ef18b31ceb62eca139131f
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / GetLinkedElementAjaxPage.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import com.fasterxml.jackson.databind.JsonNode
4 import com.fasterxml.jackson.databind.ObjectMapper
5 import net.pterodactylus.sone.core.ElementLoader
6 import net.pterodactylus.sone.core.LinkedElement
7 import net.pterodactylus.sone.template.LinkedElementRenderFilter
8 import net.pterodactylus.sone.utils.jsonArray
9 import net.pterodactylus.sone.utils.jsonObject
10 import net.pterodactylus.sone.web.WebInterface
11 import net.pterodactylus.sone.web.page.FreenetRequest
12 import javax.inject.Inject
13
14 /**
15  * Renders linked elements after they have been loaded.
16  */
17 class GetLinkedElementAjaxPage @Inject constructor(webInterface: WebInterface, private val elementLoader: ElementLoader, private val linkedElementRenderFilter: LinkedElementRenderFilter):
18                 JsonPage("getLinkedElement.ajax", webInterface) {
19
20         override val needsFormPassword = false
21         override val requiresLogin = false
22
23         override fun createJsonObject(request: FreenetRequest): JsonReturnObject =
24                         request.httpRequest.getParam("elements", "[]").asJson()
25                                         .map(JsonNode::asText)
26                                         .map(elementLoader::loadElement)
27                                         .filterNot { it.loading }
28                                         .map { it to renderLinkedElement(it) }
29                                         .let { elements ->
30                                                 jsonArray(
31                                                                 *(elements.map { element ->
32                                                                         jsonObject {
33                                                                                 put("link", element.first.link)
34                                                                                 put("html", element.second)
35                                                                         }
36                                                                 }.toTypedArray())
37                                                 )
38                                         }.let { linkedElements ->
39                                 createSuccessJsonObject().apply {
40                                         put("linkedElements", linkedElements)
41                                 }
42                         }
43
44         private fun String.asJson() = ObjectMapper().readTree(this).asIterable()
45
46         private fun renderLinkedElement(linkedElement: LinkedElement) =
47                         linkedElementRenderFilter.format(null, linkedElement, emptyMap())
48
49 }