added WithConfig factory to all forms

This commit is contained in:
Gani Georgiev
2022-08-07 15:38:21 +03:00
parent b0ca9b2f1b
commit a426484916
18 changed files with 542 additions and 195 deletions

View File

@@ -16,7 +16,6 @@ import (
"github.com/pocketbase/pocketbase/forms/validators"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/models/schema"
"github.com/pocketbase/pocketbase/tools/filesystem"
"github.com/pocketbase/pocketbase/tools/list"
"github.com/pocketbase/pocketbase/tools/rest"
"github.com/spf13/cast"
@@ -36,25 +35,21 @@ type RecordUpsert struct {
// RecordUpsertConfig is the [RecordUpsert] factory initializer config.
//
// NB! Dao and FilesystemFactory are required struct members.
// NB! App is required struct member.
type RecordUpsertConfig struct {
Dao *daos.Dao
FilesystemFactory func() (*filesystem.System, error)
IsDebug bool
App core.App
TxDao *daos.Dao
}
// NewRecordUpsert creates a new [RecordUpsert] form with initializer
// config created from the provided [core.App] and [models.Record] instances
// (for create you could pass a pointer to an empty Record - `&models.Record{}`).
//
// This factory method is used primarily for convenience (and backward compatibility).
// If you want to submit the form as part of another transaction, use
// [NewRecordUpsertWithConfig] with Dao configured to your txDao.
// [NewRecordUpsertWithConfig] with explicitly set TxDao.
func NewRecordUpsert(app core.App, record *models.Record) *RecordUpsert {
return NewRecordUpsertWithConfig(RecordUpsertConfig{
Dao: app.Dao(),
FilesystemFactory: app.NewFilesystem,
IsDebug: app.IsDebug(),
App: app,
}, record)
}
@@ -69,12 +64,14 @@ func NewRecordUpsertWithConfig(config RecordUpsertConfig, record *models.Record)
filesToUpload: []*rest.UploadedFile{},
}
if form.config.Dao == nil ||
form.config.FilesystemFactory == nil ||
form.record == nil {
if form.config.App == nil || form.record == nil {
panic("Invalid initializer config or nil upsert model.")
}
if form.config.TxDao == nil {
form.config.TxDao = form.config.App.Dao()
}
form.Id = record.Id
form.Data = map[string]any{}
@@ -240,7 +237,7 @@ func (form *RecordUpsert) LoadData(r *http.Request) error {
// check if there are any new uploaded form files
files, err := rest.FindUploadedFiles(r, key)
if err != nil {
if form.config.IsDebug {
if form.config.App.IsDebug() {
log.Printf("%q uploaded file error: %v\n", key, err)
}
@@ -288,7 +285,7 @@ func (form *RecordUpsert) Validate() error {
// record data validator
dataValidator := validators.NewRecordDataValidator(
form.config.Dao,
form.config.TxDao,
form.record,
form.filesToUpload,
)
@@ -316,7 +313,7 @@ func (form *RecordUpsert) DrySubmit(callback func(txDao *daos.Dao) error) error
return err
}
return form.config.Dao.RunInTransaction(func(txDao *daos.Dao) error {
return form.config.TxDao.RunInTransaction(func(txDao *daos.Dao) error {
tx, ok := txDao.DB().(*dbx.Tx)
if !ok {
return errors.New("failed to get transaction db")
@@ -356,7 +353,7 @@ func (form *RecordUpsert) Submit(interceptors ...InterceptorFunc) error {
}
return runInterceptors(func() error {
return form.config.Dao.RunInTransaction(func(txDao *daos.Dao) error {
return form.config.TxDao.RunInTransaction(func(txDao *daos.Dao) error {
// persist record model
if err := txDao.SaveRecord(form.record); err != nil {
return err
@@ -387,7 +384,7 @@ func (form *RecordUpsert) processFilesToUpload() error {
return errors.New("The record is not persisted yet.")
}
fs, err := form.config.FilesystemFactory()
fs, err := form.config.App.NewFilesystem()
if err != nil {
return err
}
@@ -423,7 +420,7 @@ func (form *RecordUpsert) processFilesToDelete() error {
return errors.New("The record is not persisted yet.")
}
fs, err := form.config.FilesystemFactory()
fs, err := form.config.App.NewFilesystem()
if err != nil {
return err
}