ApiResponseDto.java
package cl.prgm.portaltrip.infrastructure.web.dto;
import java.time.Instant;
import org.springframework.http.HttpStatus;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "Unified response envelope returned by every API endpoint")
public record ApiResponseDto<T>(
@Schema(description = "HTTP status code", example = "200", requiredMode = Schema.RequiredMode.REQUIRED)
int status,
@Schema(description = "Human-readable result", example = "Quote calculated successfully", requiredMode = Schema.RequiredMode.REQUIRED)
String message,
@Schema(description = "Response payload; omitted when an error has no structured details")
T data,
@Schema(description = "UTC response timestamp", example = "2026-08-31T22:30:00Z", requiredMode = Schema.RequiredMode.REQUIRED)
Instant timestamp) {
public static <T> ApiResponseDto<T> success(HttpStatus status, String message, T data) {
return new ApiResponseDto<>(status.value(), message, data, Instant.now());
}
public static ApiResponseDto<Void> error(HttpStatus status, String message) {
return new ApiResponseDto<>(status.value(), message, null, Instant.now());
}
public static <T> ApiResponseDto<T> error(HttpStatus status, String message, T data) {
return new ApiResponseDto<>(status.value(), message, data, Instant.now());
}
}