package sh.lajo.buddy import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.jsonPrimitive import okhttp3.Request import java.io.IOException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonPrimitive object FlexibleIdSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("FlexibleId", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: String) = encoder.encodeString(value) override fun deserialize(decoder: Decoder): String { return if (decoder is JsonDecoder) { val element = decoder.decodeJsonElement() if (element is JsonPrimitive) { element.content } else { element.toString() } } else { decoder.decodeString() } } } @Serializable data class EducationLecture( @Serializable(with = FlexibleIdSerializer::class) val id: String, val title: String, val lectureItems: List, val quiz: Quiz ) @Serializable data class LectureItem( @Serializable(with = FlexibleIdSerializer::class) val id: String, val title: String, val lectureElements: List ) @Serializable data class LectureElement( val type: String, val text: String? = null, val imageUrl: String? = null ) @Serializable data class Quiz( val questions: List ) @Serializable data class Question( val question: String, val answers: List, val correctAnswer: String ) class EducationRepository(private val baseUrl: String = ApiConfig.BASE_URL) { private val json = Json { ignoreUnknownKeys = true isLenient = true } suspend fun fetchLectures(): List = withContext(Dispatchers.IO) { val request = Request.Builder() .url("https://raw.githubusercontent.com/lajo-sh/assets/refs/heads/main/lectures-buddy.json") .build() try { HttpClient.client.newCall(request).execute().use { response -> if (!response.isSuccessful) return@withContext emptyList() val body = response.body?.string() ?: return@withContext emptyList() json.decodeFromString>(body) } } catch (e: Exception) { emptyList() } } }