suspend fun onUserAuthFlowCompletedInSlack()

in src/main/kotlin/org/jetbrains/slackUnfurls/slackUnfurlsInSpace/SlackOAuthFlow.kt [54:101]


suspend fun onUserAuthFlowCompletedInSlack(call: ApplicationCall, flowId: String, params: Routes.SlackOAuthCallback) {
    if (params.code.isNullOrBlank()) {
        call.respondError(HttpStatusCode.BadRequest, log, "Expected code query string parameter in request (flow id = $flowId)")
        return
    }

    val session = db.slackOAuthSessions.get(flowId) ?: run {
        call.respondError(
            HttpStatusCode.BadRequest,
            log,
            "Authentication session has expired, try again (flow id = $flowId)"
        )
        return
    }

    withSpaceLogContext(session.spaceOrgId, session.spaceUserId, session.slackTeamId, "flow-id" to flowId) {
        val response = requestOAuthToken(params.code)
        if (response == null || response.authedUser?.accessToken.isNullOrBlank()) {
            call.respondError(
                HttpStatusCode.Unauthorized,
                log,
                "Could not fetch OAuth token from Slack (flow id = $flowId)"
            )
            return@withSpaceLogContext
        }

        db.slackUserTokens.save(
            spaceOrgId = session.spaceOrgId,
            spaceUserId = session.spaceUserId,
            slackTeamId = session.slackTeamId,
            accessToken = encrypt(response.authedUser.accessToken),
            refreshToken = encrypt(response.authedUser.refreshToken),
            permissionScopes = session.permissionScopes
        )
        processUnfurlsAfterAuthChannel.send(session)

        if (session.backUrl != null) {
            log.info("Successfully authenticated user in Slack, redirecting to back url")
            call.respondRedirect(session.backUrl)
        } else {
            // back url should be always present in this flow, but we cannot statically verify this
            call.respondSuccess(
                log,
                "Successfully authenticated with Slack. Now Slack links in your chat messages in JetBrains Space will be accompanied with previews."
            )
        }
    }
}