GET /version endpoint

This commit is contained in:
2025-04-25 10:17:54 +02:00
parent d440dacdd6
commit 2ea83ee242
5 changed files with 32 additions and 8 deletions

View File

@ -32,6 +32,7 @@ dependencies {
implementation(libs.dotenv) implementation(libs.dotenv)
implementation(libs.json) implementation(libs.json)
implementation(libs.kotlinx.datetime)
implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.json)
implementation(libs.ksoup) implementation(libs.ksoup)
implementation(libs.logback.classic) implementation(libs.logback.classic)

View File

@ -32,6 +32,7 @@ ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx
dotenv = { module = "io.github.cdimascio:dotenv-kotlin", version.ref = "dotenv" } dotenv = { module = "io.github.cdimascio:dotenv-kotlin", version.ref = "dotenv" }
json = { module = "org.json:json", version.ref = "json" } json = { module = "org.json:json", version.ref = "json" }
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version = "0.6.2" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" } ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" }
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }

View File

@ -3,6 +3,8 @@ package com.jaytux.simd.data
import com.fleeksoft.ksoup.Ksoup import com.fleeksoft.ksoup.Ksoup
import com.jaytux.simd.data.IntrinsicInstructions.xed import com.jaytux.simd.data.IntrinsicInstructions.xed
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import kotlinx.datetime.*
import kotlinx.datetime.format.MonthNames
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
@ -16,12 +18,16 @@ import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.prefs.Preferences import java.util.prefs.Preferences
import java.time.Instant
object Loader { object Loader {
private val cache = Preferences.userNodeForPackage(this::class.java) private val cache = Preferences.userNodeForPackage(this::class.java)
private val intelDateTimeFormat = SimpleDateFormat("MM/dd/yyyy") private val intelDateTimeFormat = LocalDate.Format {
private val dateFormat = SimpleDateFormat("dd-MMMM-yyyy") monthNumber(); chars("/"); dayOfMonth(); chars("/"); year();
}
private val dateFormat = LocalDate.Format {
dayOfMonth(); chars("-"); monthName(MonthNames.ENGLISH_FULL); chars("-"); year()
}
private val zero = LocalDate(1970, 1, 1)
data class XmlIntrinsic(val name: String, val tech: String, val retType: String, val retVar: String?, data class XmlIntrinsic(val name: String, val tech: String, val retType: String, val retVar: String?,
val args: List<Pair<String, String>>, val desc: String, val op: String?, val args: List<Pair<String, String>>, val desc: String, val op: String?,
@ -46,14 +52,14 @@ object Loader {
} }
} }
data class DatedVersion(val version: Version, val releaseDate: Date, val updateDate: Date) { data class DatedVersion(val version: Version, val releaseDate: LocalDate, val updateDate: LocalDate) {
override fun toString(): String = "$version (remote released ${dateFormat.format(releaseDate)}; local updated ${dateFormat.format(updateDate)})" override fun toString(): String = "$version (remote released ${dateFormat.format(releaseDate)}; local updated ${dateFormat.format(updateDate)})"
companion object { companion object {
fun fromPrefs(): DatedVersion { fun fromPrefs(): DatedVersion {
val v = cache.get("version", null)?.let { Version.fromString(it) } ?: Version(0, 0, 0) val v = cache.get("version", null)?.let { Version.fromString(it) } ?: Version(0, 0, 0)
val r = cache.get("release", null)?.let { dateFormat.parse(it) } ?: Date.from(Instant.ofEpochMilli(0)) val r = cache.get("release", null)?.let { dateFormat.parse(it) } ?: zero
val u = cache.get("update", null)?.let { dateFormat.parse(it) } ?: Date.from(Instant.ofEpochMilli(0)) val u = cache.get("update", null)?.let { dateFormat.parse(it) } ?: zero
return DatedVersion(v, r, u) return DatedVersion(v, r, u)
} }
@ -100,14 +106,14 @@ object Loader {
} }
version to date version to date
} ?: Version(0, 0, 0) to Date() } ?: Version(0, 0, 0) to LocalDate.fromEpochDays(0) // dummy data
if(errors.isNotEmpty()) { if(errors.isNotEmpty()) {
errors.forEach { System.err.println(it) } errors.forEach { System.err.println(it) }
throw Exception("XML file is (partially) invalid") throw Exception("XML file is (partially) invalid")
} }
val update = Date() val update = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
xml.getElementsByTag("intrinsic").forEachIndexed { i, it -> xml.getElementsByTag("intrinsic").forEachIndexed { i, it ->
val name = it.attribute("name")?.value val name = it.attribute("name")?.value

View File

@ -1,7 +1,10 @@
package com.jaytux.simd.server package com.jaytux.simd.server
import com.jaytux.simd.data.* import com.jaytux.simd.data.*
import io.ktor.http.content.*
import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
@ -37,6 +40,11 @@ data class IntrinsicDetails(
val performance: List<PlatformPerformance>? val performance: List<PlatformPerformance>?
) )
@Serializable
data class Versioning(
val intelVersion: String, val intelUpdate: LocalDate, val scrapeDate: LocalDate
)
fun Routing.installGetAll() { fun Routing.installGetAll() {
getPagedUrl("/all", { 100 }, { IntrinsicSummary(it.id.value, it.mnemonic) }) { getPagedUrl("/all", { 100 }, { IntrinsicSummary(it.id.value, it.mnemonic) }) {
Intrinsic.all().orderAsc(Intrinsics.mnemonic) Intrinsic.all().orderAsc(Intrinsics.mnemonic)
@ -126,3 +134,10 @@ fun Routing.installDetails() {
} }
} }
} }
fun Routing.installVersion() {
get("/version") {
val upd = Loader.DatedVersion.fromPrefs()
call.respond(Versioning(upd.version.toString(), intelUpdate = upd.releaseDate, upd.updateDate))
}
}

View File

@ -63,6 +63,7 @@ fun Application.configureRouting() {
installGetAll() installGetAll()
installSearch() installSearch()
installDetails() installDetails()
installVersion()
} }
} }