batched rel references and added test for the batch delete processing
This commit is contained in:
		
							parent
							
								
									0eeae9de80
								
							
						
					
					
						commit
						be3dd42eac
					
				|  | @ -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, | ||||
| 			Url:    "/api/collections/users/records/4q1xlclmfloku33", | ||||
| 			RequestHeaders: map[string]string{ | ||||
|  | @ -693,9 +693,9 @@ func TestRecordCrudDelete(t *testing.T) { | |||
| 			}, | ||||
| 			ExpectedStatus: 204, | ||||
| 			ExpectedEvents: map[string]int{ | ||||
| 				"OnModelAfterDelete":          1, | ||||
| 				"OnModelAfterDelete":          3, // +2 because of the external auths
 | ||||
| 				"OnModelBeforeDelete":         3, // +2 because of the external auths
 | ||||
| 				"OnModelAfterUpdate":          1, | ||||
| 				"OnModelBeforeDelete":         1, | ||||
| 				"OnModelBeforeUpdate":         1, | ||||
| 				"OnRecordAfterDeleteRequest":  1, | ||||
| 				"OnRecordBeforeDeleteRequest": 1, | ||||
|  |  | |||
							
								
								
									
										12
									
								
								daos/base.go
								
								
								
								
							
							
						
						
									
										12
									
								
								daos/base.go
								
								
								
								
							|  | @ -111,7 +111,7 @@ func (dao *Dao) RunInTransaction(fn func(txDao *Dao) error) error { | |||
| 	case *dbx.Tx: | ||||
| 		// nested transactions are not supported by default
 | ||||
| 		// so execute the function within the current transaction
 | ||||
| 
 | ||||
| 		// ---
 | ||||
| 		// create a new dao with the same hooks to avoid semaphore deadlock when nesting
 | ||||
| 		txDao := New(txOrDB) | ||||
| 		txDao.BeforeCreateFunc = dao.BeforeCreateFunc | ||||
|  | @ -320,12 +320,10 @@ Retry: | |||
| 	if attempts == 2 { | ||||
| 		// assign new Dao without the before hooks to avoid triggering
 | ||||
| 		// the already fired before callbacks multiple times
 | ||||
| 		retryDao = &Dao{ | ||||
| 			db:              dao.db, | ||||
| 			AfterCreateFunc: dao.AfterCreateFunc, | ||||
| 			AfterUpdateFunc: dao.AfterUpdateFunc, | ||||
| 			AfterDeleteFunc: dao.AfterDeleteFunc, | ||||
| 		} | ||||
| 		retryDao = New(dao.db) | ||||
| 		retryDao.AfterCreateFunc = dao.AfterCreateFunc | ||||
| 		retryDao.AfterUpdateFunc = dao.AfterUpdateFunc | ||||
| 		retryDao.AfterDeleteFunc = dao.AfterDeleteFunc | ||||
| 	} | ||||
| 
 | ||||
| 	// execute
 | ||||
|  |  | |||
|  | @ -433,21 +433,21 @@ func (dao *Dao) cascadeRecordDelete(mainRecord *models.Record, refs map[*models. | |||
| 					break | ||||
| 				} | ||||
| 
 | ||||
| 				perPage := 200 | ||||
| 				pages := int(math.Ceil(float64(total) / float64(perPage))) | ||||
| 				perWorkers := 50 | ||||
| 				workers := int(math.Ceil(float64(total) / float64(perWorkers))) | ||||
| 
 | ||||
| 				batchErr := func() error { | ||||
| 					ch := make(chan error) | ||||
| 					defer close(ch) | ||||
| 
 | ||||
| 					for i := 0; i < pages; i++ { | ||||
| 					for i := 0; i < workers; i++ { | ||||
| 						var chunks []dbx.NullStringMap | ||||
| 						if len(rows) <= perPage { | ||||
| 							chunks = rows[0:] | ||||
| 						if len(rows) <= perWorkers { | ||||
| 							chunks = rows | ||||
| 							rows = nil | ||||
| 						} else { | ||||
| 							chunks = rows[0:perPage] | ||||
| 							rows = rows[perPage:] | ||||
| 							chunks = rows[:perWorkers] | ||||
| 							rows = rows[perWorkers:] | ||||
| 						} | ||||
| 
 | ||||
| 						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 { | ||||
| 							return err | ||||
| 						} | ||||
|  |  | |||
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							|  | @ -4,7 +4,7 @@ go 1.18 | |||
| 
 | ||||
| require ( | ||||
| 	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/domodwyer/mailyak/v3 v3.3.4 | ||||
| 	github.com/dop251/goja v0.0.0-20221118162653-d4bf6fde1b86 | ||||
|  |  | |||
							
								
								
									
										4
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										4
									
								
								go.sum
								
								
								
								
							|  | @ -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.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.156 h1:3RhbBTZ87HoI5OP2JjcKdd5qOnyo9YOAW8+Bb/h0vSE= | ||||
| github.com/aws/aws-sdk-go v1.44.156/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= | ||||
| github.com/aws/aws-sdk-go v1.44.157 h1:JVBPpEWC8+yA7CbfAuTl/ZFFlHS3yoqWFqxFyTCISwg= | ||||
| 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 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= | ||||
| github.com/aws/aws-sdk-go-v2 v1.17.2 h1:r0yRZInwiPBNpQ4aDy/Ssh3ROWsGtKDwar2JS8Lm+N8= | ||||
|  |  | |||
							
								
								
									
										230
									
								
								tests/app.go
								
								
								
								
							
							
						
						
									
										230
									
								
								tests/app.go
								
								
								
								
							|  | @ -7,6 +7,7 @@ import ( | |||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"runtime" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/pocketbase/pocketbase/core" | ||||
| 	"github.com/pocketbase/pocketbase/tools/mailer" | ||||
|  | @ -16,6 +17,8 @@ import ( | |||
| type TestApp struct { | ||||
| 	*core.BaseApp | ||||
| 
 | ||||
| 	mux sync.Mutex | ||||
| 
 | ||||
| 	// EventCalls defines a map to inspect which app events
 | ||||
| 	// (and how many times) were triggered.
 | ||||
| 	//
 | ||||
|  | @ -42,15 +45,35 @@ func (t *TestApp) Cleanup() { | |||
| } | ||||
| 
 | ||||
| func (t *TestApp) NewMailClient() mailer.Mailer { | ||||
| 	t.mux.Lock() | ||||
| 	defer t.mux.Unlock() | ||||
| 
 | ||||
| 	t.TestMailer.Reset() | ||||
| 
 | ||||
| 	return t.TestMailer | ||||
| } | ||||
| 
 | ||||
| // ResetEventCalls resets the EventCalls counter.
 | ||||
| func (t *TestApp) ResetEventCalls() { | ||||
| 	t.mux.Lock() | ||||
| 	defer t.mux.Unlock() | ||||
| 
 | ||||
| 	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.
 | ||||
| //
 | ||||
| // 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.EventCalls["OnBeforeApiError"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnBeforeApiError") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAfterApiError().Add(func(e *core.ApiErrorEvent) error { | ||||
| 		t.EventCalls["OnAfterApiError"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAfterApiError") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelBeforeCreate().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelBeforeCreate"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelBeforeCreate") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelAfterCreate().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelAfterCreate"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelAfterCreate") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelBeforeUpdate().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelBeforeUpdate"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelBeforeUpdate") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelAfterUpdate().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelAfterUpdate"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelAfterUpdate") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelBeforeDelete().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelBeforeDelete"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelBeforeDelete") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnModelAfterDelete().Add(func(e *core.ModelEvent) error { | ||||
| 		t.EventCalls["OnModelAfterDelete"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnModelAfterDelete") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordsListRequest().Add(func(e *core.RecordsListEvent) error { | ||||
| 		t.EventCalls["OnRecordsListRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordsListRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordViewRequest().Add(func(e *core.RecordViewEvent) error { | ||||
| 		t.EventCalls["OnRecordViewRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordViewRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeCreateRequest().Add(func(e *core.RecordCreateEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeUpdateRequest().Add(func(e *core.RecordUpdateEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterUpdateRequest().Add(func(e *core.RecordUpdateEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeDeleteRequest().Add(func(e *core.RecordDeleteEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterDeleteRequest().Add(func(e *core.RecordDeleteEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAuthRequest().Add(func(e *core.RecordAuthEvent) error { | ||||
| 		t.EventCalls["OnRecordAuthRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAuthRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeRequestPasswordResetRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeRequestPasswordResetRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterRequestPasswordResetRequest().Add(func(e *core.RecordRequestPasswordResetEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterRequestPasswordResetRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterRequestPasswordResetRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeConfirmPasswordResetRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeConfirmPasswordResetRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterConfirmPasswordResetRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterConfirmPasswordResetRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeRequestVerificationRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeRequestVerificationRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterRequestVerificationRequest().Add(func(e *core.RecordRequestVerificationEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterRequestVerificationRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterRequestVerificationRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeConfirmVerificationRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeConfirmVerificationRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterConfirmVerificationRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterConfirmVerificationRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeRequestEmailChangeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeRequestEmailChangeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterRequestEmailChangeRequest().Add(func(e *core.RecordRequestEmailChangeEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterRequestEmailChangeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterRequestEmailChangeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeConfirmEmailChangeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeConfirmEmailChangeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterConfirmEmailChangeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterConfirmEmailChangeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordListExternalAuthsRequest().Add(func(e *core.RecordListExternalAuthsEvent) error { | ||||
| 		t.EventCalls["OnRecordListExternalAuthsRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordListExternalAuthsRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordBeforeUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error { | ||||
| 		t.EventCalls["OnRecordBeforeUnlinkExternalAuthRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordBeforeUnlinkExternalAuthRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRecordAfterUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error { | ||||
| 		t.EventCalls["OnRecordAfterUnlinkExternalAuthRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRecordAfterUnlinkExternalAuthRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerBeforeAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error { | ||||
| 		t.EventCalls["OnMailerBeforeAdminResetPasswordSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerBeforeAdminResetPasswordSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerAfterAdminResetPasswordSend().Add(func(e *core.MailerAdminEvent) error { | ||||
| 		t.EventCalls["OnMailerAfterAdminResetPasswordSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerAfterAdminResetPasswordSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerBeforeRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerBeforeRecordResetPasswordSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerBeforeRecordResetPasswordSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerAfterRecordResetPasswordSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerAfterRecordResetPasswordSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerAfterRecordResetPasswordSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerBeforeRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerBeforeRecordVerificationSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerBeforeRecordVerificationSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerAfterRecordVerificationSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerAfterRecordVerificationSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerAfterRecordVerificationSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerBeforeRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerBeforeRecordChangeEmailSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerBeforeRecordChangeEmailSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnMailerAfterRecordChangeEmailSend().Add(func(e *core.MailerRecordEvent) error { | ||||
| 		t.EventCalls["OnMailerAfterRecordChangeEmailSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnMailerAfterRecordChangeEmailSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeConnectRequest().Add(func(e *core.RealtimeConnectEvent) error { | ||||
| 		t.EventCalls["OnRealtimeConnectRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeConnectRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeDisconnectRequest().Add(func(e *core.RealtimeDisconnectEvent) error { | ||||
| 		t.EventCalls["OnRealtimeDisconnectRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeDisconnectRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeBeforeMessageSend().Add(func(e *core.RealtimeMessageEvent) error { | ||||
| 		t.EventCalls["OnRealtimeBeforeMessageSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeBeforeMessageSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeAfterMessageSend().Add(func(e *core.RealtimeMessageEvent) error { | ||||
| 		t.EventCalls["OnRealtimeAfterMessageSend"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeAfterMessageSend") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeBeforeSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error { | ||||
| 		t.EventCalls["OnRealtimeBeforeSubscribeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeBeforeSubscribeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnRealtimeAfterSubscribeRequest().Add(func(e *core.RealtimeSubscribeEvent) error { | ||||
| 		t.EventCalls["OnRealtimeAfterSubscribeRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnRealtimeAfterSubscribeRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnSettingsListRequest().Add(func(e *core.SettingsListEvent) error { | ||||
| 		t.EventCalls["OnSettingsListRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnSettingsListRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnSettingsBeforeUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error { | ||||
| 		t.EventCalls["OnSettingsBeforeUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnSettingsBeforeUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnSettingsAfterUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error { | ||||
| 		t.EventCalls["OnSettingsAfterUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnSettingsAfterUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionsListRequest().Add(func(e *core.CollectionsListEvent) error { | ||||
| 		t.EventCalls["OnCollectionsListRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionsListRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionViewRequest().Add(func(e *core.CollectionViewEvent) error { | ||||
| 		t.EventCalls["OnCollectionViewRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionViewRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionBeforeCreateRequest().Add(func(e *core.CollectionCreateEvent) error { | ||||
| 		t.EventCalls["OnCollectionBeforeCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionBeforeCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionAfterCreateRequest().Add(func(e *core.CollectionCreateEvent) error { | ||||
| 		t.EventCalls["OnCollectionAfterCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionAfterCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionBeforeUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error { | ||||
| 		t.EventCalls["OnCollectionBeforeUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionBeforeUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionAfterUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error { | ||||
| 		t.EventCalls["OnCollectionAfterUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionAfterUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionBeforeDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error { | ||||
| 		t.EventCalls["OnCollectionBeforeDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionBeforeDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionAfterDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error { | ||||
| 		t.EventCalls["OnCollectionAfterDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionAfterDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionsBeforeImportRequest().Add(func(e *core.CollectionsImportEvent) error { | ||||
| 		t.EventCalls["OnCollectionsBeforeImportRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionsBeforeImportRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnCollectionsAfterImportRequest().Add(func(e *core.CollectionsImportEvent) error { | ||||
| 		t.EventCalls["OnCollectionsAfterImportRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnCollectionsAfterImportRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminsListRequest().Add(func(e *core.AdminsListEvent) error { | ||||
| 		t.EventCalls["OnAdminsListRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminsListRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminViewRequest().Add(func(e *core.AdminViewEvent) error { | ||||
| 		t.EventCalls["OnAdminViewRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminViewRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminBeforeCreateRequest().Add(func(e *core.AdminCreateEvent) error { | ||||
| 		t.EventCalls["OnAdminBeforeCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminBeforeCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminAfterCreateRequest().Add(func(e *core.AdminCreateEvent) error { | ||||
| 		t.EventCalls["OnAdminAfterCreateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminAfterCreateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminBeforeUpdateRequest().Add(func(e *core.AdminUpdateEvent) error { | ||||
| 		t.EventCalls["OnAdminBeforeUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminBeforeUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminAfterUpdateRequest().Add(func(e *core.AdminUpdateEvent) error { | ||||
| 		t.EventCalls["OnAdminAfterUpdateRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminAfterUpdateRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminBeforeDeleteRequest().Add(func(e *core.AdminDeleteEvent) error { | ||||
| 		t.EventCalls["OnAdminBeforeDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminBeforeDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminAfterDeleteRequest().Add(func(e *core.AdminDeleteEvent) error { | ||||
| 		t.EventCalls["OnAdminAfterDeleteRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminAfterDeleteRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnAdminAuthRequest().Add(func(e *core.AdminAuthEvent) error { | ||||
| 		t.EventCalls["OnAdminAuthRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnAdminAuthRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	t.OnFileDownloadRequest().Add(func(e *core.FileDownloadEvent) error { | ||||
| 		t.EventCalls["OnFileDownloadRequest"]++ | ||||
| 		return nil | ||||
| 		return t.registerEventCall("OnFileDownloadRequest") | ||||
| 	}) | ||||
| 
 | ||||
| 	return t, nil | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue