Skip to content

Commit

Permalink
General | Refresh every APP state after save event (#357)
Browse files Browse the repository at this point in the history
* Big CogboardConstants.kt refactor
* Saving will now trigger an event that will refresh all Cogboard instances

Co-authored-by: szymon.owczarzak <szymon.owczarzak@cognifide.com>
  • Loading branch information
szymon-owczarzak and szymon.owczarzak authored Apr 1, 2021
1 parent 78c4df6 commit 2c34c4d
Show file tree
Hide file tree
Showing 51 changed files with 433 additions and 407 deletions.
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"
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

0 comments on commit 2c34c4d

Please sign in to comment.