ShipmentPositionRepository.java

package com.ecommerce.fulfillment.application.port;

import java.math.BigDecimal;
import java.time.Instant;
import java.util.List;
import java.util.Optional;

public interface ShipmentPositionRepository {

    Optional<Position> findByFulfillmentIdForUpdate(Long fulfillmentId);

    Optional<Position> findByFulfillmentId(Long fulfillmentId);

    void insert(Position position);

    void update(Position position);

    List<NearbyPosition> findNearby(
            BigDecimal longitude,
            BigDecimal latitude,
            long radiusMeters,
            int limit);

    List<Position> listLatest(int limit);

    record Position(
            Long fulfillmentId,
            String fulfillmentNo,
            Long traceId,
            String externalEventId,
            String nodeType,
            String locationName,
            BigDecimal longitude,
            BigDecimal latitude,
            Instant occurredAt,
            Instant updatedAt
    ) {
    }

    record NearbyPosition(
            Position position,
            String orderNo,
            Long userId,
            String status,
            BigDecimal distanceMeters
    ) {
    }
}