diff --git a/src/main/kotlin/com/example/demo/config/AppConfig.kt b/src/main/kotlin/com/example/demo/config/AppConfig.kt index b59f6a1..82ecb6d 100644 --- a/src/main/kotlin/com/example/demo/config/AppConfig.kt +++ b/src/main/kotlin/com/example/demo/config/AppConfig.kt @@ -1,5 +1,7 @@ package com.example.demo.config +import com.example.demo.config.properties.KafkaProperties +import com.example.demo.config.properties.ValidationProperties import com.example.demo.providers.CityRepository import com.example.demo.providers.MockedShopProvider import com.example.demo.providers.ProductRepository @@ -24,7 +26,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -@EnableConfigurationProperties(KafkaProperties::class) +@EnableConfigurationProperties(KafkaProperties::class, ValidationProperties::class) class AppConfig( @Autowired private val kafkaProperties: KafkaProperties, ) { @@ -54,7 +56,9 @@ class AppConfig( fun cityService(@Autowired cityRepository: CityRepository): CityService = CityServiceImpl(cityRepository) @Bean - fun schemaValidator(): SchemaValidator = SchemaValidatorImp(kafkaProperties.validation.schema) + fun schemaValidator( + @Autowired validationProperties: ValidationProperties, + ): SchemaValidator = SchemaValidatorImp(validationProperties.schema) @Bean fun otlpHttpSpanExporter(@Value("\${tracing.url}") url: String): OtlpHttpSpanExporter { diff --git a/src/main/kotlin/com/example/demo/config/KafkaConsumerConfig.kt b/src/main/kotlin/com/example/demo/config/KafkaConsumerConfig.kt index 10adee4..655d3d8 100644 --- a/src/main/kotlin/com/example/demo/config/KafkaConsumerConfig.kt +++ b/src/main/kotlin/com/example/demo/config/KafkaConsumerConfig.kt @@ -1,5 +1,6 @@ package com.example.demo.config +import com.example.demo.config.properties.KafkaProperties import com.example.demo.services.database.city.CityService import com.example.demo.services.kafka.Consumer import io.micrometer.core.instrument.MeterRegistry diff --git a/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt b/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt index 59a2f31..d7b066e 100644 --- a/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt +++ b/src/main/kotlin/com/example/demo/config/KafkaProducerConfig.kt @@ -1,5 +1,6 @@ package com.example.demo.config +import com.example.demo.config.properties.KafkaProperties import com.example.demo.services.kafka.Producer import com.example.demo.services.kafka.ProducerImpl import com.example.demo.services.validation.SchemaValidator diff --git a/src/main/kotlin/com/example/demo/config/KafkaProperties.kt b/src/main/kotlin/com/example/demo/config/properties/KafkaProperties.kt similarity index 82% rename from src/main/kotlin/com/example/demo/config/KafkaProperties.kt rename to src/main/kotlin/com/example/demo/config/properties/KafkaProperties.kt index a92abde..248d453 100644 --- a/src/main/kotlin/com/example/demo/config/KafkaProperties.kt +++ b/src/main/kotlin/com/example/demo/config/properties/KafkaProperties.kt @@ -1,4 +1,4 @@ -package com.example.demo.config +package com.example.demo.config.properties import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.bind.ConstructorBinding @@ -8,7 +8,6 @@ data class KafkaProperties @ConstructorBinding constructor( val bootstrapServers: String, val producer: Producer, val consumer: Consumer, - val validation: Validation, ) { data class Producer( val product: Product, @@ -24,8 +23,4 @@ data class KafkaProperties @ConstructorBinding constructor( val autoStartup: Boolean, val autoOffsetReset: String, ) - - data class Validation( - val schema: Map - ) } \ No newline at end of file diff --git a/src/main/kotlin/com/example/demo/config/properties/ValidationProperties.kt b/src/main/kotlin/com/example/demo/config/properties/ValidationProperties.kt new file mode 100644 index 0000000..a8b58e9 --- /dev/null +++ b/src/main/kotlin/com/example/demo/config/properties/ValidationProperties.kt @@ -0,0 +1,8 @@ +package com.example.demo.config.properties + +import org.springframework.boot.context.properties.ConfigurationProperties + +@ConfigurationProperties("validation") +data class ValidationProperties( + val schema: Map +) \ No newline at end of file diff --git a/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt b/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt index 8a9bbcb..c501cfb 100644 --- a/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt +++ b/src/main/kotlin/com/example/demo/services/kafka/ProducerImpl.kt @@ -3,6 +3,7 @@ package com.example.demo.services.kafka import com.example.demo.models.Product import com.example.demo.services.kafka.dto.ProductDto import com.example.demo.services.validation.SchemaValidator +import com.example.demo.services.validation.SchemaValidator.Companion.SCHEMA_KAFKA_PRODUCT_SYNC import kotlinx.serialization.json.Json import kotlinx.serialization.json.encodeToJsonElement import org.springframework.kafka.core.KafkaTemplate @@ -20,7 +21,7 @@ class ProducerImpl( val serializedProduct = Json.encodeToJsonElement(ProductDto(product)) - schemaValidator.validate("product-sync", serializedProduct) + schemaValidator.validate(SCHEMA_KAFKA_PRODUCT_SYNC, serializedProduct) val message: Message = MessageBuilder .withPayload(serializedProduct.toString()) diff --git a/src/main/kotlin/com/example/demo/services/validation/SchemaValidator.kt b/src/main/kotlin/com/example/demo/services/validation/SchemaValidator.kt index 21756e6..e99e2fc 100644 --- a/src/main/kotlin/com/example/demo/services/validation/SchemaValidator.kt +++ b/src/main/kotlin/com/example/demo/services/validation/SchemaValidator.kt @@ -7,4 +7,8 @@ import kotlinx.serialization.json.JsonElement interface SchemaValidator { @Throws(ElementNotValidException::class, SchemaNotFoundException::class) fun validate(schemaName: String, value: JsonElement) + + companion object { + const val SCHEMA_KAFKA_PRODUCT_SYNC = "kafka-product-sync" + } } \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9669f0f..8608157 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -31,9 +31,10 @@ kafka: topics: demo-city-sync auto-offset-reset: none auto-startup: true - validation: - schema: - product-sync: product/sync.json + +validation: + schema: + kafka-product-sync: kafka/product/sync.json springdoc: api-docs: diff --git a/src/main/resources/json-schemas/product/sync.json b/src/main/resources/json-schemas/kafka/product/sync.json similarity index 100% rename from src/main/resources/json-schemas/product/sync.json rename to src/main/resources/json-schemas/kafka/product/sync.json diff --git a/src/test/kotlin/com/example/demo/BaseUnitTest.kt b/src/test/kotlin/com/example/demo/BaseUnitTest.kt index a75f3bb..bb1451c 100644 --- a/src/test/kotlin/com/example/demo/BaseUnitTest.kt +++ b/src/test/kotlin/com/example/demo/BaseUnitTest.kt @@ -1,7 +1,9 @@ package com.example.demo -import com.example.demo.config.KafkaProperties +import com.example.demo.config.properties.KafkaProperties +import com.example.demo.config.properties.ValidationProperties import com.example.demo.services.kafka.Consumer +import com.example.demo.services.validation.SchemaValidator.Companion.SCHEMA_KAFKA_PRODUCT_SYNC import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.test.mock.mockito.MockBean import org.springframework.context.annotation.Bean @@ -26,9 +28,11 @@ open class BaseUnitTest { autoStartup = false, autoOffsetReset = "none", ), - validation = KafkaProperties.Validation( - schema = mapOf("product-sync" to "product/sync.json"), - ), + ) + + @Bean + fun validationProperties(): ValidationProperties = ValidationProperties( + schema = mapOf(SCHEMA_KAFKA_PRODUCT_SYNC to "kafka/product/sync.json"), ) } } \ No newline at end of file diff --git a/src/test/kotlin/com/example/demo/services/validation/SchemaValidatorImpTest.kt b/src/test/kotlin/com/example/demo/services/validation/SchemaValidatorImpTest.kt index d1c1b46..8410169 100644 --- a/src/test/kotlin/com/example/demo/services/validation/SchemaValidatorImpTest.kt +++ b/src/test/kotlin/com/example/demo/services/validation/SchemaValidatorImpTest.kt @@ -1,6 +1,7 @@ package com.example.demo.services.validation import com.example.demo.BaseUnitTest +import com.example.demo.services.validation.SchemaValidator.Companion.SCHEMA_KAFKA_PRODUCT_SYNC import com.example.demo.services.validation.exceptions.ElementNotValidException import com.example.demo.services.validation.exceptions.SchemaNotFoundException import kotlinx.serialization.json.Json @@ -41,7 +42,7 @@ class SchemaValidatorImpTest( @JvmStatic fun validateDataProvider() = listOf( Arguments.of( - "product-sync", + SCHEMA_KAFKA_PRODUCT_SYNC, """ { "id": 123, @@ -57,7 +58,7 @@ class SchemaValidatorImpTest( null, ), Arguments.of( // no id - "product-sync", + SCHEMA_KAFKA_PRODUCT_SYNC, """ { "guid": "3a27e322-b5b6-427f-b761-a02284c1cfa4", @@ -72,7 +73,7 @@ class SchemaValidatorImpTest( ElementNotValidException::class, ), Arguments.of( // wrong guid - "product-sync", + SCHEMA_KAFKA_PRODUCT_SYNC, """ { "id": 213,