2.7 KiB
2.7 KiB
Event Hooks - Go Extensions
Overview
Event hooks allow you to execute custom logic when specific events occur in PocketBase, such as record creation, updates, authentication, or API requests.
Hook Types
Record Hooks
OnRecordCreate()- Before/after record creationOnRecordUpdate()- Before/after record updatesOnRecordDelete()- Before/after record deletionOnRecordList()- Before/after listing recordsOnRecordView()- Before/after viewing a record
Auth Hooks
OnRecordAuth()- After authenticationOnRecordAuthWithPassword()- Password authenticationOnRecordAuthWithOAuth2()- OAuth2 authenticationOnRecordRequestPasswordReset()- Password reset requestOnRecordConfirmPasswordReset()- Password reset confirmation
Serve Hooks
OnServe()- Customize the HTTP server before it starts serving requestsOnTerminate()- Handle graceful shutdown logic
Examples
Auto-populate Fields
app.OnRecordCreateRequest("posts").BindFunc(func(e *core.RecordRequestEvent) error {
if e.Auth != nil {
e.Record.Set("author", e.Auth.Id)
}
title := e.Record.GetString("title")
slug := strings.ToLower(strings.ReplaceAll(title, " ", "-"))
e.Record.Set("slug", slug)
return e.Next()
})
Validation
import "github.com/pocketbase/dbx"
app.OnRecordCreate("posts").BindFunc(func(e *core.RecordCreateEvent) error {
title := e.Record.GetString("title")
if len(title) < 5 {
return errors.New("title must be at least 5 characters")
}
if _, err := e.App.FindFirstRecordByFilter(
"posts",
"title = {:title}",
dbx.Params{"title": title},
); err == nil {
return errors.New("title already exists")
}
return e.Next()
})
Cascading Updates
import "github.com/pocketbase/dbx"
app.OnRecordUpdate("posts").BindFunc(func(e *core.RecordUpdateEvent) error {
oldStatus := e.RecordOriginal.GetString("status")
newStatus := e.Record.GetString("status")
if oldStatus != "published" && newStatus == "published" {
comments, err := e.App.FindRecordsByFilter(
"comments",
"post = {:postId}",
"",
0,
0,
dbx.Params{"postId": e.Record.Id},
)
if err != nil {
return err
}
for _, comment := range comments {
comment.Set("status", "approved")
if err := e.App.Save(comment); err != nil {
return err
}
}
}
return e.Next()
})
Note: This is a placeholder file. See go_overview.md for detailed hook documentation.