From 0c1330fc6e0819f982402cc7c237da8295004cc7 Mon Sep 17 00:00:00 2001 From: yaroslav8765 Date: Fri, 30 Jan 2026 08:45:07 +0200 Subject: [PATCH 1/2] fix: rename newRecordId param in createResourceRecord to redirectToRecordId (newRecordId is deprecated) --- adminforth/index.ts | 14 +++++++++----- adminforth/modules/restApi.ts | 2 +- adminforth/types/Back.ts | 27 +++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/adminforth/index.ts b/adminforth/index.ts index cbc5ebb0..1191f4ec 100644 --- a/adminforth/index.ts +++ b/adminforth/index.ts @@ -568,17 +568,21 @@ class AdminForth implements IAdminForth { response, extra, }); - if (!resp || (typeof resp.ok !== 'boolean' && (!resp.error && !resp.newRecordId))) { + if (resp.newRecordId) { + afLogger.warn(`Deprecation warning: beforeSave hook returned 'newRecordId'. Since AdminForth v1.2.9 use 'redirectToRecordId' instead. 'newRecordId' will be removed in v2.0.0`); + } + if (!resp || (typeof resp.ok !== 'boolean' && (!resp.error && !resp.newRecordId && !resp.redirectToRecordId))) { throw new Error( - `Invalid return value from beforeSave hook. Expected: { ok: boolean, error?: string | null, newRecordId?: any }.\n` + - `Note: Return { ok: false, error: null, newRecordId } to stop creation and redirect to an existing record.` + `Invalid return value from beforeSave hook. Expected: { ok: boolean, error?: string | null, newRecordId?: any, redirectToRecordId?: any }.\n` + + `Note: Return { ok: false, error: null, newRecordId, redirectToRecordId } to stop creation and redirect to an existing record.` ); } if (resp.ok === false && !resp.error) { - const { error, ok, newRecordId } = resp; + const { error, ok, newRecordId, redirectToRecordId } = resp; return { error: error ?? 'Operation aborted by hook', - newRecordId: newRecordId + newRecordId: newRecordId, + redirectToRecordId: redirectToRecordId }; } if (resp.error) { diff --git a/adminforth/modules/restApi.ts b/adminforth/modules/restApi.ts index 78a8c946..33bbd407 100644 --- a/adminforth/modules/restApi.ts +++ b/adminforth/modules/restApi.ts @@ -1280,7 +1280,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI { extra: { body, query, headers, cookies, requestUrl, response } }); if (createRecordResponse.error) { - return { error: createRecordResponse.error, ok: false, newRecordId: createRecordResponse.newRecordId }; + return { error: createRecordResponse.error, ok: false, newRecordId: createRecordResponse.newRecordId, redirectToRecordId: createRecordResponse.redirectToRecordId }; } const connector = this.adminforth.connectors[resource.dataSource]; diff --git a/adminforth/types/Back.ts b/adminforth/types/Back.ts index 5be3c1d0..b7b952fc 100644 --- a/adminforth/types/Back.ts +++ b/adminforth/types/Back.ts @@ -505,7 +505,15 @@ export type BeforeDataSourceRequestFunction = (params: { requestUrl: string, }, adminforth: IAdminForth, -}) => Promise<{ok: boolean, error?: string, newRecordId?: string}>; +}) => Promise<{ + ok: boolean, + error?: string | null, + /** + * @deprecated Since 1.2.9. Will be removed in 2.0.0. Use redirectToRecordId instead. + */ + newRecordId?: string, + redirectToRecordId?: string +}>; /** * Modify response to change how data is returned after fetching from database. @@ -549,8 +557,15 @@ export type CreateResourceRecordResult = { /** * Optional id of an existing record to redirect to * (used when a beforeSave hook aborts creation and supplies newRecordId, allows to implement programmatic creation via API). + * @deprecated Since 1.2.9. Will be removed in 2.0.0. Use redirectToRecordId instead. */ newRecordId?: any; + + /** + * Optional id of an existing record to redirect to + * (used when a beforeSave hook aborts creation and supplies redirectToRecordId, allows to implement programmatic creation via API). + */ + redirectToRecordId?: any; }; /** @@ -838,7 +853,15 @@ export type BeforeCreateSaveFunction = (params: { response: IAdminForthHttpResponse, extra?: HttpExtra, -}) => Promise<{ok: boolean, error?: string | null, newRecordId?: string}>; +}) => Promise<{ + ok: boolean, + error?: string | null, + /** + * @deprecated Since 1.2.9. Will be removed in 2.0.0. Use redirectToRecordId instead. + */ + newRecordId?: string, + redirectToRecordId?: string +}>; export type AfterCreateSaveFunction = (params: { /** From ad9ad906a7671ee40029eb253b8b3cc08468c2af Mon Sep 17 00:00:00 2001 From: yaroslav8765 Date: Fri, 30 Jan 2026 09:09:27 +0200 Subject: [PATCH 2/2] fix: update handling of newRecordId to prefer redirectToRecordId in error responses --- adminforth/index.ts | 4 ++-- adminforth/modules/restApi.ts | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/adminforth/index.ts b/adminforth/index.ts index 1191f4ec..e97b7f34 100644 --- a/adminforth/index.ts +++ b/adminforth/index.ts @@ -574,14 +574,14 @@ class AdminForth implements IAdminForth { if (!resp || (typeof resp.ok !== 'boolean' && (!resp.error && !resp.newRecordId && !resp.redirectToRecordId))) { throw new Error( `Invalid return value from beforeSave hook. Expected: { ok: boolean, error?: string | null, newRecordId?: any, redirectToRecordId?: any }.\n` + - `Note: Return { ok: false, error: null, newRecordId, redirectToRecordId } to stop creation and redirect to an existing record.` + `Note: Return { ok: false, error: null, redirectToRecordId } (preferred) or { ok: false, error: null, newRecordId } (deprecated) to stop creation and redirect to an existing record.` ); } if (resp.ok === false && !resp.error) { const { error, ok, newRecordId, redirectToRecordId } = resp; return { error: error ?? 'Operation aborted by hook', - newRecordId: newRecordId, + newRecordId: redirectToRecordId ? redirectToRecordId : newRecordId, redirectToRecordId: redirectToRecordId }; } diff --git a/adminforth/modules/restApi.ts b/adminforth/modules/restApi.ts index 33bbd407..e4ecf9dd 100644 --- a/adminforth/modules/restApi.ts +++ b/adminforth/modules/restApi.ts @@ -1280,7 +1280,11 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI { extra: { body, query, headers, cookies, requestUrl, response } }); if (createRecordResponse.error) { - return { error: createRecordResponse.error, ok: false, newRecordId: createRecordResponse.newRecordId, redirectToRecordId: createRecordResponse.redirectToRecordId }; + return { + error: createRecordResponse.error, + ok: false, + newRecordId: createRecordResponse.redirectToRecordId ? createRecordResponse.redirectToRecordId :createRecordResponse.newRecordId, + redirectToRecordId: createRecordResponse.redirectToRecordId }; } const connector = this.adminforth.connectors[resource.dataSource];