suspend fun startUserAuthFlowInSlack()

in src/main/kotlin/org/jetbrains/slackUnfurls/slackUnfurlsInSpace/SlackOAuthFlow.kt [22:52]


suspend fun startUserAuthFlowInSlack(call: ApplicationCall, params: Routes.SlackOAuth, callbackUrl: String) {
    withSpaceLogContext(params.spaceOrgId, params.spaceUser, params.slackTeamId) {
        val flowId = generateNonce()
        val slackDomain = db.slackTeams.getById(params.slackTeamId, params.spaceOrgId)?.domain
        if (slackDomain == null) {
            log.warn("Slack workspace is not connected to Space org")
            return@withSpaceLogContext
        }

        db.slackUserTokens.delete(
            spaceOrgId = params.spaceOrgId,
            spaceUserId = params.spaceUser,
            slackTeamId = params.slackTeamId
        )

        val permissionScopes = slackPermissionScopes.joinToString(",")
        db.slackOAuthSessions.create(flowId, params, permissionScopes)
        log.info("Started user OAuth flow in Slack. Flow id is $flowId")

        val authUrl = with(URLBuilder("https://$slackDomain.slack.com/oauth/v2/authorize")) {
            parameters.apply {
                append("client_id", SlackCredentials.clientId)
                append("user_scope", permissionScopes)
                append("state", "user-$flowId")
                append("redirect_uri", callbackUrl)
            }
            build()
        }
        call.respondRedirect(authUrl.toString())
    }
}