You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

66 lines
2.1 KiB

package net.aiterp.git.ykonsole2.application.routes
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
import net.aiterp.git.ykonsole2.domain.models.Program
import net.aiterp.git.ykonsole2.domain.models.ProgramRepository
import net.aiterp.git.ykonsole2.domain.models.randomId
import net.aiterp.git.ykonsole2.infrastructure.ktor.ykDataResponse
import net.aiterp.git.ykonsole2.infrastructure.ktor.ykException
data class ProgramPostInput(val name: String, val steps: List<ProgramStepDTO>)
data class ProgramPutInput(val name: String? = null, val steps: List<ProgramStepDTO>? = null)
fun Route.programs(programRepo: ProgramRepository) {
route("/programs") {
get {
call.ykDataResponse(programRepo.fetchAll().map { ProgramDTO.from(it) })
}
post {
val (name, steps) = call.receive<ProgramPostInput>()
if (name.isBlank() && steps.isEmpty()) {
throw call.ykException(HttpStatusCode.BadRequest, "'name' and 'steps' required")
}
val program = Program(randomId(), name, steps.map(ProgramStepDTO::toProgramStep))
programRepo.save(program)
call.ykDataResponse(ProgramDTO.from(program))
}
route("/{id}") {
get {
val id = call.parameters["id"] ?: ""
val program = programRepo.findById(id) ?: throw call.ykException(HttpStatusCode.NotFound)
call.ykDataResponse(ProgramDTO.from(program))
}
put {
val id = call.parameters["id"] ?: ""
val input = call.receive<ProgramPutInput>()
val program = programRepo.findById(id) ?: throw call.ykException(HttpStatusCode.NotFound)
val changed = program.copy(
name = input.name ?: program.name,
steps = input.steps?.map { it.toProgramStep() } ?: program.steps,
)
programRepo.save(changed)
call.ykDataResponse(ProgramDTO.from(changed))
}
delete {
val id = call.parameters["id"] ?: ""
val program = programRepo.findById(id) ?: throw call.ykException(HttpStatusCode.NotFound)
programRepo.delete(program)
call.ykDataResponse(null)
}
}
}
}