mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-19 22:19:23 +02:00
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package core
|
|
|
|
// -------------------------------------------------------------------
|
|
// This is a small optimization ported from the [ongoing refactoring branch](https://github.com/pocketbase/pocketbase/discussions/4355).
|
|
//
|
|
// @todo remove after the refactoring is finalized.
|
|
// -------------------------------------------------------------------
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/pocketbase/pocketbase/models"
|
|
)
|
|
|
|
const storeCachedCollectionsKey = "@cachedCollectionsContext"
|
|
|
|
func registerCachedCollectionsAppHooks(app App) {
|
|
collectionsChangeFunc := func(e *ModelEvent) error {
|
|
if _, ok := e.Model.(*models.Collection); !ok {
|
|
return nil
|
|
}
|
|
|
|
_ = ReloadCachedCollections(app)
|
|
|
|
return nil
|
|
}
|
|
app.OnModelAfterCreate().Add(collectionsChangeFunc)
|
|
app.OnModelAfterUpdate().Add(collectionsChangeFunc)
|
|
app.OnModelAfterDelete().Add(collectionsChangeFunc)
|
|
app.OnBeforeServe().Add(func(e *ServeEvent) error {
|
|
_ = ReloadCachedCollections(e.App)
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func ReloadCachedCollections(app App) error {
|
|
collections := []*models.Collection{}
|
|
|
|
err := app.Dao().CollectionQuery().All(&collections)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
app.Store().Set(storeCachedCollectionsKey, collections)
|
|
|
|
return nil
|
|
}
|
|
|
|
func FindCachedCollectionByNameOrId(app App, nameOrId string) (*models.Collection, error) {
|
|
// retrieve from the app cache
|
|
// ---
|
|
collections, _ := app.Store().Get(storeCachedCollectionsKey).([]*models.Collection)
|
|
for _, c := range collections {
|
|
if strings.EqualFold(c.Name, nameOrId) || c.Id == nameOrId {
|
|
return c, nil
|
|
}
|
|
}
|
|
|
|
// retrieve from the database
|
|
// ---
|
|
found, err := app.Dao().FindCollectionByNameOrId(nameOrId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = ReloadCachedCollections(app)
|
|
if err != nil {
|
|
app.Logger().Warn("Failed to reload collections cache", "error", err)
|
|
}
|
|
|
|
return found, nil
|
|
}
|