ReviewModels.java

package com.ecommerce.catalog.application.model;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

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

public final class ReviewModels {

    private ReviewModels() {
    }

    public record OrderCompletedEvent(
            String eventId,
            String orderNo,
            Long userId,
            Instant completedAt,
            List<OrderLineSnapshot> items) {

        public OrderCompletedEvent {
            items = List.copyOf(items);
        }
    }

    public record OrderLineSnapshot(
            int lineNo,
            Long productId,
            Long skuId,
            String productTitle,
            String skuCode,
            String skuName,
            String specJson,
            String imageObjectKey,
            long quantity) {
    }

    public record ReviewEligibilityView(
            @JsonSerialize(using = ToStringSerializer.class) Long id,
            String orderNo,
            int lineNo,
            @JsonSerialize(using = ToStringSerializer.class) Long productId,
            @JsonSerialize(using = ToStringSerializer.class) Long skuId,
            String productTitle,
            String skuCode,
            String skuName,
            String specJson,
            String imageObjectKey,
            long quantity,
            String status,
            @JsonSerialize(using = ToStringSerializer.class) Long reviewId,
            Instant completedAt) {
    }

    public record CreateReviewCommand(
            Long userId,
            Long eligibilityId,
            int rating,
            String content,
            boolean anonymous,
            String idempotencyKey) {
    }

    public record ReviewReplyView(
            @JsonSerialize(using = ToStringSerializer.class) Long id,
            String content,
            Instant createdAt) {
    }

    public record ProductReviewView(
            @JsonSerialize(using = ToStringSerializer.class) Long id,
            @JsonSerialize(using = ToStringSerializer.class) Long productId,
            @JsonSerialize(using = ToStringSerializer.class) Long skuId,
            String skuName,
            String specJson,
            int rating,
            String content,
            boolean anonymous,
            String authorLabel,
            String status,
            long likeCount,
            boolean likedByViewer,
            ReviewReplyView reply,
            Instant createdAt) {
    }

    public record ReviewSummaryView(
            @JsonSerialize(using = ToStringSerializer.class) Long productId,
            long reviewCount,
            BigDecimal averageRating,
            long rating1Count,
            long rating2Count,
            long rating3Count,
            long rating4Count,
            long rating5Count) {
    }

    public record ReviewReportView(
            @JsonSerialize(using = ToStringSerializer.class) Long id,
            @JsonSerialize(using = ToStringSerializer.class) Long reviewId,
            @JsonSerialize(using = ToStringSerializer.class) Long productId,
            int rating,
            String reviewContent,
            String reasonCode,
            String detail,
            String status,
            String resolution,
            Instant createdAt,
            Instant resolvedAt) {
    }

    public record ReviewReportReceipt(
            @JsonSerialize(using = ToStringSerializer.class) Long id,
            @JsonSerialize(using = ToStringSerializer.class) Long reviewId,
            String status,
            Instant createdAt) {
    }

    public record ModerationResultView(
            @JsonSerialize(using = ToStringSerializer.class) Long reportId,
            @JsonSerialize(using = ToStringSerializer.class) Long reviewId,
            String commandId,
            String resolution,
            String reviewStatusBefore,
            String reviewStatusAfter,
            Instant resolvedAt) {
    }
}