ShipmentGeoProperties.java

package com.ecommerce.fulfillment.infrastructure.geo;

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

@Validated
@ConfigurationProperties("ecommerce.fulfillment.geo")
public record ShipmentGeoProperties(
        boolean cacheEnabled,
        boolean mysqlSpatialEnabled,
        @NotBlank @Pattern(regexp = "[A-Za-z0-9_-]+") String namespace,
        @Min(1_000) @Max(5_000_000) long maxRadiusMeters,
        @Min(1) @Max(500) int maxResults,
        @Min(1) @Max(100_000) int rebuildLimit
) {

    public ShipmentGeoProperties {
        namespace = namespace == null || namespace.isBlank() ? "local" : namespace;
        maxRadiusMeters = maxRadiusMeters <= 0 ? 2_000_000 : maxRadiusMeters;
        maxResults = maxResults <= 0 ? 200 : maxResults;
        rebuildLimit = rebuildLimit <= 0 ? 5_000 : rebuildLimit;
    }

    public String redisGeoKey() {
        return "ecommerce:" + namespace + ":fulfillment:geo:latest";
    }

    public String redisMetadataKey(String fulfillmentNo) {
        return "ecommerce:" + namespace + ":fulfillment:geo:position:" + fulfillmentNo;
    }
}