Saltar a contenido

KAudit — ejemplos ejecutables

El módulo kaudit-samples contiene ejemplos que compilan y corren de verdad, con las dos variantes en un solo módulo:

  • src/main/kotlin → variante Kotlin (KSP).
  • src/main/java → variante Java (APT).
./gradlew :kaudit-samples:run

Un mismo dominio (Account con owner anidado, miembros por @AuditKey, settings en Map, apiKey sensible) se audita en ambos lenguajes; la salida muestra el changelog legible y el JSON serializado.

Kotlin (KSP)

@Auditable
data class Account(
    val id: Long,
    val name: String,
    @Sensitive val apiKey: String,
    @AuditIgnore val updatedAt: Long,
    val owner: Person,
    val members: List<Member>,      // @AuditKey en Member.id → diff por clave
    val settings: Map<String, String>,
)

val changes = old.diff(new)
println(changes.renderText())
// ~ name: Acme -> Acme Inc
// ~ apiKey: (redactado)
// ~ owner.email: a@acme.com -> b@acme.com
// ~ members[1].role: viewer -> owner
// + members[3]: Member(id=3, role=guest)
// - settings[lang]: es
// ~ settings[theme]: light -> dark
// + settings[tz]: UTC

Persistir la traza como JSON (módulo kaudit-serialization):

val json = Json.encodeToString(changes.toRecords())

Java (APT)

var old = new Account(1, "Acme", "sk-AAA", 1_000,
    new Person("a@acme.com"),
    List.of(new Member(1, "viewer"), new Member(2, "admin")),
    Map.of("theme", "light", "lang", "es"));
var neu = new Account(1, "Acme Inc", "sk-BBB", 9_999,
    new Person("b@acme.com"),
    List.of(new Member(2, "admin"), new Member(1, "owner"), new Member(3, "guest")),
    Map.of("theme", "dark", "tz", "UTC"));

List<FieldChange> changes = AccountAuditor.diff(old, neu);
for (FieldChange c : changes) { /* getPath(), getOld(), getNew(), getKind(), getRedacted() */ }

Produce exactamente los mismos cambios (mismo path, misma redacción, mismo ChangeKind) que la variante Kotlin: es el mismo dominio bajo dos frontends.