1 package net.pterodactylus.sone.web.ajax
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.*
12 import javax.inject.Inject
15 * Renders linked elements after they have been loaded.
17 @ToadletPath("getLinkedElement.ajax")
18 class GetLinkedElementAjaxPage @Inject constructor(webInterface: WebInterface, private val elementLoader: ElementLoader, private val linkedElementRenderFilter: LinkedElementRenderFilter):
19 JsonPage(webInterface) {
21 override val needsFormPassword = false
22 override val requiresLogin = false
24 override fun createJsonObject(request: FreenetRequest): JsonReturnObject =
25 request.httpRequest.getParam("elements", "[]").asJson()
26 .map(JsonNode::asText)
27 .map(elementLoader::loadElement)
28 .filterNot { it.loading }
29 .map { it to renderLinkedElement(it) }
32 *(elements.map { element ->
34 put("link", element.first.link)
35 put("html", element.second)
39 }.let { linkedElements ->
40 createSuccessJsonObject().apply {
41 put("linkedElements", linkedElements)
45 private fun String.asJson() = ObjectMapper().readTree(this).asIterable()
47 private fun renderLinkedElement(linkedElement: LinkedElement) =
48 linkedElementRenderFilter.format(null, linkedElement, emptyMap())