✨ Use @ToadletPath for JSON pages, too
[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.*
12 import javax.inject.Inject
13
14 /**
15  * Renders linked elements after they have been loaded.
16  */
17 @ToadletPath("getLinkedElement.ajax")
18 class GetLinkedElementAjaxPage @Inject constructor(webInterface: WebInterface, private val elementLoader: ElementLoader, private val linkedElementRenderFilter: LinkedElementRenderFilter):
19                 JsonPage(webInterface) {
20
21         override val needsFormPassword = false
22         override val requiresLogin = false
23
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) }
30                                         .let { elements ->
31                                                 jsonArray(
32                                                                 *(elements.map { element ->
33                                                                         jsonObject {
34                                                                                 put("link", element.first.link)
35                                                                                 put("html", element.second)
36                                                                         }
37                                                                 }.toTypedArray())
38                                                 )
39                                         }.let { linkedElements ->
40                                 createSuccessJsonObject().apply {
41                                         put("linkedElements", linkedElements)
42                                 }
43                         }
44
45         private fun String.asJson() = ObjectMapper().readTree(this).asIterable()
46
47         private fun renderLinkedElement(linkedElement: LinkedElement) =
48                         linkedElementRenderFilter.format(null, linkedElement, emptyMap())
49
50 }