diff --git a/publishing/ktor/client/build.gradle b/publishing/ktor/client/build.gradle new file mode 100644 index 00000000..4fef490f --- /dev/null +++ b/publishing/ktor/client/build.gradle @@ -0,0 +1,78 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$gradle_bintray_plugin_version" + } +} + +plugins { + id "org.jetbrains.kotlin.multiplatform" version "$kotlin_version" + id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" +} + +project.version = "$core_version" +project.group = "com.insanusmokrassar" + +apply from: "publish.gradle" + +repositories { + mavenLocal() + jcenter() + mavenCentral() + maven { url "https://kotlin.bintray.com/kotlinx" } +} + +kotlin { + jvm() + js() + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib') + + if ((project.hasProperty('RELEASE_MODE') && project.property('RELEASE_MODE') == "true") || System.getenv('RELEASE_MODE') == "true") { + api "com.insanusmokrassar:postssystem.core.ktor.common:$core_version" + api "com.insanusmokrassar:postssystem.ktor.client:$core_version" + } else { + api projectByName("postssystem.publishing.ktor.common") + api projectByName("postssystem.ktor.client") + } + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + jvmMain { + dependencies { + implementation kotlin('stdlib-jdk8') + } + } + jvmTest { + dependencies { + implementation kotlin('test-junit') + } + } + jsMain { + dependencies { + implementation kotlin('stdlib-js') + } + } + jsTest { + dependencies { + implementation kotlin('test-js') + implementation kotlin('test-junit') + } + } + } +} diff --git a/publishing/ktor/client/publish.gradle b/publishing/ktor/client/publish.gradle new file mode 100644 index 00000000..e69de29b diff --git a/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/PublishingKeysRepoKtorClient.kt b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/PublishingKeysRepoKtorClient.kt new file mode 100644 index 00000000..7739efc0 --- /dev/null +++ b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/PublishingKeysRepoKtorClient.kt @@ -0,0 +1,29 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.client + +import com.insanusmokrassar.postssystem.core.publishing.repos.PublishingKeysRepo +import com.insanusmokrassar.postssystem.core.publishing.repos.ReadPublishingKeysRepo +import com.insanusmokrassar.postssystem.core.publishing.repos.WritePublishingKeysRepo +import com.insanusmokrassar.postssystem.publishing.ktor.publishingKeysRootRoute +import io.ktor.client.HttpClient +import io.ktor.client.features.websocket.WebSockets + +class PublishingKeysRepoKtorClient private constructor ( + readPublishingKeysClient: ReadPublishingKeysRepoKtorClient, + writePublishingKeysClient: WritePublishingKeysRepoKtorClient +) : PublishingKeysRepo, ReadPublishingKeysRepo by readPublishingKeysClient, WritePublishingKeysRepo by writePublishingKeysClient { + constructor( + baseUrl: String, + client: HttpClient = HttpClient { + install(WebSockets) + } + ) : this ( + ReadPublishingKeysRepoKtorClient ( + "$baseUrl/$publishingKeysRootRoute", + client + ), + WritePublishingKeysRepoKtorClient( + "$baseUrl/$publishingKeysRootRoute", + client + ) + ) +} \ No newline at end of file diff --git a/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/ReadPublishingKeysRepoKtorClient.kt b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/ReadPublishingKeysRepoKtorClient.kt new file mode 100644 index 00000000..216b8428 --- /dev/null +++ b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/ReadPublishingKeysRepoKtorClient.kt @@ -0,0 +1,26 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.client + +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.publishing.TriggerControlKey +import com.insanusmokrassar.postssystem.core.publishing.repos.ReadPublishingKeysRepo +import com.insanusmokrassar.postssystem.ktor.client.uniget +import com.insanusmokrassar.postssystem.publishing.ktor.getPostIdByTriggerControlKeyRoute +import com.insanusmokrassar.postssystem.publishing.ktor.getTriggerControlKeyByPostIdRoute +import io.ktor.client.HttpClient +import kotlinx.serialization.builtins.nullable +import kotlinx.serialization.builtins.serializer + +class ReadPublishingKeysRepoKtorClient ( + private val baseUrl: String, + private val client: HttpClient = HttpClient() +) : ReadPublishingKeysRepo { + override suspend fun getPostIdByTriggerControlKey(key: TriggerControlKey): PostId? = client.uniget( + "$baseUrl/$getPostIdByTriggerControlKeyRoute/$key", + PostId.serializer().nullable + ) + + override suspend fun getTriggerControlKeyByPostId(postId: PostId): TriggerControlKey? = client.uniget( + "$baseUrl/$getTriggerControlKeyByPostIdRoute/$postId", + TriggerControlKey.serializer().nullable + ) +} \ No newline at end of file diff --git a/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/WritePublishingKeysRepoKtorClient.kt b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/WritePublishingKeysRepoKtorClient.kt new file mode 100644 index 00000000..16a9be59 --- /dev/null +++ b/publishing/ktor/client/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/client/WritePublishingKeysRepoKtorClient.kt @@ -0,0 +1,29 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.client + +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.publishing.TriggerControlKey +import com.insanusmokrassar.postssystem.core.publishing.repos.WritePublishingKeysRepo +import com.insanusmokrassar.postssystem.ktor.client.BodyPair +import com.insanusmokrassar.postssystem.ktor.client.unipost +import com.insanusmokrassar.postssystem.publishing.ktor.SetPostTriggerControlKeyObject +import com.insanusmokrassar.postssystem.publishing.ktor.setPostTriggerControlKeyRoute +import com.insanusmokrassar.postssystem.publishing.ktor.unsetPostTriggerControlKeyRoute +import io.ktor.client.HttpClient +import kotlinx.serialization.builtins.serializer + +class WritePublishingKeysRepoKtorClient ( + private val baseUrl: String, + private val client: HttpClient = HttpClient() +) : WritePublishingKeysRepo { + override suspend fun setPostTriggerControlKey(postId: PostId, key: TriggerControlKey): Boolean = client.unipost( + "$baseUrl/$setPostTriggerControlKeyRoute", + BodyPair(SetPostTriggerControlKeyObject.serializer(), SetPostTriggerControlKeyObject(postId, key)), + Boolean.serializer() + ) + + override suspend fun unsetPostTriggerControlKey(postId: PostId): Boolean = client.unipost( + "$baseUrl/$unsetPostTriggerControlKeyRoute", + BodyPair(PostId.serializer(), postId), + Boolean.serializer() + ) +} \ No newline at end of file diff --git a/publishing/ktor/common/build.gradle b/publishing/ktor/common/build.gradle new file mode 100644 index 00000000..cbd356ff --- /dev/null +++ b/publishing/ktor/common/build.gradle @@ -0,0 +1,76 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$gradle_bintray_plugin_version" + } +} + +plugins { + id "org.jetbrains.kotlin.multiplatform" version "$kotlin_version" + id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" +} + +project.version = "$core_version" +project.group = "com.insanusmokrassar" + +repositories { + mavenLocal() + jcenter() + mavenCentral() + maven { url "https://kotlin.bintray.com/kotlinx" } +} + +kotlin { + jvm() + js() + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib') + + if ((project.hasProperty('RELEASE_MODE') && project.property('RELEASE_MODE') == "true") || System.getenv('RELEASE_MODE') == "true") { + api "com.insanusmokrassar:postssystem.ktor.common:$core_version" + api "com.insanusmokrassar:postssystem.publishing.api:$core_version" + } else { + api projectByName("postssystem.ktor.common") + api projectByName("postssystem.publishing.api") + } + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + jvmMain { + dependencies { + implementation kotlin('stdlib-jdk8') + } + } + jvmTest { + dependencies { + implementation kotlin('test-junit') + } + } + jsMain { + dependencies { + implementation kotlin('stdlib-js') + } + } + jsTest { + dependencies { + implementation kotlin('test-js') + implementation kotlin('test-junit') + } + } + } +} diff --git a/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingKeysRoutes.kt b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingKeysRoutes.kt new file mode 100644 index 00000000..91c89a2b --- /dev/null +++ b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingKeysRoutes.kt @@ -0,0 +1,9 @@ +package com.insanusmokrassar.postssystem.publishing.ktor + +const val publishingKeysRootRoute = "publishingKeys" + +const val getPostIdByTriggerControlKeyRoute = "getPostIdByTriggerControlKey" +const val getTriggerControlKeyByPostIdRoute = "getTriggerControlKeyByPostId" + +const val setPostTriggerControlKeyRoute = "setPostTriggerControlKey" +const val unsetPostTriggerControlKeyRoute = "unsetPostTriggerControlKey" \ No newline at end of file diff --git a/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingRegistrarRoutes.kt b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingRegistrarRoutes.kt new file mode 100644 index 00000000..08e0a560 --- /dev/null +++ b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingRegistrarRoutes.kt @@ -0,0 +1,4 @@ +package com.insanusmokrassar.postssystem.publishing.ktor + +//const val getPostIdByTriggerControlKeyRoute = "getPostIdByTriggerControlKey" +const val registerTriggerForPostRoute = "registerTriggerForPost" diff --git a/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingTriggerRoutes.kt b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingTriggerRoutes.kt new file mode 100644 index 00000000..1b010fae --- /dev/null +++ b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/PublishingTriggerRoutes.kt @@ -0,0 +1,3 @@ +package com.insanusmokrassar.postssystem.publishing.ktor + +const val triggerPostingRoute = "triggerPosting" \ No newline at end of file diff --git a/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/Serializers.kt b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/Serializers.kt new file mode 100644 index 00000000..1c6b1f13 --- /dev/null +++ b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/Serializers.kt @@ -0,0 +1,6 @@ +package com.insanusmokrassar.postssystem.publishing.ktor + +import com.insanusmokrassar.postssystem.ktor.setIdsSerializer + +val postsIdSerializer = setIdsSerializer +val triggerControlKeysSerializer = setIdsSerializer diff --git a/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/SetPostTriggerControlKeyObject.kt b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/SetPostTriggerControlKeyObject.kt new file mode 100644 index 00000000..edcb0c36 --- /dev/null +++ b/publishing/ktor/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/SetPostTriggerControlKeyObject.kt @@ -0,0 +1,11 @@ +package com.insanusmokrassar.postssystem.publishing.ktor + +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.publishing.TriggerControlKey +import kotlinx.serialization.Serializable + +@Serializable +data class SetPostTriggerControlKeyObject ( + val postId: PostId, + val key: TriggerControlKey +) \ No newline at end of file diff --git a/publishing/ktor/server/build.gradle b/publishing/ktor/server/build.gradle new file mode 100644 index 00000000..91458d7c --- /dev/null +++ b/publishing/ktor/server/build.gradle @@ -0,0 +1,41 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$gradle_bintray_plugin_version" + } +} + +plugins { + id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" +} + +project.version = "$core_version" +project.group = "com.insanusmokrassar" + +apply plugin: "java-library" +apply plugin: "kotlin" + +repositories { + mavenLocal() + jcenter() + mavenCentral() + maven { url "https://kotlin.bintray.com/kotlinx" } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + api projectByName("postssystem.publishing.ktor.common") + api projectByName("postssystem.ktor.server") + + testImplementation "org.xerial:sqlite-jdbc:$test_sqlite_version" + testImplementation "org.jetbrains.kotlin:kotlin-test" + testImplementation "org.jetbrains.kotlin:kotlin-test-junit" +} diff --git a/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/PublishingKeysRepoRoutingConfigurator.kt b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/PublishingKeysRepoRoutingConfigurator.kt new file mode 100644 index 00000000..8f5918a7 --- /dev/null +++ b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/PublishingKeysRepoRoutingConfigurator.kt @@ -0,0 +1,24 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.server + +import com.insanusmokrassar.postssystem.core.publishing.repos.PublishingKeysRepo +import com.insanusmokrassar.postssystem.ktor.server.configurators.ApplicationRoutingConfigurator +import com.insanusmokrassar.postssystem.publishing.ktor.publishingKeysRootRoute +import io.ktor.routing.Route +import io.ktor.routing.route + +fun Route.configurePublishingKeysRepoRoutes ( + proxyTo: PublishingKeysRepo +) { + route(publishingKeysRootRoute) { + configureReadPublishingKeysRepoRoutes(proxyTo) + configureWritePublishingKeysRepoRoutes(proxyTo) + } +} + +class PublishingKeysRepoRoutingConfigurator ( + private val proxyTo: PublishingKeysRepo +) : ApplicationRoutingConfigurator.Element { + override fun Route.invoke() { + configurePublishingKeysRepoRoutes(proxyTo) + } +} \ No newline at end of file diff --git a/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/ReadPublishingKeysRepoRoutingConfigurator.kt b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/ReadPublishingKeysRepoRoutingConfigurator.kt new file mode 100644 index 00000000..5cc8e48b --- /dev/null +++ b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/ReadPublishingKeysRepoRoutingConfigurator.kt @@ -0,0 +1,45 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.server + +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.publishing.TriggerControlKey +import com.insanusmokrassar.postssystem.core.publishing.repos.ReadPublishingKeysRepo +import com.insanusmokrassar.postssystem.ktor.server.configurators.ApplicationRoutingConfigurator +import com.insanusmokrassar.postssystem.ktor.server.getParameterOrSendError +import com.insanusmokrassar.postssystem.ktor.server.unianswer +import com.insanusmokrassar.postssystem.publishing.ktor.getPostIdByTriggerControlKeyRoute +import com.insanusmokrassar.postssystem.publishing.ktor.getTriggerControlKeyByPostIdRoute +import io.ktor.application.call +import io.ktor.routing.Route +import io.ktor.routing.get +import kotlinx.serialization.builtins.nullable +import kotlinx.serialization.builtins.serializer + +fun Route.configureReadPublishingKeysRepoRoutes ( + proxyTo: ReadPublishingKeysRepo +) { + get("$getPostIdByTriggerControlKeyRoute/{key}") { + val key: TriggerControlKey = call.getParameterOrSendError("key") ?: return@get + + call.unianswer( + PostId.serializer().nullable, + proxyTo.getPostIdByTriggerControlKey(key) + ) + } + + get("$getTriggerControlKeyByPostIdRoute/{postId}") { + val postId: PostId = call.getParameterOrSendError("postId") ?: return@get + + call.unianswer( + TriggerControlKey.serializer().nullable, + proxyTo.getTriggerControlKeyByPostId(postId) + ) + } +} + +class ReadPublishingKeysRepoRoutingConfigurator ( + private val proxyTo: ReadPublishingKeysRepo +) : ApplicationRoutingConfigurator.Element { + override fun Route.invoke() { + configureReadPublishingKeysRepoRoutes(proxyTo) + } +} \ No newline at end of file diff --git a/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/WritePublishingKeysRepoRoutingConfigurator.kt b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/WritePublishingKeysRepoRoutingConfigurator.kt new file mode 100644 index 00000000..aedca55c --- /dev/null +++ b/publishing/ktor/server/src/main/kotlin/com/insanusmokrassar/postssystem/publishing/ktor/server/WritePublishingKeysRepoRoutingConfigurator.kt @@ -0,0 +1,39 @@ +package com.insanusmokrassar.postssystem.publishing.ktor.server + +import com.insanusmokrassar.postssystem.core.post.PostId +import com.insanusmokrassar.postssystem.core.publishing.repos.WritePublishingKeysRepo +import com.insanusmokrassar.postssystem.ktor.server.unianswer +import com.insanusmokrassar.postssystem.ktor.server.uniload +import com.insanusmokrassar.postssystem.publishing.ktor.SetPostTriggerControlKeyObject +import com.insanusmokrassar.postssystem.publishing.ktor.setPostTriggerControlKeyRoute +import com.insanusmokrassar.postssystem.publishing.ktor.unsetPostTriggerControlKeyRoute +import io.ktor.application.call +import io.ktor.routing.Route +import io.ktor.routing.post +import kotlinx.serialization.builtins.serializer + +fun Route.configureWritePublishingKeysRepoRoutes ( + proxyTo: WritePublishingKeysRepo +) { + post(setPostTriggerControlKeyRoute) { + val obj = call.uniload(SetPostTriggerControlKeyObject.serializer()) + + call.unianswer( + Boolean.serializer(), + proxyTo.setPostTriggerControlKey(obj.postId, obj.key) + ) + } + + post(unsetPostTriggerControlKeyRoute) { + val postId = call.uniload(PostId.serializer()) + + call.unianswer( + Boolean.serializer(), + proxyTo.unsetPostTriggerControlKey(postId) + ) + } +} + +class WritePublishingKeysRepoRoutingConfigurator ( + private val proxyTo: WritePublishingKeysRepo +) \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 388cb805..babfd742 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,6 +22,9 @@ String[] includes = [ ':publishing:api', ':publishing:exposed', + ':publishing:ktor:common', + ':publishing:ktor:client', + ':publishing:ktor:server', ':markups:commons', ':markups:html'