allow mixing existing file names and new uploaded files
This commit is contained in:
		
							parent
							
								
									52c64318c5
								
							
						
					
					
						commit
						d919d55b5e
					
				|  | @ -13,6 +13,7 @@ import ( | ||||||
| 	"github.com/pocketbase/pocketbase/core" | 	"github.com/pocketbase/pocketbase/core" | ||||||
| 	"github.com/pocketbase/pocketbase/forms" | 	"github.com/pocketbase/pocketbase/forms" | ||||||
| 	"github.com/pocketbase/pocketbase/tools/filesystem" | 	"github.com/pocketbase/pocketbase/tools/filesystem" | ||||||
|  | 	"github.com/pocketbase/pocketbase/tools/list" | ||||||
| 	"github.com/pocketbase/pocketbase/tools/router" | 	"github.com/pocketbase/pocketbase/tools/router" | ||||||
| 	"github.com/pocketbase/pocketbase/tools/search" | 	"github.com/pocketbase/pocketbase/tools/search" | ||||||
| ) | ) | ||||||
|  | @ -561,9 +562,28 @@ func recordDataFromRequest(e *core.RequestEvent, record *core.Record) (map[strin | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	if len(uploadedFiles) > 0 { | 	if len(uploadedFiles) > 0 { | ||||||
| 		for k, v := range uploadedFiles { | 		for k, files := range uploadedFiles { | ||||||
| 			result[k] = v | 			uploaded := make([]any, 0, len(files)) | ||||||
|  | 
 | ||||||
|  | 			// if not remove/prepend/append -> merge with the submitted
 | ||||||
|  | 			// info.Body values to prevent accidental old files deletion
 | ||||||
|  | 			if info.Body[k] != nil && | ||||||
|  | 				!strings.HasPrefix(k, "+") && | ||||||
|  | 				!strings.HasSuffix(k, "+") && | ||||||
|  | 				!strings.HasSuffix(k, "-") { | ||||||
|  | 				existing := list.ToUniqueStringSlice(info.Body[k]) | ||||||
|  | 				for _, name := range existing { | ||||||
|  | 					uploaded = append(uploaded, name) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			for _, file := range files { | ||||||
|  | 				uploaded = append(uploaded, file) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			result[k] = uploaded | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		result = record.ReplaceModifiers(result) | 		result = record.ReplaceModifiers(result) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2345,7 +2345,7 @@ func TestRecordCrudUpdate(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	formData3, mp3, err3 := tests.MockMultipartData(map[string]string{ | 	formData3, mp3, err3 := tests.MockMultipartData(map[string]string{ | ||||||
| 		router.JSONPayloadKey: `{"title": "title_test3", "testPayload": 123}`, | 		router.JSONPayloadKey: `{"title": "title_test3", "testPayload": 123, "files":"300_JdfBOieXAW.png"}`, | ||||||
| 	}, "files") | 	}, "files") | ||||||
| 	if err3 != nil { | 	if err3 != nil { | ||||||
| 		t.Fatal(err3) | 		t.Fatal(err3) | ||||||
|  | @ -2686,6 +2686,8 @@ func TestRecordCrudUpdate(t *testing.T) { | ||||||
| 				`"id":"mk5fmymtx4wsprk"`, | 				`"id":"mk5fmymtx4wsprk"`, | ||||||
| 				`"title":"title_test3"`, | 				`"title":"title_test3"`, | ||||||
| 				`"files":["`, | 				`"files":["`, | ||||||
|  | 				`"300_JdfBOieXAW.png"`, | ||||||
|  | 				`"tmpfile_`, | ||||||
| 			}, | 			}, | ||||||
| 			ExpectedEvents: map[string]int{ | 			ExpectedEvents: map[string]int{ | ||||||
| 				"*":                          0, | 				"*":                          0, | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue