AnalyticsEventConsumerProperties.java

package com.ecommerce.analytics.infrastructure.config;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

import java.time.Duration;

@Validated
@ConfigurationProperties("ecommerce.analytics.events")
public record AnalyticsEventConsumerProperties(
        boolean enabled,
        @NotBlank String endpoints,
        @NotBlank String consumerGroup,
        @NotBlank String tradeTopic,
        @NotBlank String paymentTopic,
        @Min(0) long initialDelay,
        @Min(100) long fixedDelay,
        @NotNull Duration awaitDuration,
        @NotNull Duration invisibleDuration,
        @Min(1) @Max(100) int batchSize) {

    public AnalyticsEventConsumerProperties {
        endpoints = defaultText(endpoints, "127.0.0.1:18082");
        consumerGroup = defaultText(consumerGroup, "ecommerce-analytics-domain-events");
        tradeTopic = defaultText(tradeTopic, "ecommerce-order-events");
        paymentTopic = defaultText(paymentTopic, "ecommerce-payment-events");
        fixedDelay = fixedDelay <= 0 ? 500 : fixedDelay;
        awaitDuration = awaitDuration == null ? Duration.ofSeconds(5) : awaitDuration;
        invisibleDuration = invisibleDuration == null ? Duration.ofSeconds(20) : invisibleDuration;
        batchSize = batchSize <= 0 ? 20 : batchSize;
    }

    private static String defaultText(String value, String fallback) {
        return value == null || value.isBlank() ? fallback : value;
    }
}