Initial commit
This commit is contained in:
104
skills/pocketbase/references/go/go_event_hooks.md
Normal file
104
skills/pocketbase/references/go/go_event_hooks.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user