batched rel references and added test for the batch delete processing

This commit is contained in:
Gani Georgiev 2022-12-12 19:21:41 +02:00
parent 0eeae9de80
commit be3dd42eac
6 changed files with 111 additions and 159 deletions

View File

@ -684,7 +684,7 @@ func TestRecordCrudDelete(t *testing.T) {
}, },
}, },
{ {
Name: "authenticated record that does match the collection delete rule", Name: "authenticated record that match the collection delete rule",
Method: http.MethodDelete, Method: http.MethodDelete,
Url: "/api/collections/users/records/4q1xlclmfloku33", Url: "/api/collections/users/records/4q1xlclmfloku33",
RequestHeaders: map[string]string{ RequestHeaders: map[string]string{
@ -693,9 +693,9 @@ func TestRecordCrudDelete(t *testing.T) {
}, },
ExpectedStatus: 204, ExpectedStatus: 204,
ExpectedEvents: map[string]int{ ExpectedEvents: map[string]int{
"OnModelAfterDelete": 1, "OnModelAfterDelete": 3, // +2 because of the external auths
"OnModelBeforeDelete": 3, // +2 because of the external auths
"OnModelAfterUpdate": 1, "OnModelAfterUpdate": 1,
"OnModelBeforeDelete": 1,
"OnModelBeforeUpdate": 1, "OnModelBeforeUpdate": 1,
"OnRecordAfterDeleteRequest": 1, "OnRecordAfterDeleteRequest": 1,
"OnRecordBeforeDeleteRequest": 1, "OnRecordBeforeDeleteRequest": 1,

View File

@ -111,7 +111,7 @@ func (dao *Dao) RunInTransaction(fn func(txDao *Dao) error) error {
case *dbx.Tx: case *dbx.Tx:
// nested transactions are not supported by default // nested transactions are not supported by default
// so execute the function within the current transaction // so execute the function within the current transaction
// ---
// create a new dao with the same hooks to avoid semaphore deadlock when nesting // create a new dao with the same hooks to avoid semaphore deadlock when nesting
txDao := New(txOrDB) txDao := New(txOrDB)
txDao.BeforeCreateFunc = dao.BeforeCreateFunc txDao.BeforeCreateFunc = dao.BeforeCreateFunc
@ -320,12 +320,10 @@ Retry:
if attempts == 2 { if attempts == 2 {
// assign new Dao without the before hooks to avoid triggering // assign new Dao without the before hooks to avoid triggering
// the already fired before callbacks multiple times // the already fired before callbacks multiple times
retryDao = &Dao{ retryDao = New(dao.db)
db: dao.db, retryDao.AfterCreateFunc = dao.AfterCreateFunc
AfterCreateFunc: dao.AfterCreateFunc, retryDao.AfterUpdateFunc = dao.AfterUpdateFunc
AfterUpdateFunc: dao.AfterUpdateFunc, retryDao.AfterDeleteFunc = dao.AfterDeleteFunc
AfterDeleteFunc: dao.AfterDeleteFunc,
}
} }
// execute // execute

View File

@ -433,21 +433,21 @@ func (dao *Dao) cascadeRecordDelete(mainRecord *models.Record, refs map[*models.
break break
} }
perPage := 200 perWorkers := 50
pages := int(math.Ceil(float64(total) / float64(perPage))) workers := int(math.Ceil(float64(total) / float64(perWorkers)))
batchErr := func() error { batchErr := func() error {
ch := make(chan error) ch := make(chan error)
defer close(ch) defer close(ch)
for i := 0; i < pages; i++ { for i := 0; i < workers; i++ {
var chunks []dbx.NullStringMap var chunks []dbx.NullStringMap
if len(rows) <= perPage { if len(rows) <= perWorkers {
chunks = rows[0:] chunks = rows
rows = nil rows = nil
} else { } else {
chunks = rows[0:perPage] chunks = rows[:perWorkers]
rows = rows[perPage:] rows = rows[perWorkers:]
} }
go func() { go func() {
@ -456,7 +456,7 @@ func (dao *Dao) cascadeRecordDelete(mainRecord *models.Record, refs map[*models.
}() }()
} }
for i := 0; i < pages; i++ { for i := 0; i < workers; i++ {
if err := <-ch; err != nil { if err := <-ch; err != nil {
return err return err
} }

2
go.mod
View File

@ -4,7 +4,7 @@ go 1.18
require ( require (
github.com/AlecAivazis/survey/v2 v2.3.6 github.com/AlecAivazis/survey/v2 v2.3.6
github.com/aws/aws-sdk-go v1.44.156 github.com/aws/aws-sdk-go v1.44.157
github.com/disintegration/imaging v1.6.2 github.com/disintegration/imaging v1.6.2
github.com/domodwyer/mailyak/v3 v3.3.4 github.com/domodwyer/mailyak/v3 v3.3.4
github.com/dop251/goja v0.0.0-20221118162653-d4bf6fde1b86 github.com/dop251/goja v0.0.0-20221118162653-d4bf6fde1b86

4
go.sum
View File

@ -206,8 +206,8 @@ github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4
github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.44.45/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.45/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.44.68/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.68/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.44.156 h1:3RhbBTZ87HoI5OP2JjcKdd5qOnyo9YOAW8+Bb/h0vSE= github.com/aws/aws-sdk-go v1.44.157 h1:JVBPpEWC8+yA7CbfAuTl/ZFFlHS3yoqWFqxFyTCISwg=
github.com/aws/aws-sdk-go v1.44.156/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.44.157/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw=
github.com/aws/aws-sdk-go-v2 v1.17.2 h1:r0yRZInwiPBNpQ4aDy/Ssh3ROWsGtKDwar2JS8Lm+N8= github.com/aws/aws-sdk-go-v2 v1.17.2 h1:r0yRZInwiPBNpQ4aDy/Ssh3ROWsGtKDwar2JS8Lm+N8=

View File

@ -7,6 +7,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"sync"
"github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/mailer" "github.com/pocketbase/pocketbase/tools/mailer"
@ -16,6 +17,8 @@ import (
type TestApp struct { type TestApp struct {
*core.BaseApp *core.BaseApp
mux sync.Mutex
// EventCalls defines a map to inspect which app events // EventCalls defines a map to inspect which app events
// (and how many times) were triggered. // (and how many times) were triggered.
// //
@ -42,15 +45,35 @@ func (t *TestApp) Cleanup() {
} }
func (t *TestApp) NewMailClient() mailer.Mailer { func (t *TestApp) NewMailClient() mailer.Mailer {
t.mux.Lock()
defer t.mux.Unlock()
t.TestMailer.Reset() t.TestMailer.Reset()
return t.TestMailer return t.TestMailer
} }
// ResetEventCalls resets the EventCalls counter. // ResetEventCalls resets the EventCalls counter.
func (t *TestApp) ResetEventCalls() { func (t *TestApp) ResetEventCalls() {
t.mux.Lock()
defer t.mux.Unlock()
t.EventCalls = make(map[string]int) t.EventCalls = make(map[string]int)
} }
func (t *TestApp) registerEventCall(name string) error {
t.mux.Lock()
defer t.mux.Unlock()
if t.EventCalls == nil {
t.EventCalls = make(map[string]int)
}
t.EventCalls[name]++
return nil
}
// NewTestApp creates and initializes a test application instance. // NewTestApp creates and initializes a test application instance.
// //
// It is the caller's responsibility to call `app.Cleanup()` // It is the caller's responsibility to call `app.Cleanup()`
@ -88,348 +111,279 @@ func NewTestApp(optTestDataDir ...string) (*TestApp, error) {
} }
t.OnBeforeApiError().Add(func(e *core.ApiErrorEvent) error { t.OnBeforeApiError().Add(func(e *core.ApiErrorEvent) error {
t.EventCalls["OnBeforeApiError"]++ return t.registerEventCall("OnBeforeApiError")
return nil
}) })
t.OnAfterApiError().Add(func(e *core.ApiErrorEvent) error { t.OnAfterApiError().Add(func(e *core.ApiErrorEvent) error {
t.EventCalls["OnAfterApiError"]++ return t.registerEventCall("OnAfterApiError")
return nil
}) })
t.OnModelBeforeCreate().Add(func(e *core.ModelEvent) error { t.OnModelBeforeCreate().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelBeforeCreate"]++ return t.registerEventCall("OnModelBeforeCreate")
return nil
}) })
t.OnModelAfterCreate().Add(func(e *core.ModelEvent) error { t.OnModelAfterCreate().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelAfterCreate"]++ return t.registerEventCall("OnModelAfterCreate")
return nil
}) })
t.OnModelBeforeUpdate().Add(func(e *core.ModelEvent) error { t.OnModelBeforeUpdate().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelBeforeUpdate"]++ return t.registerEventCall("OnModelBeforeUpdate")
return nil
}) })
t.OnModelAfterUpdate().Add(func(e *core.ModelEvent) error { t.OnModelAfterUpdate().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelAfterUpdate"]++ return t.registerEventCall("OnModelAfterUpdate")
return nil
}) })
t.OnModelBeforeDelete().Add(func(e *core.ModelEvent) error { t.OnModelBeforeDelete().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelBeforeDelete"]++ return t.registerEventCall("OnModelBeforeDelete")
return nil
}) })
t.OnModelAfterDelete().Add(func(e *core.ModelEvent) error { t.OnModelAfterDelete().Add(func(e *core.ModelEvent) error {
t.EventCalls["OnModelAfterDelete"]++ return t.registerEventCall("OnModelAfterDelete")
return nil
}) })
t.OnRecordsListRequest().Add(func(e *core.RecordsListEvent) error { t.OnRecordsListRequest().Add(func(e *core.RecordsListEvent) error {
t.EventCalls["OnRecordsListRequest"]++ return t.registerEventCall("OnRecordsListRequest")
return nil
}) })
t.OnRecordViewRequest().Add(func(e *core.RecordViewEvent) error { t.OnRecordViewRequest().Add(func(e *core.RecordViewEvent) error {
t.EventCalls["OnRecordViewRequest"]++ return t.registerEventCall("OnRecordViewRequest")
return nil
}) })
t.OnRecordBeforeCreateRequest().Add(func(e *core.RecordCreateEvent) error { t.OnRecordBeforeCreateRequest().Add(func(e *core.RecordCreateEvent) error {
t.EventCalls["OnRecordBeforeCreateRequest"]++ return t.registerEventCall("OnRecordBeforeCreateRequest")
return nil
}) })
t.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error { t.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error {
t.EventCalls["OnRecordAfterCreateRequest"]++ return t.registerEventCall("OnRecordAfterCreateRequest")
return nil
}) })
t.OnRecordBeforeUpdateRequest().Add(func(e *core.RecordUpdateEvent) error { t.OnRecordBeforeUpdateRequest().Add(func(e *core.RecordUpdateEvent) error {
t.EventCalls["OnRecordBeforeUpdateRequest"]++ return t.registerEventCall("OnRecordBeforeUpdateRequest")
return nil
}) })
t.OnRecordAfterUpdateRequest().Add(func(e *core.RecordUpdateEvent) error { t.OnRecordAfterUpdateRequest().Add(func(e *core.RecordUpdateEvent) error {
t.EventCalls["OnRecordAfterUpdateRequest"]++ return t.registerEventCall("OnRecordAfterUpdateRequest")
return nil
}) })
t.OnRecordBeforeDeleteRequest().Add(func(e *core.RecordDeleteEvent) error { t.OnRecordBeforeDeleteRequest().Add(func(e *core.RecordDeleteEvent) error {
t.EventCalls["OnRecordBeforeDeleteRequest"]++ return t.registerEventCall("OnRecordBeforeDeleteRequest")
return nil
}) })
t.OnRecordAfterDeleteRequest().Add(func(e *core.RecordDeleteEvent) error { t.OnRecordAfterDeleteRequest().Add(func(e *core.RecordDeleteEvent) error {
t.EventCalls["OnRecordAfterDeleteRequest"]++ return t.registerEventCall("OnRecordAfterDeleteRequest")
return nil
}) })
t.OnRecordAuthRequest().Add(func(e *core.RecordAuthEvent) error { t.OnRecordAuthRequest().Add(func(e *core.RecordAuthEvent) error {
t.EventCalls["OnRecordAuthRequest"]++ return t.registerEventCall("OnRecordAuthRequest")
return nil
}) })
t.OnRecordBeforeRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error { t.OnRecordBeforeRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error {
t.EventCalls["OnRecordBeforeRequestPasswordResetRequest"]++ return t.registerEventCall("OnRecordBeforeRequestPasswordResetRequest")
return nil
}) })
t.OnRecordAfterRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error { t.OnRecordAfterRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error {
t.EventCalls["OnRecordAfterRequestPasswordResetRequest"]++ return t.registerEventCall("OnRecordAfterRequestPasswordResetRequest")
return nil
}) })
t.OnRecordBeforeConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error { t.OnRecordBeforeConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error {
t.EventCalls["OnRecordBeforeConfirmPasswordResetRequest"]++ return t.registerEventCall("OnRecordBeforeConfirmPasswordResetRequest")
return nil
}) })
t.OnRecordAfterConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error { t.OnRecordAfterConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error {
t.EventCalls["OnRecordAfterConfirmPasswordResetRequest"]++ return t.registerEventCall("OnRecordAfterConfirmPasswordResetRequest")
return nil
}) })
t.OnRecordBeforeRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error { t.OnRecordBeforeRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error {
t.EventCalls["OnRecordBeforeRequestVerificationRequest"]++ return t.registerEventCall("OnRecordBeforeRequestVerificationRequest")
return nil
}) })
t.OnRecordAfterRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error { t.OnRecordAfterRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error {
t.EventCalls["OnRecordAfterRequestVerificationRequest"]++ return t.registerEventCall("OnRecordAfterRequestVerificationRequest")
return nil
}) })
t.OnRecordBeforeConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error { t.OnRecordBeforeConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error {
t.EventCalls["OnRecordBeforeConfirmVerificationRequest"]++ return t.registerEventCall("OnRecordBeforeConfirmVerificationRequest")
return nil
}) })
t.OnRecordAfterConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error { t.OnRecordAfterConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error {
t.EventCalls["OnRecordAfterConfirmVerificationRequest"]++ return t.registerEventCall("OnRecordAfterConfirmVerificationRequest")
return nil
}) })
t.OnRecordBeforeRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error { t.OnRecordBeforeRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error {
t.EventCalls["OnRecordBeforeRequestEmailChangeRequest"]++ return t.registerEventCall("OnRecordBeforeRequestEmailChangeRequest")
return nil
}) })
t.OnRecordAfterRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error { t.OnRecordAfterRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error {
t.EventCalls["OnRecordAfterRequestEmailChangeRequest"]++ return t.registerEventCall("OnRecordAfterRequestEmailChangeRequest")
return nil
}) })
t.OnRecordBeforeConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error { t.OnRecordBeforeConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error {
t.EventCalls["OnRecordBeforeConfirmEmailChangeRequest"]++ return t.registerEventCall("OnRecordBeforeConfirmEmailChangeRequest")
return nil
}) })
t.OnRecordAfterConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error { t.OnRecordAfterConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error {
t.EventCalls["OnRecordAfterConfirmEmailChangeRequest"]++ return t.registerEventCall("OnRecordAfterConfirmEmailChangeRequest")
return nil
}) })
t.OnRecordListExternalAuthsRequest().Add(func(e *core.RecordListExternalAuthsEvent) error { t.OnRecordListExternalAuthsRequest().Add(func(e *core.RecordListExternalAuthsEvent) error {
t.EventCalls["OnRecordListExternalAuthsRequest"]++ return t.registerEventCall("OnRecordListExternalAuthsRequest")
return nil
}) })
t.OnRecordBeforeUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error { t.OnRecordBeforeUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error {
t.EventCalls["OnRecordBeforeUnlinkExternalAuthRequest"]++ return t.registerEventCall("OnRecordBeforeUnlinkExternalAuthRequest")
return nil
}) })
t.OnRecordAfterUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error { t.OnRecordAfterUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error {
t.EventCalls["OnRecordAfterUnlinkExternalAuthRequest"]++ return t.registerEventCall("OnRecordAfterUnlinkExternalAuthRequest")
return nil
}) })
t.OnMailerBeforeAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error { t.OnMailerBeforeAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error {
t.EventCalls["OnMailerBeforeAdminResetPasswordSend"]++ return t.registerEventCall("OnMailerBeforeAdminResetPasswordSend")
return nil
}) })
t.OnMailerAfterAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error { t.OnMailerAfterAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error {
t.EventCalls["OnMailerAfterAdminResetPasswordSend"]++ return t.registerEventCall("OnMailerAfterAdminResetPasswordSend")
return nil
}) })
t.OnMailerBeforeRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerBeforeRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerBeforeRecordResetPasswordSend"]++ return t.registerEventCall("OnMailerBeforeRecordResetPasswordSend")
return nil
}) })
t.OnMailerAfterRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerAfterRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerAfterRecordResetPasswordSend"]++ return t.registerEventCall("OnMailerAfterRecordResetPasswordSend")
return nil
}) })
t.OnMailerBeforeRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerBeforeRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerBeforeRecordVerificationSend"]++ return t.registerEventCall("OnMailerBeforeRecordVerificationSend")
return nil
}) })
t.OnMailerAfterRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerAfterRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerAfterRecordVerificationSend"]++ return t.registerEventCall("OnMailerAfterRecordVerificationSend")
return nil
}) })
t.OnMailerBeforeRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerBeforeRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerBeforeRecordChangeEmailSend"]++ return t.registerEventCall("OnMailerBeforeRecordChangeEmailSend")
return nil
}) })
t.OnMailerAfterRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error { t.OnMailerAfterRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error {
t.EventCalls["OnMailerAfterRecordChangeEmailSend"]++ return t.registerEventCall("OnMailerAfterRecordChangeEmailSend")
return nil
}) })
t.OnRealtimeConnectRequest().Add(func(e *core.RealtimeConnectEvent) error { t.OnRealtimeConnectRequest().Add(func(e *core.RealtimeConnectEvent) error {
t.EventCalls["OnRealtimeConnectRequest"]++ return t.registerEventCall("OnRealtimeConnectRequest")
return nil
}) })
t.OnRealtimeDisconnectRequest().Add(func(e *core.RealtimeDisconnectEvent) error { t.OnRealtimeDisconnectRequest().Add(func(e *core.RealtimeDisconnectEvent) error {
t.EventCalls["OnRealtimeDisconnectRequest"]++ return t.registerEventCall("OnRealtimeDisconnectRequest")
return nil
}) })
t.OnRealtimeBeforeMessageSend().Add(func(e *core.RealtimeMessageEvent) error { t.OnRealtimeBeforeMessageSend().Add(func(e *core.RealtimeMessageEvent) error {
t.EventCalls["OnRealtimeBeforeMessageSend"]++ return t.registerEventCall("OnRealtimeBeforeMessageSend")
return nil
}) })
t.OnRealtimeAfterMessageSend().Add(func(e *core.RealtimeMessageEvent) error { t.OnRealtimeAfterMessageSend().Add(func(e *core.RealtimeMessageEvent) error {
t.EventCalls["OnRealtimeAfterMessageSend"]++ return t.registerEventCall("OnRealtimeAfterMessageSend")
return nil
}) })
t.OnRealtimeBeforeSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error { t.OnRealtimeBeforeSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error {
t.EventCalls["OnRealtimeBeforeSubscribeRequest"]++ return t.registerEventCall("OnRealtimeBeforeSubscribeRequest")
return nil
}) })
t.OnRealtimeAfterSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error { t.OnRealtimeAfterSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error {
t.EventCalls["OnRealtimeAfterSubscribeRequest"]++ return t.registerEventCall("OnRealtimeAfterSubscribeRequest")
return nil
}) })
t.OnSettingsListRequest().Add(func(e *core.SettingsListEvent) error { t.OnSettingsListRequest().Add(func(e *core.SettingsListEvent) error {
t.EventCalls["OnSettingsListRequest"]++ return t.registerEventCall("OnSettingsListRequest")
return nil
}) })
t.OnSettingsBeforeUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error { t.OnSettingsBeforeUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error {
t.EventCalls["OnSettingsBeforeUpdateRequest"]++ return t.registerEventCall("OnSettingsBeforeUpdateRequest")
return nil
}) })
t.OnSettingsAfterUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error { t.OnSettingsAfterUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error {
t.EventCalls["OnSettingsAfterUpdateRequest"]++ return t.registerEventCall("OnSettingsAfterUpdateRequest")
return nil
}) })
t.OnCollectionsListRequest().Add(func(e *core.CollectionsListEvent) error { t.OnCollectionsListRequest().Add(func(e *core.CollectionsListEvent) error {
t.EventCalls["OnCollectionsListRequest"]++ return t.registerEventCall("OnCollectionsListRequest")
return nil
}) })
t.OnCollectionViewRequest().Add(func(e *core.CollectionViewEvent) error { t.OnCollectionViewRequest().Add(func(e *core.CollectionViewEvent) error {
t.EventCalls["OnCollectionViewRequest"]++ return t.registerEventCall("OnCollectionViewRequest")
return nil
}) })
t.OnCollectionBeforeCreateRequest().Add(func(e *core.CollectionCreateEvent) error { t.OnCollectionBeforeCreateRequest().Add(func(e *core.CollectionCreateEvent) error {
t.EventCalls["OnCollectionBeforeCreateRequest"]++ return t.registerEventCall("OnCollectionBeforeCreateRequest")
return nil
}) })
t.OnCollectionAfterCreateRequest().Add(func(e *core.CollectionCreateEvent) error { t.OnCollectionAfterCreateRequest().Add(func(e *core.CollectionCreateEvent) error {
t.EventCalls["OnCollectionAfterCreateRequest"]++ return t.registerEventCall("OnCollectionAfterCreateRequest")
return nil
}) })
t.OnCollectionBeforeUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error { t.OnCollectionBeforeUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error {
t.EventCalls["OnCollectionBeforeUpdateRequest"]++ return t.registerEventCall("OnCollectionBeforeUpdateRequest")
return nil
}) })
t.OnCollectionAfterUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error { t.OnCollectionAfterUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error {
t.EventCalls["OnCollectionAfterUpdateRequest"]++ return t.registerEventCall("OnCollectionAfterUpdateRequest")
return nil
}) })
t.OnCollectionBeforeDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error { t.OnCollectionBeforeDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error {
t.EventCalls["OnCollectionBeforeDeleteRequest"]++ return t.registerEventCall("OnCollectionBeforeDeleteRequest")
return nil
}) })
t.OnCollectionAfterDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error { t.OnCollectionAfterDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error {
t.EventCalls["OnCollectionAfterDeleteRequest"]++ return t.registerEventCall("OnCollectionAfterDeleteRequest")
return nil
}) })
t.OnCollectionsBeforeImportRequest().Add(func(e *core.CollectionsImportEvent) error { t.OnCollectionsBeforeImportRequest().Add(func(e *core.CollectionsImportEvent) error {
t.EventCalls["OnCollectionsBeforeImportRequest"]++ return t.registerEventCall("OnCollectionsBeforeImportRequest")
return nil
}) })
t.OnCollectionsAfterImportRequest().Add(func(e *core.CollectionsImportEvent) error { t.OnCollectionsAfterImportRequest().Add(func(e *core.CollectionsImportEvent) error {
t.EventCalls["OnCollectionsAfterImportRequest"]++ return t.registerEventCall("OnCollectionsAfterImportRequest")
return nil
}) })
t.OnAdminsListRequest().Add(func(e *core.AdminsListEvent) error { t.OnAdminsListRequest().Add(func(e *core.AdminsListEvent) error {
t.EventCalls["OnAdminsListRequest"]++ return t.registerEventCall("OnAdminsListRequest")
return nil
}) })
t.OnAdminViewRequest().Add(func(e *core.AdminViewEvent) error { t.OnAdminViewRequest().Add(func(e *core.AdminViewEvent) error {
t.EventCalls["OnAdminViewRequest"]++ return t.registerEventCall("OnAdminViewRequest")
return nil
}) })
t.OnAdminBeforeCreateRequest().Add(func(e *core.AdminCreateEvent) error { t.OnAdminBeforeCreateRequest().Add(func(e *core.AdminCreateEvent) error {
t.EventCalls["OnAdminBeforeCreateRequest"]++ return t.registerEventCall("OnAdminBeforeCreateRequest")
return nil
}) })
t.OnAdminAfterCreateRequest().Add(func(e *core.AdminCreateEvent) error { t.OnAdminAfterCreateRequest().Add(func(e *core.AdminCreateEvent) error {
t.EventCalls["OnAdminAfterCreateRequest"]++ return t.registerEventCall("OnAdminAfterCreateRequest")
return nil
}) })
t.OnAdminBeforeUpdateRequest().Add(func(e *core.AdminUpdateEvent) error { t.OnAdminBeforeUpdateRequest().Add(func(e *core.AdminUpdateEvent) error {
t.EventCalls["OnAdminBeforeUpdateRequest"]++ return t.registerEventCall("OnAdminBeforeUpdateRequest")
return nil
}) })
t.OnAdminAfterUpdateRequest().Add(func(e *core.AdminUpdateEvent) error { t.OnAdminAfterUpdateRequest().Add(func(e *core.AdminUpdateEvent) error {
t.EventCalls["OnAdminAfterUpdateRequest"]++ return t.registerEventCall("OnAdminAfterUpdateRequest")
return nil
}) })
t.OnAdminBeforeDeleteRequest().Add(func(e *core.AdminDeleteEvent) error { t.OnAdminBeforeDeleteRequest().Add(func(e *core.AdminDeleteEvent) error {
t.EventCalls["OnAdminBeforeDeleteRequest"]++ return t.registerEventCall("OnAdminBeforeDeleteRequest")
return nil
}) })
t.OnAdminAfterDeleteRequest().Add(func(e *core.AdminDeleteEvent) error { t.OnAdminAfterDeleteRequest().Add(func(e *core.AdminDeleteEvent) error {
t.EventCalls["OnAdminAfterDeleteRequest"]++ return t.registerEventCall("OnAdminAfterDeleteRequest")
return nil
}) })
t.OnAdminAuthRequest().Add(func(e *core.AdminAuthEvent) error { t.OnAdminAuthRequest().Add(func(e *core.AdminAuthEvent) error {
t.EventCalls["OnAdminAuthRequest"]++ return t.registerEventCall("OnAdminAuthRequest")
return nil
}) })
t.OnFileDownloadRequest().Add(func(e *core.FileDownloadEvent) error { t.OnFileDownloadRequest().Add(func(e *core.FileDownloadEvent) error {
t.EventCalls["OnFileDownloadRequest"]++ return t.registerEventCall("OnFileDownloadRequest")
return nil
}) })
return t, nil return t, nil