✨ Use @ToadletPath for JSON pages, too
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / GetTimesAjaxPage.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import net.pterodactylus.sone.freenet.L10nFilter
4 import net.pterodactylus.sone.text.TimeTextConverter
5 import net.pterodactylus.sone.utils.jsonObject
6 import net.pterodactylus.sone.utils.parameters
7 import net.pterodactylus.sone.web.WebInterface
8 import net.pterodactylus.sone.web.page.*
9 import java.text.SimpleDateFormat
10 import java.util.TimeZone
11 import javax.inject.Inject
12
13 /**
14  * Ajax page that returns a formatted, relative timestamp for replies or posts.
15  */
16 @ToadletPath("getTimes.ajax")
17 class GetTimesAjaxPage @Inject constructor(webInterface: WebInterface,
18                 private val timeTextConverter: TimeTextConverter,
19                 private val l10nFilter: L10nFilter,
20                 timeZone: TimeZone) : JsonPage(webInterface) {
21
22         private val dateTimeFormatter = SimpleDateFormat("MMM d, yyyy, HH:mm:ss").apply {
23                 this.timeZone = timeZone
24         }
25
26         override val needsFormPassword = false
27         override val requiresLogin = false
28
29         override fun createJsonObject(request: FreenetRequest) =
30                         createSuccessJsonObject().apply {
31                                 put("postTimes", request.parameters["posts"]!!.idsToJson { core.getPost(it)?.let { it.id to it.time } })
32                                 put("replyTimes", request.parameters["replies"]!!.idsToJson { core.getPostReply(it)?.let { it.id to it.time } })
33                         }
34
35         private fun String.idsToJson(transform: (String) -> Pair<String, Long>?) =
36                         split(",").mapNotNull(transform).toJson()
37
38         private fun List<Pair<String, Long>>.toJson() = jsonObject {
39                 this@toJson.map { (id, time) ->
40                         val timeText = timeTextConverter.getTimeText(time)
41                         id to jsonObject(
42                                         "timeText" to l10nFilter.format(null, timeText.l10nText, emptyMap()),
43                                         "refreshTime" to timeText.refreshTime / 1000,
44                                         "tooltip" to synchronized(dateTimeFormatter) {
45                                                 dateTimeFormatter.format(time)
46                                         })
47                 }.forEach { this@jsonObject.set(it.first, it.second) }
48         }
49
50 }