AuthAuditEvent.java

package com.project.auth.application.support.audit;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

public record AuthAuditEvent(AuditLevel level, String eventType, Map<String, String> fields) {

    public AuthAuditEvent {
        Objects.requireNonNull(level, "level must not be null");
        Objects.requireNonNull(eventType, "eventType must not be null");
        Objects.requireNonNull(fields, "fields must not be null");
        fields = Collections.unmodifiableMap(new LinkedHashMap<>(fields));
    }

    public static AuthAuditEvent info(String eventType, Object... keyValues) {
        return new AuthAuditEvent(AuditLevel.INFO, eventType, toFields(keyValues));
    }

    public static AuthAuditEvent warn(String eventType, Object... keyValues) {
        return new AuthAuditEvent(AuditLevel.WARN, eventType, toFields(keyValues));
    }

    private static Map<String, String> toFields(Object... keyValues) {
        if (keyValues.length % 2 != 0) {
            throw new IllegalArgumentException("keyValues must contain an even number of elements");
        }

        LinkedHashMap<String, String> fields = new LinkedHashMap<>();
        for (int index = 0; index < keyValues.length; index += 2) {
            Object key = Objects.requireNonNull(keyValues[index], "field key must not be null");
            Object value = Objects.requireNonNull(keyValues[index + 1], "field value must not be null");
            fields.put(key.toString(), value.toString());
        }
        return fields;
    }
}