RemoteDependencyFailure.java

package com.ecommerce.payment.infrastructure.resilience;

import org.springframework.http.HttpStatusCode;

public final class RemoteDependencyFailure extends RuntimeException {

    private final boolean retryable;
    private final boolean recordable;

    private RemoteDependencyFailure(String message, boolean retryable, boolean recordable, Throwable cause) {
        super(message, cause);
        this.retryable = retryable;
        this.recordable = recordable;
    }

    public static RemoteDependencyFailure forHttpStatus(HttpStatusCode status, Throwable cause) {
        boolean serverFailure = status.is5xxServerError();
        return new RemoteDependencyFailure(
                "Remote dependency returned HTTP " + status.value(),
                serverFailure,
                serverFailure,
                cause);
    }

    public static RemoteDependencyFailure transientFailure(Throwable cause) {
        return new RemoteDependencyFailure("Remote dependency transport failed", true, true, cause);
    }

    public static RemoteDependencyFailure invalidResponse() {
        return new RemoteDependencyFailure("Remote dependency returned an invalid response", false, true, null);
    }

    public static RemoteDependencyFailure invalidResponse(Throwable cause) {
        return new RemoteDependencyFailure("Remote dependency returned an invalid response", false, true, cause);
    }

    public boolean retryable() {
        return retryable;
    }

    public boolean recordable() {
        return recordable;
    }
}