ProcessingResult.java

package com.designpatterns.structural.decorator.applied;

import java.util.ArrayList;
import java.util.List;

public record ProcessingResult(String transactionId, boolean approved, List<String> auditTrail) {

    public ProcessingResult {
        auditTrail = List.copyOf(auditTrail);
    }

    public ProcessingResult withNote(String note) {
        return withNoteAndApproval(note, approved);
    }

    public ProcessingResult withNoteAndApproval(String note, boolean newApproved) {
        List<String> updated = new ArrayList<>(auditTrail);
        updated.add(note);
        return new ProcessingResult(transactionId, newApproved, updated);
    }
}