mq done, dao refactor, endpoints refactor
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Torma Kristóf 2020-04-06 00:53:56 +02:00
parent b5be06848e
commit 8cc30d35d2
Signed by: tormakris
GPG Key ID: DC83C4F2C41B1047
11 changed files with 101 additions and 27 deletions

View File

@ -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" .

View File

@ -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"

View File

@ -11,4 +11,9 @@ ktor {
dbUser = ${DB_USER}
dbPassword = ${DB_PASSWORD}
}
mq{
host = ${MQ_HOST}
username = ${MQ_USERNMAE}
password = ${MQ_PASSWORD}
}
}

View File

@ -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<String>): 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("/") {

View File

@ -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
)

View File

@ -1,4 +1,4 @@
package com.kmalbz
package com.kmalbz.api.route
import io.ktor.application.*
import io.ktor.response.*

View File

@ -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<Int> = integer("id").autoIncrement()
object ResultObjects : IntIdTable() {
val tag: Column<String> = varchar("tag",32)
val date: Column<LocalDate> = date("date")
val decision: Column<Boolean> = bool("decision")

View File

@ -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
)
class ResultObject(id: EntityID<Int>): IntEntity(id) {
companion object : IntEntityClass<ResultObject>(ResultObjects)
var tag by ResultObjects.tag
var date by ResultObjects.tag
var decision by ResultObjects.decision
var confidence by ResultObjects.confidence
}

View File

@ -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<ResultObject> = 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<ApiObject> = 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<ResultObject>? = dbQuery {
suspend fun getResultObjectbyDate(date: LocalDate): List<ApiObject>? = dbQuery {
ResultObjects.select {
(ResultObjects.date eq date)
}.mapNotNull { toResultObject(it) }
}
suspend fun getResultObjectbeforeDate(date: LocalDate): List<ResultObject>? = dbQuery {
suspend fun getResultObjectbeforeDate(date: LocalDate): List<ApiObject>? = dbQuery {
ResultObjects.select {
(ResultObjects.date less date)
}.mapNotNull { toResultObject(it) }
}
suspend fun getResultObjectafterDate(date: LocalDate): List<ResultObject>? = dbQuery {
suspend fun getResultObjectafterDate(date: LocalDate): List<ApiObject>? = dbQuery {
ResultObjects.select {
(ResultObjects.date greater date)
}.mapNotNull { toResultObject(it) }
}
suspend fun getResultObjectbyDecision(decision: Boolean): List<ResultObject>? = dbQuery {
suspend fun getResultObjectbyDecision(decision: Boolean): List<ApiObject>? = 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],

7
src/mq/RecieveOutput.kt Normal file
View File

@ -0,0 +1,7 @@
package com.kmalbz.mq
class RecieveOutput {
companion object {
const val EXCHANGE_NAME = "output"
}
}

View File

@ -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.*