AdminShipmentGeoController.java

package com.ecommerce.fulfillment.interfaces.rest;

import com.ecommerce.fulfillment.application.model.FulfillmentModels.GeoCacheRebuildView;
import com.ecommerce.fulfillment.application.model.FulfillmentModels.NearbyShipmentPositionView;
import com.ecommerce.fulfillment.application.service.ShipmentGeoService;
import com.ecommerce.platform.common.api.ApiResponse;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;

@Validated
@RestController
@RequestMapping("/api/v1/fulfillment/admin/geo")
public class AdminShipmentGeoController {

    private final ShipmentGeoService shipmentGeoService;

    public AdminShipmentGeoController(ShipmentGeoService shipmentGeoService) {
        this.shipmentGeoService = shipmentGeoService;
    }

    @GetMapping("/nearby")
    public ApiResponse<List<NearbyShipmentPositionView>> nearby(
            @RequestParam @DecimalMin("-180") @DecimalMax("180") BigDecimal longitude,
            @RequestParam @DecimalMin("-90") @DecimalMax("90") BigDecimal latitude,
            @RequestParam(defaultValue = "50000") @Min(1) @Max(5_000_000) long radiusMeters,
            @RequestParam(defaultValue = "50") @Min(1) @Max(500) int limit) {
        return ApiResponse.success(
                shipmentGeoService.nearby(longitude, latitude, radiusMeters, limit));
    }

    @PostMapping("/cache/rebuild")
    public ApiResponse<GeoCacheRebuildView> rebuildCache(
            @RequestParam(defaultValue = "5000") @Min(1) @Max(100_000) int limit) {
        return ApiResponse.success(shipmentGeoService.rebuildCache(limit));
    }
}