FlashSaleAdmissionProperties.java

package com.ecommerce.marketing.infrastructure.flashsale;

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

import java.time.Duration;

@Validated
@ConfigurationProperties("ecommerce.marketing.flash-sale")
public record FlashSaleAdmissionProperties(
        @NotBlank @Pattern(regexp = "[a-z0-9-]{1,24}") String namespace,
        boolean redisEnabled,
        @NotNull Duration resultRetention,
        @NotNull Duration processingTimeout,
        @Min(100) long timeoutScanDelay,
        @Min(1) @Max(500) int timeoutScanBatchSize,
        @Min(100) long pendingRecoveryDelay,
        @Min(1) @Max(500) int pendingRecoveryBatchSize
) {
    public FlashSaleAdmissionProperties {
        processingTimeout = processingTimeout == null ? Duration.ofMinutes(2) : processingTimeout;
        timeoutScanDelay = timeoutScanDelay <= 0 ? 5000 : timeoutScanDelay;
        timeoutScanBatchSize = timeoutScanBatchSize <= 0 ? 100 : timeoutScanBatchSize;
        pendingRecoveryDelay = pendingRecoveryDelay <= 0 ? 1000 : pendingRecoveryDelay;
        pendingRecoveryBatchSize = pendingRecoveryBatchSize <= 0 ? 100 : pendingRecoveryBatchSize;
        if (processingTimeout.isNegative()
                || processingTimeout.isZero()
                || processingTimeout.compareTo(Duration.ofHours(1)) > 0) {
            throw new IllegalArgumentException("processingTimeout must be greater than zero and at most 1 hour");
        }
    }
}