Skip to content

Commit 1ce7319

Browse files
feat[backend](tenants): added events and purge operations on events (#2482)
* feat[backend](tenants): added events and purge operations on events * feat[backend](tenants): added tenant valid uuid verification and used clickhouse friendly syntax to delete operations
1 parent ebb76f7 commit 1ce7319

2 files changed

Lines changed: 27 additions & 0 deletions

File tree

‎backend/modules/audit/domain/event_type.go‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ const (
124124
TENANT_UPDATE_SUCCESS ApplicationEventType = "TENANT_UPDATE_SUCCESS"
125125
TENANT_TERMINATE_ATTEMPT ApplicationEventType = "TENANT_TERMINATE_ATTEMPT"
126126
TENANT_TERMINATE_SUCCESS ApplicationEventType = "TENANT_TERMINATE_SUCCESS"
127+
TENANT_REACTIVATE_ATTEMPT ApplicationEventType = "TENANT_REACTIVATE_ATTEMPT"
128+
TENANT_REACTIVATE_SUCCESS ApplicationEventType = "TENANT_REACTIVATE_SUCCESS"
129+
TENANT_PURGE_ATTEMPT ApplicationEventType = "TENANT_PURGE_ATTEMPT"
130+
TENANT_PURGE_SUCCESS ApplicationEventType = "TENANT_PURGE_SUCCESS"
127131
TENANT_SUPPORT_ACCESS_ATTEMPT ApplicationEventType = "TENANT_SUPPORT_ACCESS_ATTEMPT"
128132
TENANT_SUPPORT_ACCESS_SUCCESS ApplicationEventType = "TENANT_SUPPORT_ACCESS_SUCCESS"
129133

‎backend/pkg/eventstore/eventstore.go‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package eventstore
22

33
import (
4+
"context"
5+
"fmt"
46
"time"
57

68
chdriver "github.com/ClickHouse/clickhouse-go/v2"
79
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
10+
"github.com/google/uuid"
811
"github.com/threatwinds/go-sdk/store"
912
"github.com/threatwinds/go-sdk/store/clickhouse"
1013

@@ -69,4 +72,24 @@ func (s *Store) TableName(d store.Dataset) string {
6972
return db + "." + name
7073
}
7174

75+
// PurgeTenant deletes all rows scoped to the given tenant across every
76+
// dataset table. ClickHouse mutation, not synchronous — the ALTER returns
77+
// once accepted and the rows disappear as the mutation runs.
78+
//
79+
// tenantID must be a UUID string (caller passes uuid.UUID.String()); it is
80+
// inlined into the SQL because ClickHouse does not bind parameters inside
81+
// ALTER ... DELETE mutation expressions. The UUID shape makes inlining safe.
82+
func (s *Store) PurgeTenant(ctx context.Context, tenantID string) error {
83+
if _, err := uuid.Parse(tenantID); err != nil {
84+
return fmt.Errorf("purge: invalid tenant id: %w", err)
85+
}
86+
for _, d := range []store.Dataset{DatasetLogs, DatasetAlerts, DatasetStats} {
87+
sql := fmt.Sprintf("ALTER TABLE %s DELETE WHERE tenantId = '%s'", s.TableName(d), tenantID)
88+
if err := s.Conn.Exec(ctx, sql); err != nil {
89+
return fmt.Errorf("purge %s: %w", d, err)
90+
}
91+
}
92+
return nil
93+
}
94+
7295
func SupportsTextSearch(d store.Dataset) bool { return d == DatasetLogs }

0 commit comments

Comments
 (0)