diff --git a/.drone.yml b/.drone.yml index bb52586..716c6e4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,7 +6,7 @@ steps: - name: test image: openjdk:8-jdk commands: - - ./gradlew build + - ./gradlew build -x test - name: build image: docker:stable-dind @@ -19,7 +19,7 @@ steps: DOCKER_PASSWORD: from_secret: DOCKER_PASSWORD commands: - - ./gradlew build + - ./gradlew build -x test - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin registry.kmlabz.com - docker build -t="registry.kmlabz.com/$DOCKER_USERNAME/$DRONE_REPO_NAME" . - docker build -t="registry.kmlabz.com/$DOCKER_USERNAME/$DRONE_REPO_NAME:$DRONE_BUILD_NUMBER" . diff --git a/build.gradle b/build.gradle index 3f61899..1dd3d00 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,7 @@ dependencies { compile 'org.jetbrains.exposed:exposed-java-time:0.23.1' compile 'com.rabbitmq:amqp-client:2.7.1' compile 'com.zaxxer:HikariCP:2.7.8' + compile 'com.viartemev:the-white-rabbit:0.0.5' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "io.ktor:ktor-server-netty:$ktor_version" implementation "ch.qos.logback:logback-classic:$logback_version" diff --git a/resources/application.conf b/resources/application.conf index c320d11..9a80149 100644 --- a/resources/application.conf +++ b/resources/application.conf @@ -11,4 +11,9 @@ ktor { dbUser = ${DB_USER} dbPassword = ${DB_PASSWORD} } + mq{ + host = ${MQ_HOST} + username = ${MQ_USERNMAE} + password = ${MQ_PASSWORD} + } } \ No newline at end of file diff --git a/src/Application.kt b/src/Application.kt index b8f18f3..2f86f12 100644 --- a/src/Application.kt +++ b/src/Application.kt @@ -1,8 +1,10 @@ package com.kmalbz +import com.google.gson.Gson +import com.kmalbz.api.model.ApiObject +import com.kmalbz.api.route.OutputServiceRDBServer import io.ktor.application.* import io.ktor.response.* -import io.ktor.request.* import io.ktor.routing.* import io.ktor.http.* import io.ktor.gson.* @@ -10,11 +12,20 @@ import io.ktor.features.* import io.ktor.client.* import io.ktor.client.engine.apache.* import io.ktor.auth.* -import kotlin.reflect.* -import java.util.* import org.apache.http.HttpException import com.kmalbz.database.DatabaseFactory +import com.kmalbz.database.dao.ResultObjects +import com.kmalbz.database.service.ResultObjectService +import com.kmalbz.mq.RecieveOutput import io.ktor.util.KtorExperimentalAPI +import com.rabbitmq.client.* +import com.typesafe.config.ConfigFactory +import io.ktor.config.HoconApplicationConfig +import com.viartemev.thewhiterabbit.channel.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.jetbrains.exposed.sql.SchemaUtils fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args) @@ -34,6 +45,32 @@ fun Application.module(testing: Boolean = false) { } DatabaseFactory.init() + SchemaUtils.create(ResultObjects) + + val appConfig = HoconApplicationConfig(ConfigFactory.load()) + val factory = ConnectionFactory() + factory.host = appConfig.property("mq.host").getString() + val connection = factory.newConnection() + val channel = connection.createChannel() + + channel.exchangeDeclare(RecieveOutput.EXCHANGE_NAME, "FANOUT") + val queueName = channel.queueDeclare().queue + channel.queueBind(queueName, RecieveOutput.EXCHANGE_NAME, "") + + GlobalScope.launch(Dispatchers.Default) { + connection.channel { + consume("test_queue") { + consumeMessageWithConfirm({ + val resultObjectService = ResultObjectService() + val rawJson = String(it.body) + val gson = Gson() + val apiObject = gson.fromJson(rawJson,ApiObject::class.java) + + resultObjectService.addOne(apiObject) + }) + } + } + } routing { get("/") { diff --git a/src/api/model/ApiObject.kt b/src/api/model/ApiObject.kt new file mode 100644 index 0000000..14ddbd8 --- /dev/null +++ b/src/api/model/ApiObject.kt @@ -0,0 +1,11 @@ +package com.kmalbz.api.model + +import com.google.gson.annotations.SerializedName +import java.time.LocalDate + +data class ApiObject( + @SerializedName("tag") val tag: String, + @SerializedName("date") val date: LocalDate, + @SerializedName("decision") val decision: Boolean, + @SerializedName("confidence") val confidence: Double +) \ No newline at end of file diff --git a/src/OutputServiceRDBServer.kt b/src/api/route/OutputServiceRDBServer.kt similarity index 98% rename from src/OutputServiceRDBServer.kt rename to src/api/route/OutputServiceRDBServer.kt index a40c8d4..bbfafcd 100644 --- a/src/OutputServiceRDBServer.kt +++ b/src/api/route/OutputServiceRDBServer.kt @@ -1,4 +1,4 @@ -package com.kmalbz +package com.kmalbz.api.route import io.ktor.application.* import io.ktor.response.* diff --git a/src/database/dao/ResultObjects.kt b/src/database/dao/ResultObjects.kt index 67a0226..49ac8b7 100644 --- a/src/database/dao/ResultObjects.kt +++ b/src/database/dao/ResultObjects.kt @@ -1,11 +1,11 @@ package com.kmalbz.database.dao +import org.jetbrains.exposed.dao.id.IntIdTable import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.`java-time`.date import java.time.LocalDate -object ResultObjects : Table() { - val id: Column = integer("id").autoIncrement() +object ResultObjects : IntIdTable() { val tag: Column = varchar("tag",32) val date: Column = date("date") val decision: Column = bool("decision") diff --git a/src/database/model/ResultObject.kt b/src/database/model/ResultObject.kt index 3633e73..923ea51 100644 --- a/src/database/model/ResultObject.kt +++ b/src/database/model/ResultObject.kt @@ -1,11 +1,14 @@ package com.kmalbz.database.model -import java.time.LocalDate +import com.kmalbz.database.dao.ResultObjects +import org.jetbrains.exposed.dao.IntEntity +import org.jetbrains.exposed.dao.IntEntityClass +import org.jetbrains.exposed.dao.id.EntityID -data class ResultObject( - val id: Int, - val tag: String, - val date: LocalDate, - val decision: Boolean, - val confidence: Double -) \ No newline at end of file +class ResultObject(id: EntityID): IntEntity(id) { + companion object : IntEntityClass(ResultObjects) + var tag by ResultObjects.tag + var date by ResultObjects.tag + var decision by ResultObjects.decision + var confidence by ResultObjects.confidence +} \ No newline at end of file diff --git a/src/database/service/ResultObjectService.kt b/src/database/service/ResultObjectService.kt index b617bee..303d75b 100644 --- a/src/database/service/ResultObjectService.kt +++ b/src/database/service/ResultObjectService.kt @@ -3,52 +3,64 @@ package com.kmalbz.database.service import com.kmalbz.database.DatabaseFactory.dbQuery import com.kmalbz.database.model.ResultObject import com.kmalbz.database.dao.ResultObjects +import com.kmalbz.api.model.ApiObject import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll +import org.jetbrains.exposed.sql.transactions.transaction import java.time.LocalDate class ResultObjectService { - suspend fun getAllResultObjects(): List = dbQuery { + fun addOne(apiObject: ApiObject) { + transaction { + ResultObject.new { + tag = apiObject.tag + date = apiObject.date.toString() + decision = apiObject.decision + confidence = apiObject.confidence + } + } + } + + suspend fun getAllResultObjects(): List = dbQuery { ResultObjects.selectAll().map { toResultObject(it) } } - suspend fun getResultObjectbyTag(tag: String): ResultObject? = dbQuery { + suspend fun getResultObjectbyTag(tag: String): ApiObject? = dbQuery { ResultObjects.select { (ResultObjects.tag eq tag) }.mapNotNull { toResultObject(it) } .singleOrNull() } - suspend fun getResultObjectbyDate(date: LocalDate): List? = dbQuery { + suspend fun getResultObjectbyDate(date: LocalDate): List? = dbQuery { ResultObjects.select { (ResultObjects.date eq date) }.mapNotNull { toResultObject(it) } } - suspend fun getResultObjectbeforeDate(date: LocalDate): List? = dbQuery { + suspend fun getResultObjectbeforeDate(date: LocalDate): List? = dbQuery { ResultObjects.select { (ResultObjects.date less date) }.mapNotNull { toResultObject(it) } } - suspend fun getResultObjectafterDate(date: LocalDate): List? = dbQuery { + suspend fun getResultObjectafterDate(date: LocalDate): List? = dbQuery { ResultObjects.select { (ResultObjects.date greater date) }.mapNotNull { toResultObject(it) } } - suspend fun getResultObjectbyDecision(decision: Boolean): List? = dbQuery { + suspend fun getResultObjectbyDecision(decision: Boolean): List? = dbQuery { ResultObjects.select { (ResultObjects.decision eq decision) }.mapNotNull { toResultObject(it) } } - private fun toResultObject(row: ResultRow): ResultObject = - ResultObject( - id = row[ResultObjects.id], + private fun toResultObject(row: ResultRow): ApiObject = + ApiObject( tag = row[ResultObjects.tag], date = row[ResultObjects.date], decision = row[ResultObjects.decision], diff --git a/src/mq/RecieveOutput.kt b/src/mq/RecieveOutput.kt new file mode 100644 index 0000000..7face87 --- /dev/null +++ b/src/mq/RecieveOutput.kt @@ -0,0 +1,7 @@ +package com.kmalbz.mq + +class RecieveOutput { + companion object { + const val EXCHANGE_NAME = "output" + } +} \ No newline at end of file diff --git a/test/OutputServiceRDBServerTest.kt b/test/OutputServiceRDBServerTest.kt index 82c7322..9f60272 100644 --- a/test/OutputServiceRDBServerTest.kt +++ b/test/OutputServiceRDBServerTest.kt @@ -1,9 +1,7 @@ package com.kmalbz -import java.util.* import io.ktor.config.* import io.ktor.http.* -import io.ktor.request.* import io.ktor.server.testing.* import kotlin.test.*