override fun doHandle()

in src/main/kotlin/jetbrains/buildServer/notification/slackNotifier/UserSlackNotifierSettingsController.kt [86:151]


    override fun doHandle(request: HttpServletRequest, response: HttpServletResponse): ModelAndView? {
        val mv = ModelAndView(pluginDescriptor.getPluginResourcesPath("editUserSlackNotifierSettings.jsp"))
        val user = getUser(request, response) ?: return null

        val currentUser = SessionUser.getUser(request)
        if (currentUser == null) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthenticated")
            return null
        }

        val slackUserId = user.getPropertyValue(SlackProperties.channelProperty)
        val selectedConnectionId = user.getPropertyValue(SlackProperties.connectionProperty) ?: ""

        val availableConnections = projectManager.projects.filter {
            user.isPermissionGrantedForProject(it.projectId, Permission.VIEW_PROJECT)
        }.flatMap { project ->
            oAuthConnectionsManager.getAvailableConnectionsOfType(project, SlackConnection.type)
        }.distinctBy { it.id }

        val selectedConnection = availableConnections.find { it.id == selectedConnectionId }

        val slackUsername = selectedConnection?.let { connection ->
            connection.parameters["secure:token"]?.let { token ->
                val users = try {
                    aggregatedSlackApi.getUsersList(token)
                } catch (e: TimeoutException) {
                    emptyList<User>()
                } catch (e: ExecutionException) {
                    emptyList<User>()
                } catch (e: SlackResponseError) {
                    emptyList<User>()
                }
                val slackUser = users.find {
                    it.id == slackUserId
                }

                if (slackUser == null && !slackUserId.isNullOrEmpty()) {
                    user.getPropertyValue(SlackProperties.displayNameProperty)
                } else {
                    slackUser?.displayName
                }
            }
        }

        val defaultProperties = mapOf(
            SlackProperties.maximumNumberOfChangesProperty.key to VerboseMessageBuilderFactory.defaultMaximumNumberOfChanges.toString()
        )

        mv.model["connectionsBean"] = SlackConnectionsBean(availableConnections, aggregatedSlackApi)
        mv.model["propertiesBean"] = BasePropertiesBean(user.properties.filter {
            it.key != SlackProperties.channelProperty
        }.map {
            it.key.key to it.value
        }.toMap(), defaultProperties)
        mv.model["properties"] = SlackProperties()
        mv.model["user"] = user
        mv.model["slackUsername"] = slackUsername ?: ""
        mv.model["selectedConnection"] = selectedConnectionId
        mv.model["displaySettings"] = currentUser.id == user.id
        mv.model["rootUrl"] = WebUtil.getRootUrl(request)
        mv.model["editConnectionUrl"] = webLinks.getEditProjectPageUrl("_Root") + "&tab=oauthConnections"
        mv.model["editNotificationSettingsUrl"] = userNotificationSettingsURL
        mv.model["rootProject"] = projectManager.rootProject

        return mv
    }