diff options
| author | JustZvan <justzvan@justzvan.xyz> | 2026-04-08 19:41:36 +0200 |
|---|---|---|
| committer | JustZvan <justzvan@justzvan.xyz> | 2026-04-08 19:41:36 +0200 |
| commit | 1f07f153b23fa9a7ae0ea648b498dad60f96c594 (patch) | |
| tree | c7c7d1c824d7fdfeaea4ca77ea22c370708ed8a7 /app/src/main/java/sh/lajo/buddy/EducationModels.kt | |
| parent | adb6a4fd9ec3a23c04d5e4c2ce799448237915c4 (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.kt | 94 |
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() + } + } +} |