GatewayRateLimitProperties.java

package com.ecommerce.gateway.ratelimit;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
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.gateway.rate-limit")
public record GatewayRateLimitProperties(
        @NotBlank @Pattern(regexp = "[a-z0-9-]{1,24}") String namespace,
        boolean enabled,
        boolean redisEnabled,
        @NotNull Duration redisTimeout,
        @Min(100) long localMaximumSize,
        @Valid @NotNull Policy login,
        @Valid @NotNull Policy registration,
        @Valid @NotNull Policy refresh,
        @Valid @NotNull Policy flashSale
) {

    public record Policy(@Min(1) int limit, @NotNull Duration window) {
    }
}