From 371483ccde6e4e47555a583fb6e5b747e4f5ded8 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 27 Apr 2021 18:52:36 +0200 Subject: [PATCH] Improve query findFollowsByTarget & add tests --- build.gradle.kts | 2 +- gradle.lockfile | 388 ++++++------------ .../follow/database/FollowRepository.kt | 35 +- .../follow/find_follows_article_by_target.sql | 35 +- .../functional/NotificationConsumerTest.kt | 2 +- .../kotlin/integration/Notification routes.kt | 35 ++ .../kotlin/integration/steps/given/Follow.kt | 18 + src/test/resources/sql/follow.sql | 16 +- 8 files changed, 228 insertions(+), 303 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b8105df..df8a3ee 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -426,7 +426,7 @@ dependencies { testImplementation("io.insert-koin:koin-test:+") testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:+") testImplementation("io.mockk:mockk:+") - testImplementation("org.junit.jupiter:junit-jupiter:+") + testImplementation("org.junit.jupiter:junit-jupiter:5.7.+") testImplementation("org.amshove.kluent:kluent:+") testImplementation("io.mockk:mockk-agent-api:+") testImplementation("io.mockk:mockk-agent-jvm:+") diff --git a/gradle.lockfile b/gradle.lockfile index 5bfd56e..35c296d 100644 --- a/gradle.lockfile +++ b/gradle.lockfile @@ -1,277 +1,131 @@ # This is a Gradle generated file for dependency locking. # Manual edits can break the build and are not advised. # This file is expected to be part of source control. -ch.qos.logback:logback-classic:1.3.0-alpha5=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -ch.qos.logback:logback-core:1.3.0-alpha5=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.auth0:java-jwt:3.15.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.auth0:jwks-rsa:0.9.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.avast.gradle:gradle-docker-compose-plugin:0.14.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.beust:jcommander:1.81=detekt -com.fasterxml.jackson.core:jackson-annotations:2.12.2=detekt -com.fasterxml.jackson.core:jackson-annotations:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-core:2.12.2=detekt -com.fasterxml.jackson.core:jackson-core:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-databind:2.12.2=detekt -com.fasterxml.jackson.core:jackson-databind:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson.datatype:jackson-datatype-joda:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson.module:jackson-module-kotlin:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.fasterxml.jackson:jackson-bom:2.12.2=detekt -com.fasterxml.jackson:jackson-bom:2.12.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.github.flecomte:postgres-json:2.1.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.github.jasync-sql:jasync-common:1.1.7=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.github.jasync-sql:jasync-pool:1.1.7=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.github.jasync-sql:jasync-postgresql:1.1.7=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.github.shyiko.klob:klob:0.2.1=ktlint -com.google.code.findbugs:jsr305:3.0.2=runtimeClasspath,testRuntimeClasspath -com.google.errorprone:error_prone_annotations:2.2.0=runtimeClasspath,testRuntimeClasspath -com.google.guava:failureaccess:1.0.1=runtimeClasspath,testRuntimeClasspath -com.google.guava:guava:27.1-jre=runtimeClasspath,testRuntimeClasspath -com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=runtimeClasspath,testRuntimeClasspath -com.google.j2objc:j2objc-annotations:1.1=runtimeClasspath,testRuntimeClasspath -com.googlecode.json-simple:json-simple:1.1.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.jayway.jsonpath:json-path:2.5.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.ongres.scram:client:2.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.ongres.scram:common:2.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.ongres.stringprep:saslprep:1.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.ongres.stringprep:stringprep:1.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.pinterest.ktlint:ktlint-core:0.40.0=ktlint -com.pinterest.ktlint:ktlint-reporter-baseline:0.40.0=ktlint -com.pinterest.ktlint:ktlint-reporter-checkstyle:0.40.0=ktlint -com.pinterest.ktlint:ktlint-reporter-html:0.40.0=ktlint -com.pinterest.ktlint:ktlint-reporter-json:0.40.0=ktlint -com.pinterest.ktlint:ktlint-reporter-plain:0.40.0=ktlint -com.pinterest.ktlint:ktlint-ruleset-experimental:0.40.0=ktlint -com.pinterest.ktlint:ktlint-ruleset-standard:0.40.0=ktlint -com.pinterest.ktlint:ktlint-ruleset-test:0.40.0=ktlint -com.pinterest:ktlint:0.40.0=ktlint -com.rabbitmq:amqp-client:5.12.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.sendgrid:java-http-client:4.3.6=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.sendgrid:sendgrid-java:4.7.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.sun.mail:javax.mail:1.6.2=runtimeClasspath,testRuntimeClasspath -com.thedeanda:lorem:2.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.typesafe:config:1.3.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -commons-codec:commons-codec:1.11=compileClasspath,implementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata -commons-codec:commons-codec:1.13=runtimeClasspath,testRuntimeClasspath -commons-io:commons-io:2.6=runtimeClasspath,testRuntimeClasspath -commons-logging:commons-logging:1.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -edu.washington.cs.types.checker:checker-framework:1.7.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -info.picocli:picocli:3.9.6=ktlint -io.github.detekt.sarif4j:sarif4j:1.0.0=detekt -io.github.microutils:kotlin-logging:1.7.6=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.gitlab.arturbosch.detekt:detekt-api:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-bom:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-cli:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-core:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-metrics:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-parser:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-psi-utils:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-report-html:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-report-sarif:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-report-txt:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-report-xml:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-complexity:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-coroutines:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-documentation:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-empty:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-errorprone:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-exceptions:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-naming:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-performance:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules-style:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-rules:1.16.0=detekt -io.gitlab.arturbosch.detekt:detekt-tooling:1.16.0=detekt -io.insert-koin:koin-core-ext:3.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.insert-koin:koin-core-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.insert-koin:koin-core:3.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.insert-koin:koin-ktor:3.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.insert-koin:koin-test-jvm:3.0.1=testCompileClasspath,testRuntimeClasspath -io.insert-koin:koin-test:3.0.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.konform:konform-jvm:0.3.0-RC1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.konform:konform-metadata:0.3.0-RC1=implementationDependenciesMetadata,testImplementationDependenciesMetadata -io.ktor:ktor-auth-jwt-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testImplementationDependenciesMetadata -io.ktor:ktor-auth-jwt:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-auth-kotlinMultiplatform:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-auth:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-client-cio-jvm:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-client-cio:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-client-core-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-client-core:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-client-jetty-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-client-jetty:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-client-mock-jvm:1.5.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-client-mock:1.5.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-http-cio-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-http-cio:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-http-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-http:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-io-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-io:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-jackson-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testImplementationDependenciesMetadata -io.ktor:ktor-jackson:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-locations-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testImplementationDependenciesMetadata -io.ktor:ktor-locations:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-network-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-network-tls-certificates-kotlinMultiplatform:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-network-tls-certificates:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-network-tls-jvm:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-network-tls:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-network:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-core-kotlinMultiplatform:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-server-core:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-server-host-common-kotlinMultiplatform:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-host-common:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-jetty-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testImplementationDependenciesMetadata -io.ktor:ktor-server-jetty:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-server-servlet-kotlinMultiplatform:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-servlet:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-test-host-kotlinMultiplatform:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-test-host:1.5.3=testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-server-tests-kotlinMultiplatform:1.5.3=testImplementationDependenciesMetadata -io.ktor:ktor-server-tests:1.5.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-utils-jvm:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -io.ktor:ktor-utils:1.5.3=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-websockets-kotlinMultiplatform:1.5.3=implementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.ktor:ktor-websockets:1.5.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.lettuce:lettuce-core:5.3.6.RELEASE=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-agent-api:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-agent-common:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-agent-jvm:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-common:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-dsl-jvm:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk-dsl:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.mockk:mockk:1.11.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-buffer:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-codec:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-common:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-handler:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-resolver:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.netty:netty-transport:4.1.56.Final=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.projectreactor:reactor-core:3.3.13.RELEASE=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -javax.activation:activation:1.1=runtimeClasspath,testRuntimeClasspath -javax.servlet:javax.servlet-api:3.1.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -joda-time:joda-time:2.10.8=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -junit:junit:4.13.1=testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy-agent:1.10.14=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.10.14=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.java.dev.jna:jna-platform:5.5.0=testRuntimeClasspath -net.java.dev.jna:jna:5.5.0=testRuntimeClasspath -net.minidev:accessors-smart:1.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.minidev:json-smart:2.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.pearx.kasechange:kasechange-jvm:1.3.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.pearx.kasechange:kasechange-metadata:1.3.0=implementationDependenciesMetadata,testImplementationDependenciesMetadata -org.amshove.kluent:kluent-common:1.65=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.amshove.kluent:kluent:1.65=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.apache.httpcomponents:httpasyncclient:4.1.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.apache.httpcomponents:httpclient:4.5.12=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.apache.httpcomponents:httpcore-nio:4.4.5=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.apache.httpcomponents:httpcore:4.4.13=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.apiguardian:apiguardian-api:1.1.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.bouncycastle:bcprov-jdk15on:1.67=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.checkerframework:checker-qual:2.5.2=runtimeClasspath,testRuntimeClasspath -org.codehaus.mojo:animal-sniffer-annotations:1.17=runtimeClasspath,testRuntimeClasspath -org.ec4j.core:ec4j-core:0.2.2=ktlint -org.eclipse.jetty.http2:http2-client:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.http2:http2-common:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.http2:http2-hpack:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.http2:http2-http-client-transport:9.4.31.v20200723=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.http2:http2-server:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-client:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-java-client:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-java-server:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-openjdk8-client:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-openjdk8-server:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-server:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-client:9.4.31.v20200723=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-continuation:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-http:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-io:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-server:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-servlets:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-util:9.4.31.v20200723=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.elasticsearch.client:elasticsearch-rest-client:6.8.15=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath -org.jacoco:org.jacoco.agent:0.8.6=jacocoAgent,jacocoAnt -org.jacoco:org.jacoco.ant:0.8.6=jacocoAnt -org.jacoco:org.jacoco.core:0.8.6=jacocoAnt -org.jacoco:org.jacoco.report:0.8.6=jacocoAnt -org.jetbrains.intellij.deps:trove4j:1.0.20181211=detekt,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,ktlint -org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.21=detekt -org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.32=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.21=detekt -org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.32=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath +ch.qos.logback:logback-classic:1.3.0-alpha5=compileClasspath +ch.qos.logback:logback-core:1.3.0-alpha5=compileClasspath +com.auth0:java-jwt:3.15.0=compileClasspath +com.auth0:jwks-rsa:0.9.0=compileClasspath +com.avast.gradle:gradle-docker-compose-plugin:0.14.3=compileClasspath +com.fasterxml.jackson.core:jackson-annotations:2.12.3=compileClasspath +com.fasterxml.jackson.core:jackson-core:2.12.3=compileClasspath +com.fasterxml.jackson.core:jackson-databind:2.12.3=compileClasspath +com.fasterxml.jackson.datatype:jackson-datatype-joda:2.12.3=compileClasspath +com.fasterxml.jackson.module:jackson-module-kotlin:2.12.3=compileClasspath +com.fasterxml.jackson:jackson-bom:2.12.3=compileClasspath +com.github.flecomte:postgres-json:2.1.2=compileClasspath +com.github.jasync-sql:jasync-common:1.1.7=compileClasspath +com.github.jasync-sql:jasync-pool:1.1.7=compileClasspath +com.github.jasync-sql:jasync-postgresql:1.1.7=compileClasspath +com.googlecode.json-simple:json-simple:1.1.1=compileClasspath +com.jayway.jsonpath:json-path:2.5.0=compileClasspath +com.ongres.scram:client:2.1=compileClasspath +com.ongres.scram:common:2.1=compileClasspath +com.ongres.stringprep:saslprep:1.1=compileClasspath +com.ongres.stringprep:stringprep:1.1=compileClasspath +com.rabbitmq:amqp-client:5.12.0=compileClasspath +com.sendgrid:java-http-client:4.3.6=compileClasspath +com.sendgrid:sendgrid-java:4.7.1=compileClasspath +com.typesafe:config:1.3.1=compileClasspath +commons-codec:commons-codec:1.11=compileClasspath +commons-logging:commons-logging:1.2=compileClasspath +edu.washington.cs.types.checker:checker-framework:1.7.0=compileClasspath +io.github.microutils:kotlin-logging:1.7.6=compileClasspath +io.insert-koin:koin-core-ext:3.0.1=compileClasspath +io.insert-koin:koin-core-jvm:3.0.1=compileClasspath +io.insert-koin:koin-core:3.0.1=compileClasspath +io.insert-koin:koin-ktor:3.0.1=compileClasspath +io.konform:konform-jvm:0.3.0-RC1=compileClasspath +io.ktor:ktor-auth-jwt:1.5.3=compileClasspath +io.ktor:ktor-auth-kotlinMultiplatform:1.5.3=compileClasspath +io.ktor:ktor-auth:1.5.3=compileClasspath +io.ktor:ktor-client-core-jvm:1.5.3=compileClasspath +io.ktor:ktor-client-core:1.5.3=compileClasspath +io.ktor:ktor-client-jetty:1.5.3=compileClasspath +io.ktor:ktor-http-cio-jvm:1.5.3=compileClasspath +io.ktor:ktor-http-cio:1.5.3=compileClasspath +io.ktor:ktor-http-jvm:1.5.3=compileClasspath +io.ktor:ktor-http:1.5.3=compileClasspath +io.ktor:ktor-io-jvm:1.5.3=compileClasspath +io.ktor:ktor-io:1.5.3=compileClasspath +io.ktor:ktor-jackson:1.5.3=compileClasspath +io.ktor:ktor-locations:1.5.3=compileClasspath +io.ktor:ktor-network-jvm:1.5.3=compileClasspath +io.ktor:ktor-network:1.5.3=compileClasspath +io.ktor:ktor-server-core-kotlinMultiplatform:1.5.3=compileClasspath +io.ktor:ktor-server-core:1.5.3=compileClasspath +io.ktor:ktor-server-host-common-kotlinMultiplatform:1.5.3=compileClasspath +io.ktor:ktor-server-host-common:1.5.3=compileClasspath +io.ktor:ktor-server-jetty:1.5.3=compileClasspath +io.ktor:ktor-server-servlet-kotlinMultiplatform:1.5.3=compileClasspath +io.ktor:ktor-server-servlet:1.5.3=compileClasspath +io.ktor:ktor-utils-jvm:1.5.3=compileClasspath +io.ktor:ktor-utils:1.5.3=compileClasspath +io.ktor:ktor-websockets:1.5.3=compileClasspath +io.lettuce:lettuce-core:5.3.6.RELEASE=compileClasspath +io.netty:netty-buffer:4.1.56.Final=compileClasspath +io.netty:netty-codec:4.1.56.Final=compileClasspath +io.netty:netty-common:4.1.56.Final=compileClasspath +io.netty:netty-handler:4.1.56.Final=compileClasspath +io.netty:netty-resolver:4.1.56.Final=compileClasspath +io.netty:netty-transport:4.1.56.Final=compileClasspath +io.projectreactor:reactor-core:3.4.1=compileClasspath +javax.servlet:javax.servlet-api:3.1.0=compileClasspath +joda-time:joda-time:2.10.8=compileClasspath +net.minidev:accessors-smart:1.2=compileClasspath +net.minidev:json-smart:2.3=compileClasspath +net.pearx.kasechange:kasechange-jvm:1.3.0=compileClasspath +org.apache.httpcomponents:httpasyncclient:4.1.2=compileClasspath +org.apache.httpcomponents:httpclient:4.5.12=compileClasspath +org.apache.httpcomponents:httpcore-nio:4.4.5=compileClasspath +org.apache.httpcomponents:httpcore:4.4.13=compileClasspath +org.bouncycastle:bcprov-jdk15on:1.67=compileClasspath +org.eclipse.jetty.http2:http2-client:9.4.31.v20200723=compileClasspath +org.eclipse.jetty.http2:http2-common:9.4.31.v20200723=compileClasspath +org.eclipse.jetty.http2:http2-hpack:9.4.31.v20200723=compileClasspath +org.eclipse.jetty.http2:http2-server:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-client:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-java-client:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-java-server:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-openjdk8-client:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-openjdk8-server:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-alpn-server:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-continuation:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-http:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-io:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-server:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-servlets:9.4.31.v20200723=compileClasspath +org.eclipse.jetty:jetty-util:9.4.31.v20200723=compileClasspath +org.elasticsearch.client:elasticsearch-rest-client:6.8.15=compileClasspath +org.jetbrains.intellij.deps:trove4j:1.0.20181211=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.32=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.32=kotlinCompilerClasspath org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.4.32=kotlinCompilerPluginClasspath -org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.4.32=kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-reflect:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-reflect:1.4.21=detekt,implementationDependenciesMetadata -org.jetbrains.kotlin:kotlin-reflect:1.4.32=compileClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-script-runtime:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-script-runtime:1.4.21=detekt -org.jetbrains.kotlin:kotlin-script-runtime:1.4.32=kotlinCompilerClasspath,kotlinCompilerPluginClasspath,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-reflect:1.4.32=compileClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-script-runtime:1.4.32=kotlinCompilerClasspath,kotlinCompilerPluginClasspath org.jetbrains.kotlin:kotlin-scripting-common:1.4.32=kotlinCompilerPluginClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.4.32=kotlinCompilerPluginClasspath org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.4.32=kotlinCompilerPluginClasspath org.jetbrains.kotlin:kotlin-scripting-jvm:1.4.32=kotlinCompilerPluginClasspath -org.jetbrains.kotlin:kotlin-serialization-unshaded:1.4.32=kotlinNativeCompilerPluginClasspath org.jetbrains.kotlin:kotlin-serialization:1.4.32=kotlinCompilerPluginClasspath -org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-stdlib-common:1.4.21=detekt -org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32=compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspath,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.21=detekt -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.21=detekt -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib:1.4.10=ktlint -org.jetbrains.kotlin:kotlin-stdlib:1.4.21=detekt -org.jetbrains.kotlin:kotlin-stdlib:1.4.32=compileClasspath,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspath,kotlinKlibCommonizerClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-test-annotations-common:1.4.30=testImplementationDependenciesMetadata -org.jetbrains.kotlin:kotlin-test-annotations-common:1.4.32=testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-test-common:1.4.30=testImplementationDependenciesMetadata -org.jetbrains.kotlin:kotlin-test-common:1.4.32=testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-test-junit:1.4.32=testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-test:1.4.32=testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2=implementationDependenciesMetadata,testImplementationDependenciesMetadata -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3-native-mt=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-metadata:1.4.2=implementationDependenciesMetadata,testImplementationDependenciesMetadata +org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32=kotlinCompilerClasspath,kotlinCompilerPluginClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0=compileClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0=compileClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0=compileClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.4.32=kotlinCompilerClasspath,kotlinCompilerPluginClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.5.0=compileClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0-RC=compileClasspath org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8=kotlinCompilerPluginClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2=implementationDependenciesMetadata -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3-native-mt=compileClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.4.3-native-mt=testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.3-native-mt=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.4.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.4.2=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-html-jvm:0.7.2=detekt -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-serialization-core-metadata:1.0.1=implementationDependenciesMetadata,testImplementationDependenciesMetadata -org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-serialization-json-metadata:1.0.1=implementationDependenciesMetadata,testImplementationDependenciesMetadata -org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains:annotations:13.0=compileClasspath,detekt,implementationDependenciesMetadata,kotlinCompilerClasspath,kotlinCompilerPluginClasspath,kotlinKlibCommonizerClasspath,ktlint,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.joda:joda-convert:1.8.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-api:5.8.0-M1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.8.0-M1=testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.8.0-M1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.8.0-M1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.8.0-M1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.8.0-M1=testRuntimeClasspath -org.junit:junit-bom:5.8.0-M1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.objenesis:objenesis:3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.openapi4j:openapi-core:1.0.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.openapi4j:openapi-operation-validator:1.0.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.openapi4j:openapi-parser:1.0.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.openapi4j:openapi-schema-validator:1.0.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.ow2.asm:asm-analysis:8.0.1=jacocoAnt -org.ow2.asm:asm-commons:8.0.1=jacocoAnt -org.ow2.asm:asm-tree:8.0.1=jacocoAnt -org.ow2.asm:asm:5.0.4=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.ow2.asm:asm:8.0.1=jacocoAnt -org.reactivestreams:reactive-streams:1.0.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.slf4j:slf4j-api:2.0.0-alpha1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.yaml:snakeyaml:1.27=testCompileClasspath,testImplementationDependenciesMetadata -org.yaml:snakeyaml:1.28=detekt,runtimeClasspath,testRuntimeClasspath -empty=annotationProcessor,apiDependenciesMetadata,compile,compileOnly,compileOnlyDependenciesMetadata,detektPlugins,kotlinScriptDef,kotlinScriptDefExtensions,ktlintReporter,ktlintRuleset,runtime,runtimeOnlyDependenciesMetadata,shadow,testAnnotationProcessor,testApiDependenciesMetadata,testCompile,testCompileOnly,testCompileOnlyDependenciesMetadata,testKotlinScriptDef,testKotlinScriptDefExtensions,testRuntime,testRuntimeOnlyDependenciesMetadata +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC=compileClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.3-native-mt=compileClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.5.0-RC=compileClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.5.0-RC=compileClasspath +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.2.0=compileClasspath +org.jetbrains.kotlinx:kotlinx-serialization-core:1.2.0=compileClasspath +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.2.0=compileClasspath +org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0=compileClasspath +org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspath +org.joda:joda-convert:1.8.1=compileClasspath +org.ow2.asm:asm:5.0.4=compileClasspath +org.reactivestreams:reactive-streams:1.0.3=compileClasspath +org.slf4j:slf4j-api:2.0.0-alpha1=compileClasspath +empty= diff --git a/src/main/kotlin/fr/dcproject/component/follow/database/FollowRepository.kt b/src/main/kotlin/fr/dcproject/component/follow/database/FollowRepository.kt index 87a277d..96063ff 100644 --- a/src/main/kotlin/fr/dcproject/component/follow/database/FollowRepository.kt +++ b/src/main/kotlin/fr/dcproject/component/follow/database/FollowRepository.kt @@ -74,21 +74,24 @@ sealed class FollowRepository(override var requ target: Entity, bulkSize: Int = 300 ): Flow> = flow { - var nextPage = 1 - do { - val paginate = findFollowsByTarget(target, nextPage, bulkSize) - paginate.result.forEach { + var lastId: UUID? = null + while (true) { + val result = findFollowsByTarget(target, lastId, bulkSize) + if (result.count() == 0) { + break + } + result.forEach { emit(it) } - nextPage = paginate.currentPage + 1 - } while (!paginate.isLastPage()) + lastId = result.last().id + } } abstract fun findFollowsByTarget( target: Entity, - page: Int = 1, + lastId: UUID?, limit: Int = 300 - ): Paginated> + ): List> } class FollowArticleRepository(requester: Requester) : FollowRepository(requester) { @@ -109,14 +112,14 @@ class FollowArticleRepository(requester: Requester) : FollowRepository> { + ): List> { return requester .getFunction("find_follows_article_by_target") .select( - page, - limit, + "start_id" to lastId, + "limit" to limit, "target_id" to target.id ) } @@ -140,9 +143,9 @@ class FollowConstitutionRepository(requester: Requester) : FollowRepository> { + ): List> { TODO("Not yet implemented") } } @@ -165,9 +168,9 @@ class FollowCitizenRepository(requester: Requester) : FollowRepository> { + ): List> { TODO("Not yet implemented") } } diff --git a/src/main/resources/sql/functions/follow/find_follows_article_by_target.sql b/src/main/resources/sql/functions/follow/find_follows_article_by_target.sql index 6baded1..eae0937 100644 --- a/src/main/resources/sql/functions/follow/find_follows_article_by_target.sql +++ b/src/main/resources/sql/functions/follow/find_follows_article_by_target.sql @@ -1,20 +1,21 @@ create or replace function find_follows_article_by_target( _target_id uuid, - "limit" int default 50, - "offset" int default 0, - out resource json, - out total int + _limit int default 50, + _start_id uuid default null, + out resource json ) language plpgsql as $$ declare _version_id uuid = (select version_id from article where id = _target_id); + _start_at timestamp default '2000-01-01 00:00:00'::timestamp; + _article_creator_id uuid = (select created_by_id from article where id = _target_id); begin - select json_agg(t), ( - select count(f.id) - from follow f - join article a on f.target_id = a.id - where a.version_id = _version_id) - into resource, total + if _start_id is not null then + select created_at into _start_at from follow where id = _start_id; + end if; + + select json_agg(t) + into resource from ( select f.id, @@ -22,11 +23,17 @@ begin f.target_reference, json_build_object('id', f.target_id) as target, find_citizen_by_id_with_user(f.created_by_id) as created_by - from follow_article as f - join article a on f.target_id = a.id - where a.version_id = _version_id + from follow as f + left join article a on f.target_reference = 'article'::regclass and f.target_id = a.id + where ( + (f.target_reference = 'article'::regclass and a.version_id = _version_id) + or + (f.target_reference = 'citizen'::regclass and f.target_id = _article_creator_id) + ) + and f.created_at >= _start_at + and (_start_id is null or f.id != _start_id) order by f.created_at - limit "limit" offset "offset" + limit _limit ) as t; end $$; diff --git a/src/test/kotlin/functional/NotificationConsumerTest.kt b/src/test/kotlin/functional/NotificationConsumerTest.kt index 078da93..2a44944 100644 --- a/src/test/kotlin/functional/NotificationConsumerTest.kt +++ b/src/test/kotlin/functional/NotificationConsumerTest.kt @@ -66,7 +66,7 @@ class NotificationConsumerTest { @KtorExperimentalAPI @ExperimentalCoroutinesApi @Test - fun `can be send notification`() = runBlocking { + fun `can be receive article update notification when follow article`() = runBlocking { val config: Configuration = Configuration("application-test.conf") /* Create mocks and spy's */ val emailSender = mockk() { diff --git a/src/test/kotlin/integration/Notification routes.kt b/src/test/kotlin/integration/Notification routes.kt index ce923f1..afff34f 100644 --- a/src/test/kotlin/integration/Notification routes.kt +++ b/src/test/kotlin/integration/Notification routes.kt @@ -3,6 +3,7 @@ package integration import fr.dcproject.component.citizen.database.CitizenI.Name import fr.dcproject.component.notification.ArticleUpdateNotificationMessage import fr.dcproject.component.notification.NotificationMessage +import integration.steps.given.`And follow citizen` import integration.steps.given.`Given I have article update notification` import integration.steps.given.`Given I have article` import integration.steps.given.`Given I have citizen` @@ -50,4 +51,38 @@ class `Notification routes` : BaseTest() { } } } + + @Test + fun `I can receive article update notification when follow the creator`() { + withIntegrationApplication { + `Given I have citizen`("Thomas", "Pesquet", id = "1a34191a-9cde-45ba-8ac1-230138a102d3") + `Given I have article`(id = "a06cbfb7-3094-4d64-aaa1-7486c0c292f4", createdBy = Name(firstName = "Thomas", lastName = "Pesquet")) + `Given I have citizen`("Alan", "Bean") { + `And follow citizen`(Name("Thomas", "Pesquet")) + } + `Given I have article update notification`("a06cbfb7-3094-4d64-aaa1-7486c0c292f4") + + Thread.sleep(1000) + + handleWebSocketConversation( + "/notifications", + { + `authenticated in url as`("Alan", "Bean") + } + ) { incoming, outgoing -> + incoming.receive().let { + when (it) { + is Frame.Text -> NotificationMessage.fromString(it.readText()).let { notif -> + assertEquals( + "a06cbfb7-3094-4d64-aaa1-7486c0c292f4", + notif.target.id.toString() + ) + outgoing.send(it) + } + else -> error(it.toString()) + } + } + } + } + } } diff --git a/src/test/kotlin/integration/steps/given/Follow.kt b/src/test/kotlin/integration/steps/given/Follow.kt index 4921986..3551e28 100644 --- a/src/test/kotlin/integration/steps/given/Follow.kt +++ b/src/test/kotlin/integration/steps/given/Follow.kt @@ -30,6 +30,13 @@ fun Citizen.`And follow citizen`( ) { createFollow(this, CitizenRef(citizen.toUUID())) } +fun Citizen.`And follow citizen`( + name: CitizenI.Name, +) { + val citizenRepository: CitizenRepository by lazy { GlobalContext.get().get() } + val citizen = citizenRepository.findByName(name) ?: error("Citizen not exist") + createFollow(this, CitizenRef(citizen.id)) +} fun TestApplicationEngine.`Given I have follow on article`( firstName: String, @@ -41,6 +48,17 @@ fun TestApplicationEngine.`Given I have follow on article`( createFollow(citizen, ArticleRef(article.toUUID())) } +fun TestApplicationEngine.`Given I have follow on citizen`( + firstName: String, + lastName: String, + target: CitizenI.Name, +) { + val citizenRepository: CitizenRepository by lazy { GlobalContext.get().get() } + val citizen = citizenRepository.findByName(CitizenI.Name(firstName, lastName)) ?: error("Citizen not exist") + val targetCitizen = citizenRepository.findByName(target) ?: error("Citizen not exist") + createFollow(citizen, CitizenRef(targetCitizen.id)) +} + fun TestApplicationEngine.`Given I have follow on constitution`( firstName: String, lastName: String, diff --git a/src/test/resources/sql/follow.sql b/src/test/resources/sql/follow.sql index 0d98afc..c6ed79e 100644 --- a/src/test/resources/sql/follow.sql +++ b/src/test/resources/sql/follow.sql @@ -7,17 +7,19 @@ declare _version_id1 uuid = uuid_generate_v4(); first_article_id uuid := fixture_article(_citizen_id := _citizen_id, _version_id := _version_id1); first_article_updated_id uuid; + _follow_count int = 0; begin perform follow('citizen'::regclass, _citizen_id, _citizen_id2); assert (select count(*) = 1 from follow), 'follow must be inserted'; assert (select following = true from find_follow(_citizen_id, _citizen_id2, 'citizen')), 'find_follow must return the following'; perform follow('citizen'::regclass, _citizen_id, _citizen_id2); - assert (select count(*) = 1 from follow), 'follow must be inserted'; + assert (select count(*) = 1 from follow), 're follow must be do nothing'; perform unfollow('citizen'::regclass, _citizen_id, _citizen_id2); assert (select count(*) = 0 from follow), 'follow must be deleted after unfollow'; + perform follow('article'::regclass, first_article_id, _citizen_id); assert (select following = true from find_follow(first_article_id, _citizen_id, 'article')), 'find_follow must return the following'; assert (select following = false from find_follow(first_article_id, _citizen_id2, 'article')), 'find_follow must not return the following if not followinf'; @@ -29,11 +31,17 @@ begin assert (select following = true from find_follow(first_article_id, _citizen_id, 'article')), '(v1) find_follow must return the following'; assert (select following = true from find_follow(first_article_updated_id, _citizen_id, 'article')), '(v2) find_follow must return the following'; - assert (select f.total = 1 from find_follows_article_by_target(first_article_id) as f), 'find_follows_article_by_target must return 1 follow'; - assert (select (f.resource#>>'{0, created_by, id}')::uuid = _citizen_id from find_follows_article_by_target(first_article_id) as f), 'find_follows_article_by_target must return follows with creator'; + assert (select count(*) = 1 from follow), 'must be only 1 follow'; + perform follow('citizen'::regclass, _citizen_id, _citizen_id2); + assert (select count(*) = 2 from follow), 'follow citizen must be inserted'; + assert (select json_array_length(f.resource) = 2 from find_follows_article_by_target(first_article_id) as f), 'find_follows_article_by_target must return 2 follows'; + assert (select (f.resource#>>'{0, created_by, id}')::uuid = _citizen_id from find_follows_article_by_target(first_article_id) as f), 'find_follows_article_by_target must return follows with creator'; + assert (select (f.resource#>>'{1, created_by, id}')::uuid = _citizen_id2 from find_follows_article_by_target(first_article_id) as f), 'find_follows_article_by_target must return follows with creator'; + + _follow_count = (select count(*) from follow); perform unfollow('article'::regclass, first_article_id, _citizen_id); - assert (select count(*) = 0 from follow), 'follow must be deleted after unfollow, event if article is on other version'; + assert (select count(*) = _follow_count-1 from follow), 'follow must be deleted after unfollow, event if article is on other version'; rollback; raise notice 'follow test pass';