From 1af9c76337f45624b2f856b9b8a1b0e113899cfa Mon Sep 17 00:00:00 2001 From: Hein Date: Thu, 4 Jun 2026 18:23:18 +0200 Subject: [PATCH] fix(handler): fetch updated record after transaction commits --- pkg/restheadspec/handler.go | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/pkg/restheadspec/handler.go b/pkg/restheadspec/handler.go index 99fa00d..d734698 100644 --- a/pkg/restheadspec/handler.go +++ b/pkg/restheadspec/handler.go @@ -1480,18 +1480,7 @@ func (h *Handler) handleUpdate(ctx context.Context, w common.ResponseWriter, id } } - // Fetch the updated record to return the new values - modelValue := reflect.New(reflect.TypeOf(model)).Interface() - selectQuery = tx.NewSelect().Model(modelValue).Where(fmt.Sprintf("%s = ?", common.QuoteIdent(pkName)), targetID) - if err := selectQuery.ScanModel(ctx); err != nil { - return fmt.Errorf("failed to fetch updated record: %w", err) - } - - updatedRecord = modelValue - - // Store result for hooks - hookCtx.Result = updatedRecord - _ = result // Keep result variable for potential future use + _ = result return nil }) @@ -1501,6 +1490,16 @@ func (h *Handler) handleUpdate(ctx context.Context, w common.ResponseWriter, id return } + // Fetch the updated record after the transaction commits to capture any trigger changes + fetchedRecord := reflect.New(reflect.TypeOf(model)).Interface() + selectQuery := h.db.NewSelect().Model(fetchedRecord).Where(fmt.Sprintf("%s = ?", common.QuoteIdent(pkName)), targetID) + if err := selectQuery.ScanModel(ctx); err != nil { + logger.Error("Failed to fetch updated record: %v", err) + h.sendError(w, http.StatusInternalServerError, "fetch_error", "Failed to fetch updated record", err) + return + } + updatedRecord = fetchedRecord + // Merge the updated record with the original request data // This preserves extra keys from the request and updates values from the database mergedData := h.mergeRecordWithRequest(updatedRecord, dataMap)