From 80dbf10e7e7279820020a4c2468909a05a1bf026 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:36:47 +0900 Subject: [PATCH] add ApiCommandRoutes.kt - add GET/PUT/POST/DELETE endpoints. --- .../space/mori/chzzk_bot/webserver/Main.kt | 3 + .../webserver/routes/ApiCommandRoutes.kt | 122 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiCommandRoutes.kt diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt index 756f10e..7efba31 100644 --- a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt @@ -110,9 +110,12 @@ val server = embeddedServer(Netty, port = 8080, ) { apiRoutes() apiSongRoutes() + apiCommandRoutes() + wsTimerRoutes() wsSongRoutes() wsSongListRoutes() + swaggerUI("swagger-ui/index.html", "openapi/documentation.yaml") { options { version = "1.2.0" diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiCommandRoutes.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiCommandRoutes.kt new file mode 100644 index 0000000..df815ab --- /dev/null +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiCommandRoutes.kt @@ -0,0 +1,122 @@ +package space.mori.chzzk_bot.webserver.routes + +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import io.ktor.server.sessions.* +import kotlinx.serialization.Serializable +import space.mori.chzzk_bot.common.services.CommandService +import space.mori.chzzk_bot.common.services.UserService +import space.mori.chzzk_bot.webserver.UserSession + +fun Routing.apiCommandRoutes() { + route("/commands") { + get("/{uid}") { + val uid = call.parameters["uid"] + val session = call.sessions.get() + if(uid == null) { + call.respond(HttpStatusCode.BadRequest, "UID is required") + return@get + } + val user = UserService.getUser(uid) + if(user == null || user.naverId != session?.id) { + call.respond(HttpStatusCode.BadRequest, "User does not exist") + return@get + } + + val commands = CommandService.getCommands(user) + + call.respond(HttpStatusCode.OK, commands.map { + CommandsResponseDTO(it.command, it.content, it.failContent) + }) + } + + put("/{uid}") { + val uid = call.parameters["uid"] + val session = call.sessions.get() + val commandRequest = call.receive() + if(uid == null) { + call.respond(HttpStatusCode.BadRequest, "UID is required") + return@put + } + val user = UserService.getUser(uid) + if(user == null || user.naverId != session?.id) { + call.respond(HttpStatusCode.BadRequest, "User does not exist") + return@put + } + + CommandService.saveCommand(user, + commandRequest.label, + commandRequest.content, + commandRequest.failContent ?: "" + ) + call.respond(HttpStatusCode.OK) + } + + post("/{uid}") { + val uid = call.parameters["uid"] + val session = call.sessions.get() + val commandRequest = call.receive() + if(uid == null) { + call.respond(HttpStatusCode.BadRequest, "UID is required") + return@post + } + val user = UserService.getUser(uid) + if(user == null || user.naverId != session?.id) { + call.respond(HttpStatusCode.BadRequest, "User does not exist") + return@post + } + + try { + CommandService.updateCommand( + user, + commandRequest.label, + commandRequest.content, + commandRequest.failContent ?: "" + ) + call.respond(HttpStatusCode.OK) + } catch(e: Exception) { + call.respond(HttpStatusCode.BadRequest) + } + } + + delete("/{uid}") { + val uid = call.parameters["uid"] + val session = call.sessions.get() + val commandRequest = call.receive() + if(uid == null) { + call.respond(HttpStatusCode.BadRequest, "UID is required") + return@delete + } + val user = UserService.getUser(uid) + if(user == null || user.naverId != session?.id) { + call.respond(HttpStatusCode.BadRequest, "User does not exist") + return@delete + } + + try { + CommandService.removeCommand(user, commandRequest.label) + call.respond(HttpStatusCode.OK) + } catch(e: Exception) { + call.respond(HttpStatusCode.BadRequest) + } + } + } +} + + +@Serializable +data class CommandsRequestDTO( + val label: String, + val content: String, + val failContent: String? +) + +@Serializable +data class CommandsResponseDTO( + val label: String, + val content: String, + val failContent: String? +)