override fun doHandle()

in src/main/kotlin/jetbrains/buildServer/notification/slackNotifier/auth/SlackOauthController.kt [46:95]


    override fun doHandle(request: HttpServletRequest, response: HttpServletResponse): ModelAndView {
        val state = Gson().fromJson<SlackOAuthState>(request.getParameter("state"))
        val userId = state.userId.toLong()
        val currentUser = SessionUser.getUser(request.session)
        if (currentUser?.id != userId) {
            return errorMessage(request, "User id '${userId}' does not match current user id")
        }

        val user = userModel.findUserById(userId)
            ?: return errorMessage(request, "Can't find user with id '$userId'")

        val connectionId = state.connectionId
        val connection = projectManager.projects.mapNotNull {
            oAuthConnectionsManager.findConnectionById(it, connectionId)
        }.firstOrNull()
            ?: return errorMessage(request, "Can't find connection with id '${connectionId}")

        val code = request.getParameter("code")
                ?: return errorMessage(request, "Slack auth returned error: ${request.getParameter("error")}")
        val redirectUrl = WebUtil.getRootUrl(request) + PATH

        val clientId = connection.parameters["clientId"]
            ?: return errorMessage(request, "Can't find 'clientId' property in connection with id '${connectionId}'")

        val clientSecret = connection.parameters["secure:clientSecret"]
            ?: return errorMessage(request, "Can't find 'secure:clientSecret' property in connection with id '${connectionId}'")

        val oauthToken = slackApi.oauthAccess(
            clientId = clientId,
            clientSecret = clientSecret,
            code = code,
            redirectUrl = redirectUrl
        )

        if (!oauthToken.ok) {
            return handleOAuthTokenError(request, oauthToken)
        }

        val userIdentity = slackApi.usersIdentity(oauthToken.accessToken)
        if (!userIdentity.ok) {
            return errorMessage(request, "Unexpected error: ${userIdentity.error}")
        }

        val slackUserId = userIdentity.user.id
        user.setUserProperty(SlackProperties.channelProperty, slackUserId)
        user.setUserProperty(SlackProperties.connectionProperty, connectionId)
        user.setUserProperty(SlackProperties.displayNameProperty, userIdentity.user.displayName)

        return redirectToNotifierSettings(request)
    }