suspend fun onSlackEvent()

in space-slack-sync/src/main/kotlin/org/jetbrains/spaceSlackSync/slack/SlackEventProcessing.kt [32:73]


suspend fun onSlackEvent(call: ApplicationCall) {
    val timestamp = call.request.header(SlackSignature.HeaderNames.X_SLACK_REQUEST_TIMESTAMP)
    val signature = call.request.header(SlackSignature.HeaderNames.X_SLACK_SIGNATURE)
    if (timestamp == null || signature == null) {
        call.respondError(
            HttpStatusCode.BadRequest,
            log,
            "HTTP headers ${SlackSignature.HeaderNames.X_SLACK_REQUEST_TIMESTAMP} and ${SlackSignature.HeaderNames.X_SLACK_SIGNATURE} are required"
        )
        log.warn("`timestamp` or `signature` headers are missing, responded with 400")
        return
    }

    val requestBody = call.receiveText()
    if (slackSignatureVerifier?.isValid(timestamp, requestBody, signature) == false) {
        call.respondError(HttpStatusCode.BadRequest, log, "Invalid request signature")
        log.warn("Invalid Slack request signature, responded with 400")
        return
    }

    val requestBodyJson = Json.parseToJsonElement(requestBody)
    when (val payloadType = requestBodyJson.jsonObject["type"]?.jsonPrimitive?.content) {
        "url_verification" -> {
            log.debug("Slack payload type: url_verification")
            val challenge = requestBodyJson.jsonObject["challenge"]?.jsonPrimitive?.content
            challenge?.let { call.respondText(it) }
                ?: call.respondError(HttpStatusCode.BadRequest, log, "Challenge expected in url verification request")
            return
        }

        "event_callback" -> {
            log.debug("Slack payload type: event_callback")
            call.application.launch(Server + MDCContext()) {
                // process event asynchronously
                processEventFromSlack(requestBody, requestBodyJson)
            }
        }

        else -> log.warn("Unexpected Slack event payload type - $payloadType")
    }
    call.respond(HttpStatusCode.OK)
}