AuditTrailCsvExporter.java
package com.edtech.service;
import com.edtech.model.AuditLog;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.springframework.stereotype.Component;
/** Transforma logs de auditoria em arquivos CSV. */
@Component
public class AuditTrailCsvExporter {
/**
* Gera um CSV em memoria com os principais dados da trilha de auditoria.
*
* @param logs logs que devem ser exportados.
* @return conteudo do arquivo CSV em bytes.
*/
public byte[] export(List<AuditLog> logs) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try (OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)) {
writeRow(
writer,
"data_hora",
"usuario_id",
"acao",
"tipo_recurso",
"id_recurso",
"ip",
"detalhes");
for (AuditLog log : logs) {
writeRow(
writer,
log.getCreatedAt() != null ? log.getCreatedAt().toString() : "",
log.getUserId() != null ? log.getUserId().toString() : "",
log.getAction() != null ? log.getAction().name() : "",
log.getResourceType() != null ? log.getResourceType() : "",
log.getResourceId() != null ? log.getResourceId().toString() : "",
log.getIpAddress() != null ? log.getIpAddress() : "",
log.getDetails() != null ? log.getDetails() : "");
}
writer.flush();
return outputStream.toByteArray();
} catch (Exception e) {
throw new RuntimeException("Falha ao gerar CSV da trilha de auditoria", e);
}
}
private void writeRow(OutputStreamWriter writer, String... values) throws java.io.IOException {
for (int index = 0; index < values.length; index++) {
if (index > 0) {
writer.write(",");
}
writer.write(escape(values[index]));
}
writer.write("\r\n");
}
private String escape(String value) {
String safeValue = value != null ? value : "";
if (safeValue.contains("\"")
|| safeValue.contains(",")
|| safeValue.contains("\n")
|| safeValue.contains("\r")) {
return "\"" + safeValue.replace("\"", "\"\"") + "\"";
}
return safeValue;
}
}