PaymentEntity.java

package com.example.orderplatform.payments.infrastructure;

import com.example.orderplatform.payments.domain.Payment;
import com.example.orderplatform.payments.domain.PaymentStatus;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.util.UUID;

@Entity
@Table(name = "payments")
public class PaymentEntity {

    @Id
    private UUID id;
    private UUID orderId;

    @Enumerated(EnumType.STRING)
    private PaymentStatus status;

    private BigDecimal amount;
    private String currency;
    private OffsetDateTime createdAt;
    private OffsetDateTime authorizedAt;

    @Version
    private long version;

    protected PaymentEntity() {
    }

    private PaymentEntity(UUID id, UUID orderId, PaymentStatus status, BigDecimal amount, String currency, OffsetDateTime createdAt) {
        this.id = id;
        this.orderId = orderId;
        this.status = status;
        this.amount = amount;
        this.currency = currency;
        this.createdAt = createdAt;
    }

    static PaymentEntity from(Payment payment) {
        PaymentEntity entity = new PaymentEntity(
                payment.id(),
                payment.orderId(),
                payment.status(),
                payment.amount().amount(),
                payment.amount().currency(),
                payment.createdAt());
        entity.authorizedAt = payment.authorizedAt();
        return entity;
    }

    void updateFrom(Payment payment) {
        this.orderId = payment.orderId();
        this.status = payment.status();
        this.amount = payment.amount().amount();
        this.currency = payment.amount().currency();
        this.createdAt = payment.createdAt();
        this.authorizedAt = payment.authorizedAt();
    }

    public UUID id() {
        return id;
    }

    public UUID orderId() {
        return orderId;
    }

    public PaymentStatus status() {
        return status;
    }

    public BigDecimal amount() {
        return amount;
    }

    public String currency() {
        return currency;
    }

    public OffsetDateTime createdAt() {
        return createdAt;
    }

    public OffsetDateTime authorizedAt() {
        return authorizedAt;
    }
}