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