Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#346 | Refresh every APP state after save event #357

Merged
merged 10 commits into from
Apr 1, 2021
189 changes: 106 additions & 83 deletions cogboard-app/src/main/kotlin/com/cognifide/cogboard/CogboardConstants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,92 +4,115 @@ import io.vertx.core.json.JsonObject

class CogboardConstants {
companion object {

const val DEFAULT_WEB_SOCKET_PORT = 9001
const val STATUS_CODE_401 = 401
const val STATUS_CODE_200 = 200
const val PROP_ID = "id"
const val PROP_EVENT_TYPE = "eventType"
const val PROP_BOARDS = "boards"
const val PROP_BOARDS_BY_ID = "boardsById"
const val PROP_BOARDS_ALL = "allBoards"
Comment on lines -9 to -15
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved to separate objects...

const val PROP_WIDGETS = "widgets"
const val PROP_WIDGETS_BY_ID = "widgetsById"
const val PROP_AVAILABLE_WIDGETS = "widgetTypes"
const val PROP_STATUS = "status"
const val PROP_WIDGET_STATUS = "widgetStatus"
const val PROP_ERROR_MESSAGE = "errorMessage"
const val PROP_ERROR_CAUSE = "errorCause"
const val PROP_DISABLED = "disabled"
const val PROP_HEADERS = "headers"
const val PROP_CONTENT = "content"
const val PROP_WIDGET_TYPE = "type"
const val PROP_AUTHENTICATION_TYPES = "authenticationTypes"
const val PROP_SCHEDULE_PERIOD = "schedulePeriod"
const val PROP_SCHEDULE_PERIOD_DEFAULT = 120L // 120 seconds
const val PROP_SCHEDULE_DELAY_DEFAULT = 10L // 10 seconds
const val PROP_URL = "url"
const val PROP_REQUEST_ID = "requestId"
const val PROP_PUBLIC_URL = "publicUrl"
const val PROP_USER = "user"
const val PROP_USERNAME = "username"
const val PROP_PASSWORD = "password"
const val PROP_CURRENT_PASSWORD = "currentPassword"
const val PROP_NEW_PASSWORD = "newPassword"
const val PROP_TOKEN = "token"
const val PROP_BODY = "body"
const val PROP_EVENT_ADDRESS = "event.address"
const val PROP_ENDPOINT = "endpoint"
const val PROP_ENDPOINTS = "endpoints"
const val PROP_ENDPOINT_LOADED = "endpoint.loaded"
const val PROP_CREDENTIAL = "credential"
const val PROP_CREDENTIALS = "credentials"
const val PROP_LAST_UPDATED = "lastUpdated"
const val PROP_ARRAY = "array"
const val PROP_STATUS_CODE = "statusCode"
const val PROP_STATUS_MESSAGE = "statusMessage"
const val PROP_EXPECTED_STATUS_CODE = "expectedStatusCode"
const val PROP_REQUEST_METHOD = "requestMethod"
const val PROP_EXPECTED_RESPONSE_BODY = "expectedResponseBody"
const val PROP_CONTENT_TYPE = "contentType"
const val PROP_PATH = "path"
const val PROP_LABEL = "label"
const val PROP_BOARD_COLUMN_MAX = 20
const val PROP_BOARD_COLUMN_MIN = 4
const val PROP_NAME = "name"
const val PROP_DISPLAY = "display"
const val PROP_VALUE = "value"
const val PROP_RELEASE_NAME = "releaseName"
const val PROP_JQL_QUERY = "jqlQuery"
const val PROP_BUCKET_QUERIES = "bucketQueries"
const val PROP_BUCKET_NAME = "bucketName"
val DEFAULT_VALUES: JsonObject = JsonObject().put(Props.SCHEDULE_PERIOD, Props.SCHEDULE_PERIOD_DEFAULT)
fun errorResponse(message: String = ""): JsonObject = JsonObject().put("status", "failed $message")
}

class StatusCode {
companion object {
const val a401 = 401
const val a200 = 200
}
}

const val EVENT_SEND_MESSAGE_TO_WEBSOCKET = "cogboard.websocket.message"
const val EVENT_VERSION_CONFIG = "cogboard.config.handler.version"
const val EVENT_BOARDS_CONFIG = "cogboard.config.boards"
const val EVENT_UPDATE_WIDGET_CONTENT_CONFIG = "cogboard.config.widget.contentUpdate"
const val EVENT_UPDATE_WIDGET_CONFIG = "cogboard.config.widget.update"
const val EVENT_REFRESH_WIDGET_CONFIG = "cogboard.config.widget.refresh"
const val EVENT_DELETE_WIDGET_CONFIG = "cogboard.config.widget.delete"
const val EVENT_PURGE_WIDGET_CONFIG = "cogboard.config.widget.purge"
const val EVENT_ENDPOINTS = "cogboard.config.endpoints"
const val EVENT_UPDATE_ENDPOINTS = "cogboard.config.endpoints.update"
const val EVENT_CREDENTIALS = "cogboard.config.credentials"
const val EVENT_UPDATE_CREDENTIALS = "cogboard.config.credentials.update"
const val EVENT_USER_CONTROL = "cogboard.config.user.control"
const val EVENT_HTTP_GET = "cogboard.httpclient.get"
const val EVENT_HTTP_CHECK = "cogboard.httpclient.check"
const val EVENT_HTTP_POST = "cogboard.httpclient.post"
const val EVENT_HTTP_PUT = "cogboard.httpclient.put"
const val EVENT_HTTP_DELETE = "cogboard.httpclient.delete"
const val REQUEST_METHOD_GET = "get"
const val REQUEST_METHOD_POST = "post"
const val REQUEST_METHOD_PUT = "put"
const val REQUEST_METHOD_DELETE = "delete"
class Props {
companion object {
const val ID = "id"
const val EVENT_TYPE = "eventType"
const val BOARDS = "boards"
const val BOARDS_BY_ID = "boardsById"
const val BOARDS_ALL = "allBoards"
const val WIDGETS = "widgets"
const val WIDGETS_BY_ID = "widgetsById"
const val AVAILABLE_WIDGETS = "widgetTypes"
const val STATUS = "status"
const val WIDGET_STATUS = "widgetStatus"
const val ERROR_MESSAGE = "errorMessage"
const val ERROR_CAUSE = "errorCause"
const val DISABLED = "disabled"
const val HEADERS = "headers"
const val CONTENT = "content"
const val WIDGET_TYPE = "type"
const val AUTHENTICATION_TYPES = "authenticationTypes"
const val SCHEDULE_PERIOD = "schedulePeriod"
const val SCHEDULE_PERIOD_DEFAULT = 120L // 120 seconds
const val SCHEDULE_DELAY_DEFAULT = 10L // 10 seconds
const val URL = "url"
const val REQUEST_ID = "requestId"
const val PUBLIC_URL = "publicUrl"
const val USER = "user"
const val USERNAME = "username"
const val PASSWORD = "password"
const val CURRENT_PASSWORD = "currentPassword"
const val NEW_PASSWORD = "newPassword"
const val TOKEN = "token"
const val BODY = "body"
const val EVENT_ADDRESS = "event.address"
const val ENDPOINT = "endpoint"
const val ENDPOINTS = "endpoints"
const val ENDPOINT_LOADED = "endpoint.loaded"
const val CREDENTIAL = "credential"
const val CREDENTIALS = "credentials"
const val LAST_UPDATED = "lastUpdated"
const val ARRAY = "array"
const val STATUS_CODE = "statusCode"
const val STATUS_MESSAGE = "statusMessage"
const val EXPECTED_STATUS_CODE = "expectedStatusCode"
const val REQUEST_METHOD = "requestMethod"
const val EXPECTED_RESPONSE_BODY = "expectedResponseBody"
const val CONTENT_TYPE = "contentType"
const val PATH = "path"
const val LABEL = "label"
const val BOARD_COLUMN_MAX = 20
const val BOARD_COLUMN_MIN = 4
const val NAME = "name"
const val DISPLAY = "display"
const val VALUE = "value"
const val RELEASE_NAME = "releaseName"
const val JQL_QUERY = "jqlQuery"
const val BUCKET_QUERIES = "bucketQueries"
const val BUCKET_NAME = "bucketName"
}
}

val DEFAULT_VALUES: JsonObject = JsonObject()
.put(PROP_SCHEDULE_PERIOD, PROP_SCHEDULE_PERIOD_DEFAULT)
class RequestMethod {
companion object {
const val GET = "get"
const val POST = "post"
const val PUT = "put"
const val DELETE = "delete"
}
}

fun errorResponse(message: String = ""): JsonObject = JsonObject().put("status", "failed $message")
class Event {
companion object {
const val SEND_MESSAGE_TO_WEBSOCKET = "cogboard.websocket.message"
const val VERSION_CONFIG = "cogboard.config.handler.version"
const val BOARDS_CONFIG = "cogboard.config.boards"
const val UPDATE_WIDGET_CONTENT_CONFIG = "cogboard.config.widget.contentUpdate"
const val UPDATE_WIDGET_CONFIG = "cogboard.config.widget.update"
const val REFRESH_WIDGET_CONFIG = "cogboard.config.widget.refresh"
const val DELETE_WIDGET_CONFIG = "cogboard.config.widget.delete"
const val PURGE_WIDGET_CONFIG = "cogboard.config.widget.purge"
const val ENDPOINTS = "cogboard.config.endpoints"
const val UPDATE_ENDPOINTS = "cogboard.config.endpoints.update"
const val CREDENTIALS = "cogboard.config.credentials"
const val UPDATE_CREDENTIALS = "cogboard.config.credentials.update"
const val USER_CONTROL = "cogboard.config.user.control"
const val HTTP_GET = "cogboard.httpclient.get"
const val HTTP_CHECK = "cogboard.httpclient.check"
const val HTTP_POST = "cogboard.httpclient.post"
const val HTTP_PUT = "cogboard.httpclient.put"
const val HTTP_DELETE = "cogboard.httpclient.delete"
}
}

class EventType {
companion object {
const val WIDGET_UPDATE = "widget-update"
const val CONFIG_SAVED = "config-saved"
const val NEW_VERSION = "new-version"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.cognifide.cogboard.config

import com.cognifide.cogboard.CogboardConstants
import com.cognifide.cogboard.CogboardConstants.Props

class CredentialsConfig {

companion object {
const val CREDENTIALS_ARRAY = CogboardConstants.PROP_CREDENTIALS
const val CREDENTIAL_ID_PROP = CogboardConstants.PROP_ID
const val CREDENTIAL_ID_PREFIX = CogboardConstants.PROP_CREDENTIAL
const val CREDENTIAL_LABEL_PROP = CogboardConstants.PROP_LABEL
const val CREDENTIALS_ARRAY = Props.CREDENTIALS
const val CREDENTIAL_ID_PROP = Props.ID
const val CREDENTIAL_ID_PREFIX = Props.CREDENTIAL
const val CREDENTIAL_LABEL_PROP = Props.LABEL
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.cognifide.cogboard.config

import com.cognifide.cogboard.CogboardConstants.Companion.PROP_PASSWORD
import com.cognifide.cogboard.CogboardConstants.Companion.PROP_TOKEN
import com.cognifide.cogboard.CogboardConstants.Companion.PROP_USER
import com.cognifide.cogboard.CogboardConstants.Props
import com.cognifide.cogboard.config.EndpointsConfig.Companion.CREDENTIALS_PROP
import com.cognifide.cogboard.config.service.CredentialsService
import com.cognifide.cogboard.config.service.EndpointsService
Expand Down Expand Up @@ -30,9 +28,9 @@ class EndpointLoader(
private fun JsonObject.attachCredentials(): JsonObject {
this.remove(CREDENTIALS_PROP)?.let { credId ->
credentials.findById(credId as String).let { credentials ->
this.put(PROP_USER, credentials.getString(PROP_USER) ?: "")
this.put(PROP_PASSWORD, credentials.getString(PROP_PASSWORD) ?: "")
this.put(PROP_TOKEN, credentials.getString(PROP_TOKEN) ?: "")
this.put(Props.USER, credentials.getString(Props.USER) ?: "")
this.put(Props.PASSWORD, credentials.getString(Props.PASSWORD) ?: "")
this.put(Props.TOKEN, credentials.getString(Props.TOKEN) ?: "")
}
}
return this
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.cognifide.cogboard.config

import com.cognifide.cogboard.CogboardConstants
import com.cognifide.cogboard.CogboardConstants.Props

class EndpointsConfig {

companion object {
const val ENDPOINTS_ARRAY = CogboardConstants.PROP_ENDPOINTS
const val ENDPOINT_ID_PROP = CogboardConstants.PROP_ID
const val ENDPOINT_ID_PREFIX = CogboardConstants.PROP_ENDPOINT
const val ENDPOINT_LABEL_PROP = CogboardConstants.PROP_LABEL
const val CREDENTIALS_PROP = CogboardConstants.PROP_CREDENTIALS
const val ENDPOINTS_ARRAY = Props.ENDPOINTS
const val ENDPOINT_ID_PROP = Props.ID
const val ENDPOINT_ID_PREFIX = Props.ENDPOINT
const val ENDPOINT_LABEL_PROP = Props.LABEL
const val CREDENTIALS_PROP = Props.CREDENTIALS
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,24 @@ class BoardsController(private val factory: ControllerFactory = ControllerFactor
val contentRepository = ContentRepository()
sender = ConfirmationSender(vertx)
boardsConfigService = BoardsConfigService(
contentRepository,
EntityCleanupHelper(vertx))
contentRepository,
EntityCleanupHelper(vertx)
)

factory.create(CogboardConstants.EVENT_BOARDS_CONFIG, vertx, prepareConfig())
factory.create(CogboardConstants.Event.BOARDS_CONFIG, vertx, prepareConfig())
}

private fun prepareConfig() = mapOf<String, (JsonObject) -> String>(
"update" to { body -> update(body) },
"get" to { _ -> get() }
"update" to { body -> update(body) },
"get" to { _ -> get() }
)

private fun update(body: JsonObject): String {
val saved = boardsConfigService.saveBoardsConfig(body)
boardsConfigService.saveBoardsConfig(body)
sender.sendOk()
return saved.toString()
return JsonObject()
.put("message", "OK")
.toString()
}

private fun get() = boardsConfigService.loadBoardsConfig().toString()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,24 @@
package com.cognifide.cogboard.config.controller

import com.cognifide.cogboard.CogboardConstants
import com.cognifide.cogboard.CogboardConstants.Event
import com.cognifide.cogboard.CogboardConstants.EventType
import com.cognifide.cogboard.CogboardConstants.Props
import io.vertx.core.Vertx
import io.vertx.core.json.JsonObject
import io.vertx.core.logging.Logger
import io.vertx.core.logging.LoggerFactory

class ConfirmationSender(private val vertx: Vertx) {

fun sendOk() {
vertx.eventBus().send(CogboardConstants.EVENT_SEND_MESSAGE_TO_WEBSOCKET,
JsonObject().message(OK_MESSAGE))
}

fun sendError(body: JsonObject) {
LOGGER.error("$ERROR_MESSAGE \nconfig:\n$body")
vertx.eventBus().send(CogboardConstants.EVENT_SEND_MESSAGE_TO_WEBSOCKET,
JsonObject().message(ERROR_MESSAGE))
vertx.eventBus().send(Event.SEND_MESSAGE_TO_WEBSOCKET, JsonObject().message(OK_MESSAGE))
}

private fun JsonObject.message(message: String): JsonObject {
return this
.put(CogboardConstants.PROP_EVENT_TYPE, PROP_EVENT_TYPE_NOTIFICATION_CONFIG_SAVE)
.put("message", message)
.put(Props.EVENT_TYPE, EventType.CONFIG_SAVED)
.put("message", message)
}

companion object {
private val LOGGER: Logger = LoggerFactory.getLogger(ConfirmationSender::class.java)
private const val OK_MESSAGE = "Configuration saved"
private const val ERROR_MESSAGE = "Configuration not saved - wrong configuration"
private const val PROP_EVENT_TYPE_NOTIFICATION_CONFIG_SAVE = "notification-config-save"
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.cognifide.cogboard.config.controller

import com.cognifide.cogboard.CogboardConstants.Companion.EVENT_CREDENTIALS
import com.cognifide.cogboard.CogboardConstants.Companion.PROP_PASSWORD
import com.cognifide.cogboard.CogboardConstants.Event
import com.cognifide.cogboard.CogboardConstants.Props
import com.cognifide.cogboard.config.CredentialsConfig.Companion.CREDENTIAL_ID_PROP
import com.cognifide.cogboard.config.service.CredentialsService
import io.vertx.core.AbstractVerticle
Expand All @@ -14,7 +14,7 @@ class CredentialsController : AbstractVerticle() {

override fun start() {
credentialsService = CredentialsService()
factory.create(EVENT_CREDENTIALS, vertx, prepareConfig())
factory.create(Event.CREDENTIALS, vertx, prepareConfig())
}

private fun prepareConfig() = mapOf<String, (JsonObject) -> String>(
Expand All @@ -36,7 +36,7 @@ class CredentialsController : AbstractVerticle() {
}

private fun JsonObject.filterSensitiveData(): JsonObject {
this.remove(PROP_PASSWORD)
this.remove(Props.PASSWORD)
return this
}

Expand Down
Loading