package icu.samnyan.aqua.sega.chusan import ext.* import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.utils.simpleDescribe import icu.samnyan.aqua.sega.allnet.TokenChecker import icu.samnyan.aqua.sega.chusan.handler.chusanInit import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import icu.samnyan.aqua.sega.general.GameMusicPopularity import icu.samnyan.aqua.sega.general.MeowApi import icu.samnyan.aqua.sega.general.RequestContext import icu.samnyan.aqua.sega.util.jackson.BasicMapper import icu.samnyan.aqua.sega.util.jackson.StringMapper import icu.samnyan.aqua.spring.Metrics import jakarta.servlet.http.HttpServletRequest import org.slf4j.LoggerFactory import org.springframework.web.bind.annotation.RestController import kotlin.collections.set /** * @author samnyan (privateamusement@protonmail.com) */ @Suppress("unused") @RestController @API(value = ["/g/chu3/{version}/ChuniServlet", "/g/chu3/{version}"]) class ChusanController( val mapper: StringMapper, val cmMapper: BasicMapper, val db: Chu3Repos, val us: AquaUserServices, val versionHelper: ChusanVersionHelper, val props: ChusanProps, val pop: GameMusicPopularity, ): MeowApi({ api, resp -> if (resp is String) resp else (if ("CM" in api) cmMapper else mapper).write(resp) }) { val log = LoggerFactory.getLogger(ChusanController::class.java) val noopEndpoint = setOf("UpsertClientBookkeepingApi", "UpsertClientDevelopApi", "UpsertClientErrorApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "CreateTokenApi", "RemoveTokenApi", "UpsertClientUploadApi", "PrinterLoginApi", "PrinterLogoutApi", "Ping", "GameLogoutApi", "RemoveMatchingMemberApi") init { chusanInit() } val handlers = initH @API("/{endpoint}", "/MatchingServer/{endpoint}") fun handle(@PV endpoint: Str, @RB data: MutableMap, @PV version: Str, req: HttpServletRequest): Any { val ctx = RequestContext(req, data) var api = endpoint data["version"] = version // Export version if (api.endsWith("C3Exp")) { api = api.removeSuffix("C3Exp") data["c3exp"] = true } if (api.startsWith("CM") && api !in handlers) api = api.removePrefix("CM") val token = TokenChecker.getCurrentSession()?.token?.substring(0, 6) ?: "NO-TOKEN" log.info("Chu3 < $api : ${data.toJson()} : [$token]") if (api !in noopEndpoint && !handlers.containsKey(api)) { log.warn("Chu3 > $api not found") return """{"returnCode":"1","apiName":"$api"}""" } // Only record the counter metrics if the API is known. Metrics.counter("aquadx_chusan_api_call", "api" to api).increment() if (api in noopEndpoint) { log.info("Chu3 > $api no-op") return """{"returnCode":"1"}""" } return try { Metrics.timer("aquadx_chusan_api_latency", "api" to api).recordCallable { serialize(api, handlers[api]!!(ctx)).also { if (api !in setOf("GetUserItemApi", "GetGameEventApi")) log.info("Chu3 > $api : $it") } } } catch (e: Exception) { Metrics.counter( "aquadx_chusan_api_error", "api" to api, "error" to e.simpleDescribe() ).increment() throw e } } }