suspend fun onSlackEvent()

in src/main/kotlin/org/jetbrains/slackUnfurls/spaceUnfurlsInSlack/SpaceUnfurlsInSlack.kt [58:102]


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"
        )
        return
    }
    val requestBody = call.receiveText()
    if (slackSignatureVerifier?.isValid(timestamp, requestBody, signature) == false) {
        call.respondError(HttpStatusCode.BadRequest, log, "Invalid request signature")
        return
    }

    val requestBodyJson = Json.parseToJsonElement(requestBody)
    when (val payloadType = requestBodyJson.jsonObject["type"]?.jsonPrimitive?.content) {
        "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" ->
            when (slackEventTypeExtractor.extractEventType(requestBody)) {
                "link_shared" ->
                    processUnfurlsChannel.send(gson.fromJson(requestBody, LinkSharedPayload::class.java))
                "team_domain_change" -> {
                    val evt = gson.fromJson(requestBody, TeamDomainChangePayload::class.java)
                    db.slackTeams.updateDomain(evt.teamId, evt.event.domain)
                }
                "app_uninstalled" -> {
                    val evt = gson.fromJson(requestBody, AppUninstalledPayload::class.java)
                    db.slackTeams.delete(evt.teamId)
                }
                else ->
                    log.warn("Unprocessed Slack event type - $payloadType")
            }
        else ->
            log.warn("Unexpected Slack event payload type - $payloadType")
    }
    call.respond(HttpStatusCode.OK)
}