105 lines
2.7 KiB
Markdown
105 lines
2.7 KiB
Markdown
# 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 creation
|
|
- `OnRecordUpdate()` - Before/after record updates
|
|
- `OnRecordDelete()` - Before/after record deletion
|
|
- `OnRecordList()` - Before/after listing records
|
|
- `OnRecordView()` - Before/after viewing a record
|
|
|
|
### Auth Hooks
|
|
- `OnRecordAuth()` - After authentication
|
|
- `OnRecordAuthWithPassword()` - Password authentication
|
|
- `OnRecordAuthWithOAuth2()` - OAuth2 authentication
|
|
- `OnRecordRequestPasswordReset()` - Password reset request
|
|
- `OnRecordConfirmPasswordReset()` - Password reset confirmation
|
|
|
|
### Serve Hooks
|
|
- `OnServe()` - Customize the HTTP server before it starts serving requests
|
|
- `OnTerminate()` - Handle graceful shutdown logic
|
|
|
|
## Examples
|
|
|
|
### Auto-populate Fields
|
|
|
|
```go
|
|
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
|
|
|
|
```go
|
|
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
|
|
|
|
```go
|
|
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](go_overview.md) for detailed hook documentation.
|