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()
}
}
}
|