LoginAuditService.java

package com.ecommerce.identity.application.service;

import com.ecommerce.identity.application.model.LoginContext;
import com.ecommerce.identity.application.port.IdentityStore;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;

@Service
public class LoginAuditService {

    private final IdentityStore identityStore;

    public LoginAuditService(IdentityStore identityStore) {
        this.identityStore = identityStore;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void record(
            Long userId,
            String normalizedEmail,
            boolean successful,
            String failureCode,
            LoginContext context,
            Instant now) {
        identityStore.saveLoginRecord(
                userId,
                normalizedEmail,
                successful,
                failureCode,
                context.clientIp(),
                context.userAgent(),
                now
        );
    }
}