package store import ( "time" adapter "github.com/tinode/chat/server/db" "github.com/tinode/chat/server/store/types" ) type SecurityAuditPersistenceInterface interface { RecordLogin(types.TenantID, *types.LoginAuditEvent) error RecordLoginFailure(types.TenantID, *types.LoginFailureEvent) error CloseLogin(types.TenantID, string, time.Time) error ApplyMessageAction(types.TenantID, *types.MessageAdminAction) error } type securityAuditMapper struct{} var SecurityAudit SecurityAuditPersistenceInterface = securityAuditMapper{} func tenantSecurityAuditAdapter(tenantID types.TenantID) (adapter.TenantSecurityAuditAdapter, error) { business, err := tenantBusinessAdapter(tenantID) if err != nil { return nil, err } audit, ok := business.(adapter.TenantSecurityAuditAdapter) if !ok { return nil, types.ErrUnsupported } return audit, nil } func (securityAuditMapper) RecordLogin(tenantID types.TenantID, event *types.LoginAuditEvent) error { audit, err := tenantSecurityAuditAdapter(tenantID) if err != nil { return err } return audit.TenantLoginAuditCreate(tenantID, event) } func (securityAuditMapper) RecordLoginFailure(tenantID types.TenantID, event *types.LoginFailureEvent) error { audit, err := tenantSecurityAuditAdapter(tenantID) if err != nil { return err } return audit.TenantLoginFailureCreate(tenantID, event) } func (securityAuditMapper) CloseLogin(tenantID types.TenantID, sessionID string, at time.Time) error { audit, err := tenantSecurityAuditAdapter(tenantID) if err != nil { return err } return audit.TenantLoginAuditClose(tenantID, sessionID, at) } func (securityAuditMapper) ApplyMessageAction(tenantID types.TenantID, action *types.MessageAdminAction) error { audit, err := tenantSecurityAuditAdapter(tenantID) if err != nil { return err } return audit.TenantMessageAdminApply(tenantID, action) }