SearchModels.java
package com.ecommerce.catalog.application.model;
import com.ecommerce.catalog.application.model.CatalogModels.ProductSummary;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.time.Instant;
import java.util.List;
public final class SearchModels {
private SearchModels() {
}
public record ProductSearchPage(
List<ProductSummary> items,
long page,
long size,
long matchedTotal,
String source,
boolean degraded
) {
public ProductSearchPage {
items = List.copyOf(items);
}
}
public record SearchOutboxView(
String id,
@JsonSerialize(using = ToStringSerializer.class) Long productId,
long targetRevision,
String status,
int attempts,
Instant nextAttemptAt,
String lastError,
Instant createdAt,
Instant updatedAt
) {
}
public record SearchRecoveryView(
String commandId,
String outboxId,
String statusBefore,
String statusAfter,
Instant recoveredAt
) {
}
public record SearchRebuildView(
@JsonSerialize(using = ToStringSerializer.class) Long id,
String commandId,
String status,
String targetIndex,
int attempts,
long indexedCount,
String lastError,
Instant createdAt,
Instant startedAt,
Instant completedAt
) {
}
public record SearchRebuildRecoveryView(
String commandId,
@JsonSerialize(using = ToStringSerializer.class) Long rebuildId,
String statusBefore,
String statusAfter,
Instant recoveredAt
) {
}
public record SearchReconciliationIssueView(
@JsonSerialize(using = ToStringSerializer.class) Long productId,
String issueType,
String status,
Long mysqlRevision,
Long indexRevision,
int occurrences,
Instant firstDetectedAt,
Instant lastDetectedAt,
Instant resolvedAt
) {
}
public record SearchReconciliationResult(
int mysqlDocuments,
int indexDocuments,
int missing,
int stale,
int orphan,
int opened,
int resolved,
int repairEvents,
boolean saturated
) {
}
}