summaryrefslogtreecommitdiff
path: root/app/src/main/java/sh/lajo/buddy/EducationModels.kt
diff options
context:
space:
mode:
authorJustZvan <justzvan@justzvan.xyz>2026-04-08 19:41:36 +0200
committerJustZvan <justzvan@justzvan.xyz>2026-04-08 19:41:36 +0200
commit1f07f153b23fa9a7ae0ea648b498dad60f96c594 (patch)
treec7c7d1c824d7fdfeaea4ca77ea22c370708ed8a7 /app/src/main/java/sh/lajo/buddy/EducationModels.kt
parentadb6a4fd9ec3a23c04d5e4c2ce799448237915c4 (diff)
feat: 1.2main
Diffstat (limited to 'app/src/main/java/sh/lajo/buddy/EducationModels.kt')
-rw-r--r--app/src/main/java/sh/lajo/buddy/EducationModels.kt94
1 files changed, 94 insertions, 0 deletions
diff --git a/app/src/main/java/sh/lajo/buddy/EducationModels.kt b/app/src/main/java/sh/lajo/buddy/EducationModels.kt
new file mode 100644
index 0000000..57e4947
--- /dev/null
+++ b/app/src/main/java/sh/lajo/buddy/EducationModels.kt
@@ -0,0 +1,94 @@
+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<String> {
+ 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<LectureItem>,
+ val quiz: Quiz
+)
+
+@Serializable
+data class LectureItem(
+ @Serializable(with = FlexibleIdSerializer::class)
+ val id: String,
+ val title: String,
+ val lectureElements: List<LectureElement>
+)
+
+@Serializable
+data class LectureElement(
+ val type: String,
+ val text: String? = null,
+ val imageUrl: String? = null
+)
+
+@Serializable
+data class Quiz(
+ val questions: List<Question>
+)
+
+@Serializable
+data class Question(
+ val question: String,
+ val answers: List<String>,
+ val correctAnswer: String
+)
+
+class EducationRepository(private val baseUrl: String = ApiConfig.BASE_URL) {
+ private val json = Json {
+ ignoreUnknownKeys = true
+ isLenient = true
+ }
+
+ suspend fun fetchLectures(): List<EducationLecture> = 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<List<EducationLecture>>(body)
+ }
+ } catch (e: Exception) {
+ emptyList()
+ }
+ }
+}