suspend fun startUserAuthFlowInSpace()

in src/main/kotlin/org/jetbrains/slackUnfurls/spaceUnfurlsInSlack/SpaceOAuthFlow.kt [24:50]


suspend fun startUserAuthFlowInSpace(call: ApplicationCall, params: Routes.SpaceOAuth, callbackUrl: String) {
    withSlackLogContext(params.slackTeamId, params.slackUserId, params.spaceOrgId) {
        val spaceOrg = db.spaceOrgs.getById(params.spaceOrgId, params.slackTeamId)
            ?: run {
                call.respondError(HttpStatusCode.BadRequest, log, "Space organization is not connected to Slack workspace")
                return@withSlackLogContext
            }


        val flowId = generateNonce()
        db.spaceUserTokens.delete(params.slackTeamId, params.slackUserId, params.spaceOrgId)
        val permissionScopes = spaceUserPermissionScopes.joinToString(" ")
        db.spaceOAuthSessions.create(flowId, params, permissionScopes)

        log.info("Started user OAuth flow in Space. Flow id is $flowId")

        val authUrl = Space.authCodeSpaceUrl(
            spaceOrg.toSpaceAppInstance(),
            scope = permissionScopes,
            state = flowId,
            redirectUri = callbackUrl,
            requestCredentials = OAuthRequestCredentials.DEFAULT,
            accessType = OAuthAccessType.OFFLINE
        )
        call.respondRedirect(authUrl)
    }
}