diff --git a/forms/record_upsert.go b/forms/record_upsert.go index 46dcc93e..a429b047 100644 --- a/forms/record_upsert.go +++ b/forms/record_upsert.go @@ -235,6 +235,16 @@ func (form *RecordUpsert) LoadRequest(r *http.Request, keyPrefix string) error { return nil } +// FilesToUpload returns the parsed request files ready for upload. +func (form *RecordUpsert) FilesToUpload() map[string][]*filesystem.File { + return form.filesToUpload +} + +// FilesToUpload returns the parsed request filenames ready to be deleted. +func (form *RecordUpsert) FilesToDelete() []string { + return form.filesToDelete +} + // AddFiles adds the provided file(s) to the specified file field. // // If the file field is a SINGLE-value file field (aka. "Max Select = 1"), @@ -731,21 +741,16 @@ func (form *RecordUpsert) Submit(interceptors ...InterceptorFunc[*models.Record] form.record.MarkAsNew() } + // persist the record model + if saveErr := form.dao.SaveRecord(form.record); saveErr != nil { + return fmt.Errorf("failed to save the record: %w", saveErr) + } + // upload new files (if any) if err := form.processFilesToUpload(); err != nil { return fmt.Errorf("failed to process the uploaded files: %w", err) } - // persist the record model - if saveErr := form.dao.SaveRecord(form.record); saveErr != nil { - // try to cleanup the successfully uploaded files - if _, err := form.deleteFilesByNamesList(form.getFilesToUploadNames()); err != nil && form.app.IsDebug() { - log.Println(err) - } - - return fmt.Errorf("failed to save the record: %w", saveErr) - } - // delete old files (if any) // // for now fail silently to avoid reupload when `form.Submit()` diff --git a/forms/record_upsert_test.go b/forms/record_upsert_test.go index d1babdfb..64b7fe6e 100644 --- a/forms/record_upsert_test.go +++ b/forms/record_upsert_test.go @@ -979,11 +979,33 @@ func TestRecordUpsertAddAndRemoveFiles(t *testing.T) { t.Fatal(err) } + removed0 := "test_d61b33QdDU.txt" // replaced + removed1 := "300_WlbFWSGmW9.png" + removed2 := "logo_vcfJJG5TAh.svg" + form.AddFiles("file_one", f1) // should replace the existin file form.AddFiles("file_many", f2, f3) // should append - form.RemoveFiles("file_many", "300_WlbFWSGmW9.png", "logo_vcfJJG5TAh.svg") // should remove + form.RemoveFiles("file_many", removed1, removed2) // should remove + + filesToUpload := form.FilesToUpload() + if v, ok := filesToUpload["file_one"]; !ok || len(v) != 1 { + t.Fatalf("Expected filesToUpload[file_one] to have exactly 1 file, got %v", v) + } + if v, ok := filesToUpload["file_many"]; !ok || len(v) != 2 { + t.Fatalf("Expected filesToUpload[file_many] to have exactly 2 file, got %v", v) + } + + filesToDelete := form.FilesToDelete() + if len(filesToDelete) != 3 { + t.Fatalf("Expected exactly 2 file to delete, got %v", filesToDelete) + } + for _, f := range []string{removed0, removed1, removed2} { + if !list.ExistInSlice(f, filesToDelete) { + t.Fatalf("Missing file %q from filesToDelete %v", f, filesToDelete) + } + } if err := form.Submit(); err != nil { t.Fatalf("Failed to submit the RecordUpsert form, got %v", err) @@ -995,14 +1017,14 @@ func TestRecordUpsertAddAndRemoveFiles(t *testing.T) { } // ensure files deletion - if hasRecordFile(app, recordAfter, "test_d61b33QdDU.txt") { + if hasRecordFile(app, recordAfter, removed0) { t.Fatalf("Expected the old file_one file to be deleted") } - if hasRecordFile(app, recordAfter, "300_WlbFWSGmW9.png") { - t.Fatalf("Expected 300_WlbFWSGmW9.png to be deleted") + if hasRecordFile(app, recordAfter, removed1) { + t.Fatalf("Expected %s to be deleted", removed1) } - if hasRecordFile(app, recordAfter, "logo_vcfJJG5TAh.svg") { - t.Fatalf("Expected logo_vcfJJG5TAh.svg to be deleted") + if hasRecordFile(app, recordAfter, removed2) { + t.Fatalf("Expected %s to be deleted", removed2) } fileOne := recordAfter.GetStringSlice("file_one")