From 8317ae2e6bdaf429d18b5d699e9e2995fb635ba8 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Thu, 13 Apr 2023 22:37:10 +0300 Subject: [PATCH 1/2] [#2287] fixed unique field detailed error not being returned on DrySubmit failure --- CHANGELOG.md | 2 ++ apis/record_crud_test.go | 14 ++++++++++++++ forms/record_upsert.go | 8 ++------ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce9604ab..d7fade27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ - Added checks for `nil` hooks in `forms.RecordUpsert` when used with custom `Dao` ([#2277](https://github.com/pocketbase/pocketbase/issues/2277)). +- Fixed unique detailed field error not returned on record create failure ([#2287](https://github.com/pocketbase/pocketbase/discussions/2287)). + ## v0.14.4 diff --git a/apis/record_crud_test.go b/apis/record_crud_test.go index 130e613d..4af92795 100644 --- a/apis/record_crud_test.go +++ b/apis/record_crud_test.go @@ -1173,6 +1173,20 @@ func TestRecordCrudCreate(t *testing.T) { "OnModelAfterCreate": 1, }, }, + { + Name: "unique field error check", + Method: http.MethodPost, + Url: "/api/collections/demo2/records", + Body: strings.NewReader(`{ + "title":"test2" + }`), + ExpectedStatus: 400, + ExpectedContent: []string{ + `"data":{`, + `"title":{`, + `"code":"validation_not_unique"`, + }, + }, // ID checks // ----------------------------------------------------------- diff --git a/forms/record_upsert.go b/forms/record_upsert.go index daf38d29..bce3cb32 100644 --- a/forms/record_upsert.go +++ b/forms/record_upsert.go @@ -707,7 +707,7 @@ func (form *RecordUpsert) DrySubmit(callback func(txDao *daos.Dao) error) error defer tx.Rollback() if err := txDao.SaveRecord(form.record); err != nil { - return err + return form.prepareError(err) } // restore record isNew state @@ -779,11 +779,7 @@ func (form *RecordUpsert) Submit(interceptors ...InterceptorFunc[*models.Record] // persist the record model if err := dao.SaveRecord(form.record); err != nil { - preparedErr := form.prepareError(err) - if _, ok := preparedErr.(validation.Errors); ok { - return preparedErr - } - return fmt.Errorf("failed to save the record: %w", err) + return form.prepareError(err) } // delete old files (if any) From ac4a961a1070214a73bedf98d0905aca4ab86289 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Thu, 13 Apr 2023 23:04:24 +0300 Subject: [PATCH 2/2] added unique error test for the record update api --- apis/record_crud_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apis/record_crud_test.go b/apis/record_crud_test.go index 4af92795..1fa16b01 100644 --- a/apis/record_crud_test.go +++ b/apis/record_crud_test.go @@ -1761,6 +1761,24 @@ func TestRecordCrudUpdate(t *testing.T) { `"id":{"code":"validation_in_invalid"`, }, }, + { + Name: "unique field error check", + Method: http.MethodPatch, + Url: "/api/collections/demo2/records/llvuca81nly1qls", + Body: strings.NewReader(`{ + "title":"test2" + }`), + ExpectedStatus: 400, + ExpectedContent: []string{ + `"data":{`, + `"title":{`, + `"code":"validation_not_unique"`, + }, + ExpectedEvents: map[string]int{ + "OnRecordBeforeUpdateRequest": 1, + "OnModelBeforeUpdate": 1, + }, + }, // check whether if @request.data modifer fields are properly resolved // -----------------------------------------------------------