package usage import ( "context" "errors" "fmt" ) // StorageBytesMetric ist der feste Metrikname, unter dem der belegte // Speicherplatz je Tenant gefuehrt wird (LIC-05, siehe // core-kanban/tickets/LIC-05.md). LIC-03 fragt genau diese Metrik ueber // Store.Get/Store.Check ab — kein zweiter, paralleler Speicher-Zaehler. const StorageBytesMetric = "storage_bytes" // ReportStorageWrite wird von den Objekt-Storage-Treibern der Module (DMS // FDN-03, Mail ARC-01 — existieren als Code noch nicht) bei jedem // Schreibvorgang aufgerufen. Nutzt Store.Increment, das bereits atomar ist // (Akzeptanzkriterium 2, siehe LIC-03) — kein zweiter Inkrement-Mechanismus // nur fuer Speicher. func (s *Store) ReportStorageWrite(ctx context.Context, tenantID string, sizeBytes int64) error { if sizeBytes < 0 { return errors.New("usage: sizeBytes darf bei einem schreibvorgang nicht negativ sein") } if err := s.Increment(ctx, tenantID, StorageBytesMetric, sizeBytes); err != nil { return fmt.Errorf("speicherverbrauch (schreiben) melden: %w", err) } return nil } // ReportStorageDelete wird bei jedem Loeschvorgang aufgerufen — dekrementiert // denselben Zaehler ueber ein negatives Delta desselben atomaren UPSERT. func (s *Store) ReportStorageDelete(ctx context.Context, tenantID string, sizeBytes int64) error { if sizeBytes < 0 { return errors.New("usage: sizeBytes darf bei einem loeschvorgang nicht negativ sein") } if err := s.Increment(ctx, tenantID, StorageBytesMetric, -sizeBytes); err != nil { return fmt.Errorf("speicherverbrauch (loeschen) melden: %w", err) } return nil } // CurrentStorageUsage liefert den aktuellen Speicherverbrauch eines Tenants // (Akzeptanzkriterium 3) — ein einfaches Get auf den bereits gefuehrten // Zaehler, kein Scan des Objekt-Storage. func (s *Store) CurrentStorageUsage(ctx context.Context, tenantID string) (int64, error) { return s.Get(ctx, tenantID, StorageBytesMetric) }