99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package forms
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/pocketbase/pocketbase/core"
 | |
| 	"github.com/pocketbase/pocketbase/daos"
 | |
| 	"github.com/pocketbase/pocketbase/models"
 | |
| )
 | |
| 
 | |
| // SettingsUpsert specifies a [core.Settings] upsert (create/update) form.
 | |
| type SettingsUpsert struct {
 | |
| 	*core.Settings
 | |
| 
 | |
| 	config SettingsUpsertConfig
 | |
| }
 | |
| 
 | |
| // SettingsUpsertConfig is the [SettingsUpsert] factory initializer config.
 | |
| //
 | |
| // NB! App is required struct member.
 | |
| type SettingsUpsertConfig struct {
 | |
| 	App     core.App
 | |
| 	Dao     *daos.Dao
 | |
| 	LogsDao *daos.Dao
 | |
| }
 | |
| 
 | |
| // NewSettingsUpsert creates a new [SettingsUpsert] form with initializer
 | |
| // config created from the provided [core.App] instance.
 | |
| //
 | |
| // If you want to submit the form as part of another transaction, use
 | |
| // [NewSettingsUpsertWithConfig] with explicitly set Dao.
 | |
| func NewSettingsUpsert(app core.App) *SettingsUpsert {
 | |
| 	return NewSettingsUpsertWithConfig(SettingsUpsertConfig{
 | |
| 		App: app,
 | |
| 	})
 | |
| }
 | |
| 
 | |
| // NewSettingsUpsertWithConfig creates a new [SettingsUpsert] form
 | |
| // with the provided config or panics on invalid configuration.
 | |
| func NewSettingsUpsertWithConfig(config SettingsUpsertConfig) *SettingsUpsert {
 | |
| 	form := &SettingsUpsert{config: config}
 | |
| 
 | |
| 	if form.config.App == nil {
 | |
| 		panic("Missing required config.App instance.")
 | |
| 	}
 | |
| 
 | |
| 	if form.config.Dao == nil {
 | |
| 		form.config.Dao = form.config.App.Dao()
 | |
| 	}
 | |
| 
 | |
| 	if form.config.LogsDao == nil {
 | |
| 		form.config.LogsDao = form.config.App.LogsDao()
 | |
| 	}
 | |
| 
 | |
| 	// load the application settings into the form
 | |
| 	form.Settings, _ = config.App.Settings().Clone()
 | |
| 
 | |
| 	return form
 | |
| }
 | |
| 
 | |
| // Validate makes the form validatable by implementing [validation.Validatable] interface.
 | |
| func (form *SettingsUpsert) Validate() error {
 | |
| 	return form.Settings.Validate()
 | |
| }
 | |
| 
 | |
| // Submit validates the form and upserts the loaded settings.
 | |
| //
 | |
| // On success the app settings will be refreshed with the form ones.
 | |
| //
 | |
| // You can optionally provide a list of InterceptorFunc to further
 | |
| // modify the form behavior before persisting it.
 | |
| func (form *SettingsUpsert) Submit(interceptors ...InterceptorFunc) error {
 | |
| 	if err := form.Validate(); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	encryptionKey := os.Getenv(form.config.App.EncryptionEnv())
 | |
| 
 | |
| 	return runInterceptors(func() error {
 | |
| 		saveErr := form.config.Dao.SaveParam(
 | |
| 			models.ParamAppSettings,
 | |
| 			form.Settings,
 | |
| 			encryptionKey,
 | |
| 		)
 | |
| 		if saveErr != nil {
 | |
| 			return saveErr
 | |
| 		}
 | |
| 
 | |
| 		// explicitly trigger old logs deletion
 | |
| 		form.config.LogsDao.DeleteOldRequests(
 | |
| 			time.Now().AddDate(0, 0, -1*form.Settings.Logs.MaxDays),
 | |
| 		)
 | |
| 
 | |
| 		// merge the application settings with the form ones
 | |
| 		return form.config.App.Settings().Merge(form.Settings)
 | |
| 	}, interceptors...)
 | |
| }
 |