FlashSaleAdmissionStore.java

package com.ecommerce.marketing.application.port;

import java.time.Duration;
import java.time.Instant;
import java.util.Optional;

public interface FlashSaleAdmissionStore {

    void preheat(Activity activity, Instant now);

    Decision admit(
            String activityNo,
            Long userId,
            String requestKey,
            String candidateToken,
            Instant now);

    Optional<Snapshot> find(String requestToken);

    record Activity(
            String activityNo,
            int admissionLimit,
            int admittedCount,
            Instant startsAt,
            Instant endsAt,
            Duration resultRetention
    ) {
    }

    record Decision(
            Outcome outcome,
            String requestToken,
            int remainingAdmissions,
            Instant acceptedAt
    ) {
    }

    record Snapshot(
            String requestToken,
            String activityNo,
            Long userId,
            String status,
            int remainingAdmissions,
            Instant acceptedAt
    ) {
    }

    enum Outcome {
        ACCEPTED,
        REPLAYED,
        NOT_READY,
        NOT_ACTIVE,
        NOT_STARTED,
        ENDED,
        SOLD_OUT
    }
}