ReviewDtos.java

package com.rbctcsworld.ecommerce.review;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public final class ReviewDtos {

    private ReviewDtos() {
    }

    public record CreateReviewRequest(
            @NotNull Long productId,
            @NotNull @Min(1) @Max(5) Integer rating,
            @Size(max = 100) String title,
            @Size(max = 2000) String body) {
    }

    public record UpdateReviewRequest(
            @NotNull @Min(1) @Max(5) Integer rating,
            @Size(max = 100) String title,
            @Size(max = 2000) String body) {
    }

    /** reviewer is masked ("ja***"): a public endpoint must never expose customer e-mail addresses. */
    public record ReviewResponse(Long id, Long productId, int rating, String title, String body, String reviewer,
                                 boolean verifiedPurchase, String status, LocalDateTime createdAt, LocalDateTime updatedAt) {
    }

    /** distribution: number of reviews for every star value 5..1 (always all five keys). */
    public record ProductReviews(Long productId, BigDecimal averageRating, int reviewCount,
                                 Map<Integer, Long> distribution, List<ReviewResponse> reviews) {
    }

    public record RatingSummary(BigDecimal average, int count, Map<Integer, Long> distribution) {
    }
}