ChatInfrastructureConfig.java

package com.ecommerce.chat.infrastructure.config;

import com.ecommerce.chat.infrastructure.messaging.ChatOutboxProperties;
import com.ecommerce.chat.infrastructure.messaging.ChatConsumerFailureRetryProperties;
import com.ecommerce.chat.infrastructure.persistence.mapper.ConsumerFailureMapper;
import com.ecommerce.chat.infrastructure.realtime.ChatRealtimeProperties;
import com.ecommerce.chat.infrastructure.realtime.ChatWebSocketTicketProperties;
import com.ecommerce.chat.infrastructure.storage.ChatAttachmentStorageProperties;
import com.ecommerce.chat.infrastructure.storage.ChatAttachmentScanProperties;
import com.ecommerce.platform.common.observability.ConsumerFailureObservability;
import io.minio.MinioClient;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.security.SecureRandom;
import java.time.Clock;

@Configuration
@EnableConfigurationProperties({
        ChatConsumerFailureRetryProperties.class,
        ChatOutboxProperties.class,
        ChatRealtimeProperties.class,
        ChatWebSocketTicketProperties.class,
        ChatAttachmentScanProperties.class,
        ChatAttachmentStorageProperties.class
})
public class ChatInfrastructureConfig {

    @Bean
    public ConsumerFailureObservability chatConsumerFailureObservability(
            MeterRegistry meterRegistry,
            ConsumerFailureMapper mapper,
            Clock chatClock) {
        return new ConsumerFailureObservability(
                meterRegistry,
                "chat-service",
                mapper,
                chatClock);
    }

    @Bean
    public MinioClient chatMinioClient(ChatAttachmentStorageProperties properties) {
        return MinioClient.builder()
                .endpoint(properties.endpoint())
                .credentials(properties.username(), properties.password())
                .build();
    }

    @Bean
    public SecureRandom chatWebSocketTicketSecureRandom() {
        return new SecureRandom();
    }
}