Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 3f7bb56

Browse files
committed
Added framework support and rest API for creating and deleting connectors.
1 parent 12795ba commit 3f7bb56

File tree

4 files changed

+88
-2
lines changed

4 files changed

+88
-2
lines changed

src/main/scala/org/codeoverflow/chatoverflow/connector/ConnectorRegistry.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,32 @@ object ConnectorRegistry extends WithLogger {
2222
*/
2323
def setTypeRegistry(typeRegistry: TypeRegistry): Unit = this.typeRegistry = Some(typeRegistry)
2424

25+
/**
26+
* Tries to remove the specified connector if it is not running.
27+
*
28+
* @param sourceIdentifier the identifier for the source platform
29+
* @param qualifiedConnectorName a fully qualified connector type string
30+
* @return false, if a major error happened
31+
*/
32+
def removeConnector(sourceIdentifier: String, qualifiedConnectorName: String): Boolean = {
33+
logger info s"Trying to remove connector '$sourceIdentifier' of type '$qualifiedConnectorName'."
34+
val connectorKey = ConnectorKey(sourceIdentifier, qualifiedConnectorName)
35+
36+
if (!connectors.contains(connectorKey)) {
37+
logger warn "Unable to remove connector. Connector does not exist."
38+
false
39+
} else {
40+
if (connectors(connectorKey).isRunning) {
41+
logger warn "Unable to remove connector. Connector is running."
42+
false
43+
} else {
44+
// TODO: Check if this might crash anything
45+
connectors -= connectorKey
46+
true
47+
}
48+
}
49+
}
50+
2551
/**
2652
* Adds a new connector to the registry. Before instantiating the state is checked to be correct.
2753
*

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/DTOs.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ object DTOs {
2828

2929
case class ResultMessage(success: Boolean, message: String = "")
3030

31+
case class ConnectorRef(sourceIdentifier: String, uniqueTypeString: String)
32+
3133
}

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/connector/ConnectorController.scala

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.codeoverflow.chatoverflow.ui.web.rest.connector
22

33
import org.codeoverflow.chatoverflow.connector.ConnectorRegistry
44
import org.codeoverflow.chatoverflow.ui.web.JsonServlet
5-
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.ConnectorDetails
5+
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.{ConnectorDetails, ConnectorRef, ResultMessage}
66
import org.scalatra.swagger.Swagger
77

88
class ConnectorController(implicit val swagger: Swagger) extends JsonServlet with ConnectorControllerDefinition {
@@ -22,4 +22,49 @@ class ConnectorController(implicit val swagger: Swagger) extends JsonServlet wit
2222
}
2323
}
2424

25+
post("/", operation(postConnector)) {
26+
parsedAs[ConnectorRef] {
27+
case ConnectorRef(sourceIdentifier, uniqueTypeString) =>
28+
val connector = ConnectorRegistry.getConnector(sourceIdentifier, uniqueTypeString)
29+
30+
if (connector.isDefined) {
31+
ResultMessage(success = false, "Connector already defined.")
32+
} else {
33+
val connectorClass = chatOverflow.typeRegistry.getConnectorType(uniqueTypeString)
34+
35+
if (connectorClass.isEmpty) {
36+
ResultMessage(success = false, "Connector type not found.")
37+
38+
} else if (!ConnectorRegistry.addConnector(sourceIdentifier, uniqueTypeString)) {
39+
ResultMessage(success = false, "Unable to add connector.")
40+
41+
} else {
42+
chatOverflow.save()
43+
ResultMessage(success = true)
44+
}
45+
}
46+
}
47+
}
48+
49+
delete("/:sourceIdentifier/:qualifiedConnectorType", operation(deleteConnector)) {
50+
val sourceIdentifier = params("sourceIdentifier")
51+
val qualifiedConnectorType = params("qualifiedConnectorType")
52+
53+
val connector = ConnectorRegistry.getConnector(sourceIdentifier, qualifiedConnectorType)
54+
55+
if (connector.isEmpty) {
56+
ResultMessage(success = false, "Connector does not exist.")
57+
58+
} else if (connector.get.isRunning) {
59+
ResultMessage(success = false, "Connector is running.")
60+
61+
} else if (!ConnectorRegistry.removeConnector(sourceIdentifier, qualifiedConnectorType)) {
62+
ResultMessage(success = false, "Unable to remove connector.")
63+
64+
} else {
65+
chatOverflow.save()
66+
ResultMessage(success = true)
67+
}
68+
}
69+
2570
}

src/main/scala/org/codeoverflow/chatoverflow/ui/web/rest/connector/ConnectorControllerDefinition.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.codeoverflow.chatoverflow.ui.web.rest.connector
22

33
import org.codeoverflow.chatoverflow.connector.ConnectorKey
4-
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.ConnectorDetails
4+
import org.codeoverflow.chatoverflow.ui.web.rest.DTOs.{ConnectorDetails, ConnectorRef, ResultMessage}
55
import org.scalatra.swagger.SwaggerSupport
66
import org.scalatra.swagger.SwaggerSupportSyntax.OperationBuilder
77

@@ -19,6 +19,19 @@ trait ConnectorControllerDefinition extends SwaggerSupport {
1919
parameter pathParam[String]("sourceIdentifier").description("The (connector unique) identifier of e.g. a account to connect to")
2020
parameter pathParam[String]("qualifiedConnectorType").description("The fully qualified type of the connector."))
2121

22+
val postConnector: OperationBuilder =
23+
(apiOperation[ResultMessage]("postConnector")
24+
summary "Creates a new connector."
25+
description "Creates a connector with given sourceIdentifier and connector type."
26+
parameter bodyParam[ConnectorRef]("body").description("Requires platform specific source identifier and connector type."))
27+
28+
val deleteConnector: OperationBuilder =
29+
(apiOperation[ResultMessage]("deleteConnector")
30+
summary "Deletes a specific connector."
31+
description "Deletes the connector specified by identifier and unique type string."
32+
parameter pathParam[String]("sourceIdentifier").description("The (connector unique) identifier of e.g. a account to connect to")
33+
parameter pathParam[String]("qualifiedConnectorType").description("The fully qualified type of the connector."))
34+
2235
override protected def applicationDescription: String = "Handles platform connectors."
2336

2437

0 commit comments

Comments
 (0)