81 lines
3 KiB
Kotlin
81 lines
3 KiB
Kotlin
package com.oliver.kidio.backend.routing
|
|
|
|
import com.oliver.kidio.backend.domain.models.TaskVerifyRequest
|
|
import com.oliver.kidio.backend.domain.models.TaskVerifyResponse
|
|
import com.oliver.kidio.backend.domain.repository.KidioRepository
|
|
import com.oliver.kidio.backend.plugins.UserPrincipal
|
|
import io.ktor.http.HttpStatusCode
|
|
import io.ktor.server.auth.*
|
|
import io.ktor.server.request.*
|
|
import io.ktor.server.response.*
|
|
import io.ktor.server.routing.*
|
|
|
|
fun Route.taskRoutes(repository: KidioRepository) {
|
|
authenticate("auth-jwt") {
|
|
get("/api/v1/tasks") {
|
|
val principal = call.principal<UserPrincipal>()
|
|
val userId = principal?.userId
|
|
|
|
val subject = call.request.queryParameters["subject"]
|
|
|
|
val queryAge = call.request.queryParameters["age"]?.toIntOrNull()
|
|
val userAge = userId?.let { repository.getUserById(it)?.childAge }
|
|
val effectiveAge = queryAge ?: userAge
|
|
|
|
val limit = call.request.queryParameters["limit"]?.toIntOrNull() ?: 10
|
|
|
|
val tasks = repository.getTasks(subject = subject, age = effectiveAge, limit = limit)
|
|
call.respond(tasks)
|
|
}
|
|
|
|
post("/api/v1/tasks/verify") {
|
|
val request = call.receive<TaskVerifyRequest>()
|
|
val principal = call.principal<UserPrincipal>()
|
|
val userId = principal?.userId
|
|
if (userId == null) {
|
|
call.respond(
|
|
HttpStatusCode.Unauthorized,
|
|
mapOf("error" to "Ungültiges oder abgelaufenes Token"),
|
|
)
|
|
return@post
|
|
}
|
|
val taskInfo = repository.getTaskAnswerAndReward(request.taskId)
|
|
if (taskInfo == null) {
|
|
call.respond(
|
|
TaskVerifyResponse(
|
|
isCorrect = false,
|
|
earnedMinutes = 0,
|
|
message = "Aufgabe nicht gefunden!",
|
|
),
|
|
)
|
|
return@post
|
|
}
|
|
|
|
val (correctAnswer, reward) = taskInfo
|
|
val isCorrect = request.selectedAnswer.trim() == correctAnswer.trim()
|
|
|
|
if (isCorrect) {
|
|
val currentScreentime = repository.getScreentime(userId)
|
|
val newSeconds = currentScreentime + (reward * 60)
|
|
repository.updateScreentime(userId, newSeconds)
|
|
|
|
call.respond(
|
|
TaskVerifyResponse(
|
|
isCorrect = true,
|
|
earnedMinutes = reward,
|
|
message = "Super gemacht! Du hast $reward Minuten gewonnen.",
|
|
),
|
|
)
|
|
} else {
|
|
call.respond(
|
|
TaskVerifyResponse(
|
|
isCorrect = false,
|
|
earnedMinutes = 0,
|
|
message = "Schade, das war leider falsch. Versuche es nochmal!",
|
|
),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|