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