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