Replace get times ajax page with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / GetTimesAjaxPage.kt
diff --git a/src/main/kotlin/net/pterodactylus/sone/web/ajax/GetTimesAjaxPage.kt b/src/main/kotlin/net/pterodactylus/sone/web/ajax/GetTimesAjaxPage.kt
new file mode 100644 (file)
index 0000000..358003a
--- /dev/null
@@ -0,0 +1,43 @@
+package net.pterodactylus.sone.web.ajax
+
+import net.pterodactylus.sone.freenet.L10nFilter
+import net.pterodactylus.sone.text.TimeTextConverter
+import net.pterodactylus.sone.utils.jsonObject
+import net.pterodactylus.sone.utils.let
+import net.pterodactylus.sone.utils.parameters
+import net.pterodactylus.sone.web.WebInterface
+import net.pterodactylus.sone.web.page.FreenetRequest
+import java.text.SimpleDateFormat
+
+/**
+ * Ajax page that returns a formatted, relative timestamp for replies or posts.
+ */
+class GetTimesAjaxPage(webInterface: WebInterface,
+               private val timeTextConverter: TimeTextConverter,
+               private val l10nFilter: L10nFilter) : JsonPage("getTimes.ajax", webInterface) {
+
+       private val dateTimeFormatter = SimpleDateFormat("MMM d, yyyy, HH:mm:ss")
+
+       override fun needsFormPassword() = false
+       override fun requiresLogin() = false
+
+       override fun createJsonObject(request: FreenetRequest) =
+                       createSuccessJsonObject().apply {
+                               put("postTimes", request.parameters["posts"]!!.idsToJson { webInterface.core.getPost(it)?.let { it.id to it.time } })
+                               put("replyTimes", request.parameters["replies"]!!.idsToJson { webInterface.core.getPostReply(it)?.let { it.id to it.time } })
+                       }
+
+       private fun String.idsToJson(transform: (String) -> Pair<String, Long>?) =
+                       split(",").mapNotNull(transform).toJson()
+
+       private fun List<Pair<String, Long>>.toJson() = jsonObject {
+               this@toJson.map { (id, time) ->
+                       val timeText = timeTextConverter.getTimeText(time)
+                       id to jsonObject(
+                                       "timeText" to l10nFilter.format(null, timeText.l10nText, emptyMap()),
+                                       "refreshTime" to timeText.refreshTime / 1000,
+                                       "tooltip" to dateTimeFormatter.format(time))
+               }.forEach { this@jsonObject.put(it.first, it.second) }
+       }
+
+}