You've already forked pocketbase
							
							
				mirror of
				https://github.com/pocketbase/pocketbase.git
				synced 2025-10-31 08:37:38 +02:00 
			
		
		
		
	[#78] enable fully qualified URIs for S3 endpoints and improved error reporting when uploading or deleting files
This commit is contained in:
		| @@ -255,7 +255,7 @@ type S3Config struct { | ||||
| // Validate makes S3Config validatable by implementing [validation.Validatable] interface. | ||||
| func (c S3Config) Validate() error { | ||||
| 	return validation.ValidateStruct(&c, | ||||
| 		validation.Field(&c.Endpoint, is.Host, validation.When(c.Enabled, validation.Required)), | ||||
| 		validation.Field(&c.Endpoint, is.URL, validation.When(c.Enabled, validation.Required)), | ||||
| 		validation.Field(&c.Bucket, validation.When(c.Enabled, validation.Required)), | ||||
| 		validation.Field(&c.Region, validation.When(c.Enabled, validation.Required)), | ||||
| 		validation.Field(&c.AccessKey, validation.When(c.Enabled, validation.Required)), | ||||
|   | ||||
| @@ -315,7 +315,19 @@ func TestS3ConfigValidate(t *testing.T) { | ||||
| 			}, | ||||
| 			true, | ||||
| 		}, | ||||
| 		// valid data | ||||
| 		// valid data (url endpoint) | ||||
| 		{ | ||||
| 			core.S3Config{ | ||||
| 				Enabled:   true, | ||||
| 				Endpoint:  "https://localhost:8090", | ||||
| 				Bucket:    "test", | ||||
| 				Region:    "test", | ||||
| 				AccessKey: "test", | ||||
| 				Secret:    "test", | ||||
| 			}, | ||||
| 			false, | ||||
| 		}, | ||||
| 		// valid data (hostname endpoint) | ||||
| 		{ | ||||
| 			core.S3Config{ | ||||
| 				Enabled:   true, | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package forms | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| @@ -316,17 +317,22 @@ func (form *RecordUpsert) processFilesToUpload() error { | ||||
| 	} | ||||
| 	defer fs.Close() | ||||
|  | ||||
| 	var uploadErrors []error | ||||
| 	for i := len(form.filesToUpload) - 1; i >= 0; i-- { | ||||
| 		file := form.filesToUpload[i] | ||||
| 		path := form.record.BaseFilesPath() + "/" + file.Name() | ||||
|  | ||||
| 		if err := fs.Upload(file.Bytes(), path); err == nil { | ||||
| 			// remove the uploaded file from the list | ||||
| 			form.filesToUpload = append(form.filesToUpload[:i], form.filesToUpload[i+1:]...) | ||||
| 		} else { | ||||
| 			// store the upload error | ||||
| 			uploadErrors = append(uploadErrors, fmt.Errorf("File %d: %v", i, err)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(form.filesToUpload) > 0 { | ||||
| 		return errors.New("Failed to upload all files.") | ||||
| 	if len(uploadErrors) > 0 { | ||||
| 		return fmt.Errorf("Failed to upload all files: %v", uploadErrors) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| @@ -347,20 +353,25 @@ func (form *RecordUpsert) processFilesToDelete() error { | ||||
| 	} | ||||
| 	defer fs.Close() | ||||
|  | ||||
| 	var deleteErrors []error | ||||
| 	for i := len(form.filesToDelete) - 1; i >= 0; i-- { | ||||
| 		filename := form.filesToDelete[i] | ||||
| 		path := form.record.BaseFilesPath() + "/" + filename | ||||
|  | ||||
| 		if err := fs.Delete(path); err == nil { | ||||
| 			// remove the deleted file from the list | ||||
| 			form.filesToDelete = append(form.filesToDelete[:i], form.filesToDelete[i+1:]...) | ||||
| 		} else { | ||||
| 			// store the delete error | ||||
| 			deleteErrors = append(deleteErrors, fmt.Errorf("File %d: %v", i, err)) | ||||
| 		} | ||||
|  | ||||
| 		// try to delete the related file thumbs (if any) | ||||
| 		fs.DeletePrefix(form.record.BaseFilesPath() + "/thumbs_" + filename + "/") | ||||
| 	} | ||||
|  | ||||
| 	if len(form.filesToDelete) > 0 { | ||||
| 		return errors.New("Failed to delete all files.") | ||||
| 	if len(deleteErrors) > 0 { | ||||
| 		return fmt.Errorf("Failed to delete all files: %v", deleteErrors) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
|   | ||||
		Reference in New Issue
	
	Block a user