mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-01-10 00:43:36 +02:00
86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package forms
|
|
|
|
import (
|
|
"context"
|
|
|
|
validation "github.com/go-ozzo/ozzo-validation/v4"
|
|
"github.com/pocketbase/pocketbase/core"
|
|
"github.com/pocketbase/pocketbase/forms/validators"
|
|
"github.com/pocketbase/pocketbase/tools/filesystem"
|
|
)
|
|
|
|
// BackupUpload is a request form for uploading a new app backup.
|
|
type BackupUpload struct {
|
|
app core.App
|
|
ctx context.Context
|
|
|
|
File *filesystem.File `json:"file"`
|
|
}
|
|
|
|
// NewBackupUpload creates new BackupUpload request form.
|
|
func NewBackupUpload(app core.App) *BackupUpload {
|
|
return &BackupUpload{
|
|
app: app,
|
|
ctx: context.Background(),
|
|
}
|
|
}
|
|
|
|
// SetContext replaces the default form upload context with the provided one.
|
|
func (form *BackupUpload) SetContext(ctx context.Context) {
|
|
form.ctx = ctx
|
|
}
|
|
|
|
// Validate makes the form validatable by implementing [validation.Validatable] interface.
|
|
func (form *BackupUpload) Validate() error {
|
|
return validation.ValidateStruct(form,
|
|
validation.Field(
|
|
&form.File,
|
|
validation.Required,
|
|
validation.By(validators.UploadedFileMimeType([]string{"application/zip"})),
|
|
validation.By(form.checkUniqueName),
|
|
),
|
|
)
|
|
}
|
|
|
|
func (form *BackupUpload) checkUniqueName(value any) error {
|
|
v, _ := value.(*filesystem.File)
|
|
if v == nil {
|
|
return nil // nothing to check
|
|
}
|
|
|
|
fsys, err := form.app.NewBackupsFilesystem()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer fsys.Close()
|
|
|
|
fsys.SetContext(form.ctx)
|
|
|
|
if exists, err := fsys.Exists(v.OriginalName); err != nil || exists {
|
|
return validation.NewError("validation_backup_name_exists", "Backup file with the specified name already exists.")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Submit validates the form and upload the backup file.
|
|
//
|
|
// You can optionally provide a list of InterceptorFunc to further
|
|
// modify the form behavior before uploading the backup.
|
|
func (form *BackupUpload) Submit(interceptors ...InterceptorFunc[*filesystem.File]) error {
|
|
if err := form.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return runInterceptors(form.File, func(file *filesystem.File) error {
|
|
fsys, err := form.app.NewBackupsFilesystem()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fsys.SetContext(form.ctx)
|
|
|
|
return fsys.UploadFile(file, file.OriginalName)
|
|
}, interceptors...)
|
|
}
|