diff --git a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt index f901b11b..74d34d96 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/models/wire/EventsWire.kt @@ -1,5 +1,9 @@ +@file:OptIn(ExperimentalSerializationApi::class) + package com.fabledsword.minstrel.models.wire +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -15,7 +19,11 @@ import kotlinx.serialization.Serializable @Serializable data class PlayStartedRequest( - val type: String = "play_started", + // Discriminator MUST stay on the wire. The app's Json has + // encodeDefaults=false, so without this a `type` left at its + // default is omitted entirely and the server 400s the event as + // "unknown event type" — silently dropping every native play. + @EncodeDefault(EncodeDefault.Mode.ALWAYS) val type: String = "play_started", @SerialName("track_id") val trackId: String, @SerialName("client_id") val clientId: String, val source: String? = null, @@ -28,21 +36,21 @@ data class PlayStartedResponse( @Serializable data class PlayEndedRequest( - val type: String = "play_ended", + @EncodeDefault(EncodeDefault.Mode.ALWAYS) val type: String = "play_ended", @SerialName("play_event_id") val playEventId: String, @SerialName("duration_played_ms") val durationPlayedMs: Long, ) @Serializable data class PlaySkippedRequest( - val type: String = "play_skipped", + @EncodeDefault(EncodeDefault.Mode.ALWAYS) val type: String = "play_skipped", @SerialName("play_event_id") val playEventId: String, @SerialName("position_ms") val positionMs: Long, ) @Serializable data class PlayOfflineRequest( - val type: String = "play_offline", + @EncodeDefault(EncodeDefault.Mode.ALWAYS) val type: String = "play_offline", @SerialName("track_id") val trackId: String, @SerialName("client_id") val clientId: String, val at: String,