Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3376cf99dc |
@@ -0,0 +1,41 @@
|
|||||||
|
package audit
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
// AuditLogObjectType ist der Objekttyp-Bezeichner, unter dem Audit-Log-
|
||||||
|
// Eintraege bei der Archive-Retention-Engine registriert werden
|
||||||
|
// (Akzeptanzkriterium 1).
|
||||||
|
const AuditLogObjectType = "audit_log_entry"
|
||||||
|
|
||||||
|
// DefaultAuditRetentionYears ist die GoBD-Buchungsbeleg-Frist (Akzeptanz-
|
||||||
|
// kriterium 2) — Default, pro Tenant ueberschreibbar sofern rechtlich
|
||||||
|
// zulaessig. Die eigentliche Ueberschreibung/Durchsetzung liegt vollstaendig
|
||||||
|
// bei Archive, siehe AuditRetentionTenantOverridable.
|
||||||
|
const DefaultAuditRetentionYears = 10
|
||||||
|
|
||||||
|
// AuditRetentionTenantOverridable erlaubt Archive, die Default-Frist pro
|
||||||
|
// Tenant zu ueberschreiben — Core trifft dabei keine rechtliche Entscheidung,
|
||||||
|
// sondern erlaubt Archive lediglich, so eine Entscheidung zuzulassen.
|
||||||
|
const AuditRetentionTenantOverridable = true
|
||||||
|
|
||||||
|
// RetentionRegistrar ist der Modul-Adapter-Vertrag aus Archive RET-05, wie
|
||||||
|
// Core ihn konsumiert. Die tatsaechliche Implementierung lebt im
|
||||||
|
// Archive-Modul (RET-01/RET-02/RET-05) und existiert zum Zeitpunkt dieser
|
||||||
|
// Kachel noch nicht als Code — Core kennt nur diese Schnittstelle.
|
||||||
|
//
|
||||||
|
// WICHTIG: Core implementiert absichtlich KEINE eigene Loeschlogik fuer
|
||||||
|
// Audit-Eintraege (Akzeptanzkriterium 3). Dieses Paket enthaelt keinen
|
||||||
|
// Delete-Codepfad fuer audit_events ausser dem durch AUD-02 technisch
|
||||||
|
// unterbundenen — die tatsaechliche Loeschung/Aufbewahrungssperre erfolgt
|
||||||
|
// ausschliesslich innerhalb von Archive, ausserhalb dieses Prozesses.
|
||||||
|
type RetentionRegistrar interface {
|
||||||
|
RegisterObjectType(ctx context.Context, objectType string, defaultRetentionYears int, tenantOverridable bool) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterWithArchive meldet den Audit-Log-Objekttyp bei der Archive-
|
||||||
|
// Retention-Engine an. Dies ist die EINZIGE Beruehrung dieses Pakets mit
|
||||||
|
// Retention ueberhaupt — kein zweites, Core-eigenes Retention-System
|
||||||
|
// (siehe "Bekannte Fehler vermeiden" im AUD-05-Ticket).
|
||||||
|
func RegisterWithArchive(ctx context.Context, registrar RetentionRegistrar) error {
|
||||||
|
return registrar.RegisterObjectType(ctx, AuditLogObjectType, DefaultAuditRetentionYears, AuditRetentionTenantOverridable)
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package audit
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// fakeRegistrar simuliert den RET-05-Modul-Adapter-Vertrag, da Archive
|
||||||
|
// (RET-01/RET-02/RET-05) zum Zeitpunkt dieser Kachel noch nicht als Code
|
||||||
|
// existiert (nur geplant in archive-kanban). Belegt NUR, dass Core mit den
|
||||||
|
// richtigen Parametern registriert — ersetzt KEINE Integrationspruefung
|
||||||
|
// gegen die echte Archive-Engine, siehe Pruefungen-Abschnitt im Commit.
|
||||||
|
type fakeRegistrar struct {
|
||||||
|
objectType string
|
||||||
|
defaultRetentionYears int
|
||||||
|
tenantOverridable bool
|
||||||
|
called bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeRegistrar) RegisterObjectType(ctx context.Context, objectType string, defaultRetentionYears int, tenantOverridable bool) error {
|
||||||
|
f.called = true
|
||||||
|
f.objectType = objectType
|
||||||
|
f.defaultRetentionYears = defaultRetentionYears
|
||||||
|
f.tenantOverridable = tenantOverridable
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Akzeptanzkriterium 1 + 2: Registrierung mit korrektem Objekttyp und
|
||||||
|
// GoBD-Default-Frist von 10 Jahren, tenant-ueberschreibbar.
|
||||||
|
func TestRegisterWithArchive_UsesCorrectObjectTypeAndRetention(t *testing.T) {
|
||||||
|
fake := &fakeRegistrar{}
|
||||||
|
|
||||||
|
if err := RegisterWithArchive(context.Background(), fake); err != nil {
|
||||||
|
t.Fatalf("register: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fake.called {
|
||||||
|
t.Fatal("erwartet aufruf von RegisterObjectType")
|
||||||
|
}
|
||||||
|
if fake.objectType != AuditLogObjectType {
|
||||||
|
t.Fatalf("objectType = %q, want %q", fake.objectType, AuditLogObjectType)
|
||||||
|
}
|
||||||
|
if fake.defaultRetentionYears != 10 {
|
||||||
|
t.Fatalf("defaultRetentionYears = %d, want 10 (GoBD-Frist)", fake.defaultRetentionYears)
|
||||||
|
}
|
||||||
|
if !fake.tenantOverridable {
|
||||||
|
t.Fatal("erwartet tenantOverridable = true")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user