summaryrefslogtreecommitdiff
path: root/app/src/main/java/sh/lajo/buddy/EducationModels.kt
blob: 57e494720bb7aa6c364565416ae150f18b2ed003 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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()
        }
    }
}