AuditLogService.java

package com.edtech.service;

import com.edtech.model.AuditAction;
import com.edtech.model.AuditLog;
import com.edtech.repository.AuditLogRepository;
import jakarta.servlet.http.HttpServletRequest;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/** Servico responsavel por registrar logs de auditoria no sistema. */
@Service
public class AuditLogService {
  private static final String DOCUMENT_RESOURCE_TYPE = "Document";
  private static final Logger log = LoggerFactory.getLogger(AuditLogService.class);
  private final AuditLogRepository auditLogRepository;

  /**
   * Construtor para injecao de dependencias.
   *
   * @param auditLogRepository Repositorio de logs de auditoria.
   */
  public AuditLogService(AuditLogRepository auditLogRepository) {
    this.auditLogRepository = auditLogRepository;
  }

  private String getClientIp() {
    try {
      ServletRequestAttributes attributes =
          (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
      if (attributes != null) {
        HttpServletRequest request = attributes.getRequest();
        String forwardedFor = request.getHeader("X-Forwarded-For");
        if (forwardedFor != null && !forwardedFor.isEmpty()) {
          return forwardedFor.split(",")[0].trim();
        }
        return request.getRemoteAddr();
      }
    } catch (Exception ignored) {
      log.debug("Erro ao extrair o IP do cliente", ignored);
    }
    return "UNKNOWN";
  }

  /**
   * Registra uma acao de auditoria detalhada.
   *
   * @param action Acao realizada.
   * @param userId ID do usuario.
   * @param resourceType Tipo do recurso.
   * @param resourceId ID do recurso.
   * @param ip IP do cliente.
   * @param details Detalhes adicionais.
   * @return Log de auditoria salvo.
   */
  public AuditLog log(
      AuditAction action,
      UUID userId,
      String resourceType,
      UUID resourceId,
      String ip,
      String details) {
    try {
      String clientIp = ip != null ? ip : getClientIp();
      AuditLog auditLog =
          new AuditLog(
              java.util.UUID.fromString("00000000-0000-0000-0000-000000000001"),
              userId,
              action,
              resourceType,
              resourceId,
              clientIp,
              details);
      return auditLogRepository.save(auditLog);
    } catch (Exception e) {
      log.error("Erro em salvar o log da auditoria: {}", e.getMessage(), e);
      return null;
    }
  }

  /**
   * Registra uma acao de auditoria simples, sem vinculo direto com um recurso especifico.
   *
   * @param userId ID do usuario.
   * @param action Acao realizada.
   * @param details Detalhes adicionais.
   * @return Log de auditoria salvo.
   */
  public AuditLog logAction(UUID userId, AuditAction action, String details) {
    return log(action, userId, null, null, null, details);
  }

  /**
   * Registra uma acao de auditoria relacionada a um documento especifico.
   *
   * @param userId ID do usuario que executou a acao.
   * @param action Acao realizada.
   * @param documentId ID do documento afetado.
   * @param details Detalhes adicionais da acao.
   * @return Log de auditoria salvo.
   */
  public AuditLog logDocumentAction(
      UUID userId, AuditAction action, UUID documentId, String details) {
    return log(action, userId, DOCUMENT_RESOURCE_TYPE, documentId, null, details);
  }
}