Skip to content

Commit b441736

Browse files
osoykananilcangulanilcan.gul
authored
add micronaut support 🚀 (#700)
* micronaut framework implemented. (#673) * micronaut framework implemented * hardcoded versions fixed, comment lines removed * Delete starters/micronaut-starter/stove-micronaut-testing-e2e directory Signed-off-by: Anılcan <[email protected]> * Delete examples/micronaut-example/.gitignore Signed-off-by: Anılcan <[email protected]> * Delete examples/micronaut-example/gradle/wrapper directory Signed-off-by: Anılcan <[email protected]> * fixed hardcoded lines * fixed test name, duplicated versions, variable name * removed packages configuration from main meth * revert gradle properties and binaryvalidator * fix micronaut bridge tests but it does not work yet --------- Signed-off-by: Anılcan <[email protected]> Signed-off-by: Oğuzhan Soykan <[email protected]> Co-authored-by: anilcan.gul <[email protected]> Co-authored-by: Oguzhan Soykan <[email protected]> * works * use different port for wiremock * add pre-commmit hook * bump version * kotest arrow * fix for api --------- Signed-off-by: Anılcan <[email protected]> Signed-off-by: Oğuzhan Soykan <[email protected]> Co-authored-by: Anılcan <[email protected]> Co-authored-by: anilcan.gul <[email protected]>
1 parent efbbc7e commit b441736

File tree

34 files changed

+1156
-19
lines changed

34 files changed

+1156
-19
lines changed

build.gradle.kts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import org.gradle.kotlin.dsl.libs
21
import org.gradle.plugins.ide.idea.model.IdeaModel
32
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
43

@@ -13,6 +12,7 @@ plugins {
1312
idea
1413
java
1514
}
15+
1616
group = "com.trendyol"
1717
version = CI.version(project)
1818

@@ -36,14 +36,14 @@ kover {
3636
}
3737
}
3838
}
39-
val related = subprojects.of("lib", "spring", "examples", "ktor")
39+
val related = subprojects.of("lib", "spring", "examples", "ktor", "micronaut")
4040
dependencies {
4141
related.forEach {
4242
kover(it)
4343
}
4444
}
4545

46-
subprojects.of("lib", "spring", "examples", "ktor") {
46+
subprojects.of("lib", "spring", "examples", "ktor", "micronaut") {
4747
apply {
4848
plugin("kotlin")
4949
plugin(rootProject.libs.plugins.spotless.get().pluginId)
@@ -69,13 +69,12 @@ subprojects.of("lib", "spring", "examples", "ktor") {
6969
testImplementation(libs.kotest.runner.junit5)
7070
testImplementation(libs.kotest.framework.api)
7171
testImplementation(libs.kotest.property)
72-
testImplementation(libs.kotest.arrow)
7372
detektPlugins(libs.detekt.formatting)
7473
}
7574

7675
spotless {
7776
kotlin {
78-
ktlint(libs.versions.ktlint.get()).setEditorConfigPath(rootProject.layout.projectDirectory.file(".editorconfig"))
77+
ktlint().setEditorConfigPath(rootProject.layout.projectDirectory.file(".editorconfig"))
7978
targetExclude("build/", "generated/", "out/")
8079
targetExcludeIfContentContains("generated")
8180
targetExcludeIfContentContainsRegex("generated.*")
@@ -134,10 +133,11 @@ val publishedProjects = listOf(
134133
"stove-testing-e2e-redis",
135134
"stove-ktor-testing-e2e",
136135
"stove-spring-testing-e2e",
137-
"stove-spring-testing-e2e-kafka"
136+
"stove-spring-testing-e2e-kafka",
137+
"stove-micronaut-testing-e2e"
138138
)
139139

140-
subprojects.of("lib", "spring", "ktor", filter = { p -> publishedProjects.contains(p.name) }) {
140+
subprojects.of("lib", "spring", "ktor", "micronaut", filter = { p -> publishedProjects.contains(p.name) }) {
141141
apply {
142142
plugin("java")
143143
plugin("stove-publishing")
@@ -148,4 +148,3 @@ subprojects.of("lib", "spring", "ktor", filter = { p -> publishedProjects.contai
148148
withJavadocJar()
149149
}
150150
}
151-

examples/micronaut-example/api/micronaut-example.api

Lines changed: 311 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
plugins {
2+
kotlin("jvm") version libs.versions.kotlin
3+
id("org.jetbrains.kotlin.plugin.allopen") version libs.versions.kotlin
4+
kotlin("plugin.serialization") version libs.versions.kotlin
5+
alias(libs.plugins.google.ksp)
6+
alias(libs.plugins.shadowJar)
7+
alias(libs.plugins.micronaut.application)
8+
alias(libs.plugins.micronaut.aot)
9+
application
10+
idea
11+
}
12+
13+
dependencies {
14+
runtimeOnly(libs.snakeyaml)
15+
implementation(platform(libs.micronaut.parent))
16+
implementation(libs.micronaut.kotlin.runtime)
17+
implementation(libs.micronaut.serde.jackson)
18+
implementation(libs.micronaut.http.client)
19+
implementation(libs.micronaut.http.server.netty)
20+
implementation(libs.micronaut.inject)
21+
implementation(libs.micronaut.core)
22+
implementation(libs.micronaut.micrometer.core)
23+
implementation(libs.jackson.kotlin)
24+
implementation(libs.couchbase.client.metrics)
25+
implementation(libs.kafka)
26+
implementation(libs.kotlinx.reactor)
27+
implementation(libs.kotlinx.core)
28+
implementation(libs.kotlinx.reactive)
29+
implementation(libs.couchbase.client)
30+
implementation(libs.couchbase.client.metrics)
31+
implementation(libs.jackson.kotlin)
32+
implementation(libs.kotlinx.slf4j)
33+
}
34+
35+
dependencies {
36+
testImplementation(libs.kotest.property)
37+
testImplementation(libs.kotest.runner.junit5)
38+
testImplementation(projects.stove.lib.stoveTestingE2eHttp)
39+
testImplementation(projects.stove.lib.stoveTestingE2eWiremock)
40+
testImplementation(projects.stove.lib.stoveTestingE2eCouchbase)
41+
testImplementation(projects.stove.lib.stoveTestingE2eElasticsearch)
42+
testImplementation(projects.stove.starters.micronaut.stoveMicronautTestingE2e)
43+
}
44+
45+
application {
46+
mainClass = "stove.micronaut.example.ApplicationKt"
47+
}
48+
49+
graalvmNative.toolchainDetection = false
50+
51+
java {
52+
sourceCompatibility = JavaVersion.toVersion("17")
53+
}
54+
55+
micronaut {
56+
version(libs.versions.micronaut.starter.get())
57+
runtime("netty")
58+
testRuntime("kotest5")
59+
processing {
60+
incremental(true)
61+
annotations("stove.micronaut.example.*")
62+
}
63+
aot {
64+
optimizeServiceLoading = false
65+
convertYamlToJava = false
66+
precomputeOperations = true
67+
cacheEnvironment = true
68+
optimizeClassLoading = true
69+
deduceEnvironment = true
70+
optimizeNetty = true
71+
replaceLogbackXml = true
72+
}
73+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package stove.micronaut.example
2+
3+
import io.micronaut.context.ApplicationContext
4+
import io.micronaut.runtime.EmbeddedApplication
5+
6+
fun main(args: Array<String>) {
7+
run(args)
8+
}
9+
10+
fun run(
11+
args: Array<String>,
12+
init: ApplicationContext.() -> Unit = {}
13+
): ApplicationContext {
14+
val context = ApplicationContext
15+
.builder()
16+
.args(*args)
17+
.build()
18+
.also(init)
19+
.start()
20+
21+
context.findBean(EmbeddedApplication::class.java).ifPresent { app ->
22+
if (!app.isRunning) {
23+
app.start()
24+
}
25+
}
26+
27+
return context
28+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package stove.micronaut.example.application.domain
2+
3+
import io.micronaut.serde.annotation.Serdeable
4+
import java.util.*
5+
6+
@Serdeable
7+
data class Product(
8+
val id: String,
9+
val name: String,
10+
val supplierId: Long,
11+
val isBlacklist: Boolean,
12+
val createdDate: Date
13+
) {
14+
companion object {
15+
fun new(id: String, name: String, supplierId: Long, isBlacklist: Boolean): Product = Product(
16+
id = id,
17+
name = name,
18+
supplierId = supplierId,
19+
createdDate = Date(),
20+
isBlacklist = isBlacklist
21+
)
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package stove.micronaut.example.application.repository
2+
3+
import stove.micronaut.example.application.domain.Product
4+
5+
interface ProductRepository {
6+
suspend fun save(product: Product): Product
7+
8+
suspend fun findById(id: Long): Product?
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package stove.micronaut.example.application.services
2+
3+
import jakarta.inject.Singleton
4+
import stove.micronaut.example.application.domain.Product
5+
import stove.micronaut.example.application.repository.ProductRepository
6+
import stove.micronaut.example.infrastructure.http.SupplierHttpService
7+
8+
@Singleton
9+
class ProductService(
10+
private val productRepository: ProductRepository,
11+
private val supplierHttpService: SupplierHttpService
12+
) {
13+
suspend fun createProduct(id: String, productName: String, supplierId: Long): Product {
14+
val supplier = supplierHttpService.getSupplierPermission(supplierId)
15+
val product = Product.new(id, productName, supplierId, supplier!!.isBlacklisted)
16+
productRepository.save(product)
17+
return product
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package stove.micronaut.example.application.services
2+
3+
import io.micronaut.serde.annotation.Serdeable
4+
5+
@Serdeable
6+
data class SupplierPermission(
7+
val id: Long,
8+
val isBlacklisted: Boolean
9+
)
10+
11+
interface SupplierService {
12+
suspend fun getSupplierPermission(supplierId: Long): SupplierPermission?
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package stove.micronaut.example.infrastructure.api
2+
3+
import io.micronaut.http.annotation.*
4+
import stove.micronaut.example.application.domain.Product
5+
import stove.micronaut.example.application.services.ProductService
6+
import stove.micronaut.example.infrastructure.api.model.request.CreateProductRequest
7+
8+
@Controller("/products")
9+
class ProductController(
10+
private val productService: ProductService
11+
) {
12+
@Get("/index")
13+
fun get(
14+
@QueryValue keyword: String = "default"
15+
): String = "Hi from Stove framework with $keyword"
16+
17+
@Post("/create")
18+
suspend fun createProduct(
19+
@Body request: CreateProductRequest
20+
): Product = productService.createProduct(
21+
id = request.id,
22+
productName = request.name,
23+
supplierId = request.supplierId
24+
)
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package stove.micronaut.example.infrastructure.api.model.request
2+
3+
import io.micronaut.serde.annotation.Serdeable
4+
5+
@Serdeable
6+
data class CreateProductRequest(
7+
val id: String,
8+
val name: String,
9+
val supplierId: Long
10+
)

0 commit comments

Comments
 (0)