diff --git a/adminforth/index.ts b/adminforth/index.ts index cbc5ebb0..e97b7f34 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, 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 } = resp; + const { error, ok, newRecordId, redirectToRecordId } = resp; return { error: error ?? 'Operation aborted by hook', - newRecordId: newRecordId + newRecordId: redirectToRecordId ? redirectToRecordId : newRecordId, + redirectToRecordId: redirectToRecordId }; } if (resp.error) { diff --git a/adminforth/modules/restApi.ts b/adminforth/modules/restApi.ts index 78a8c946..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 }; + return { + error: createRecordResponse.error, + ok: false, + newRecordId: createRecordResponse.redirectToRecordId ? createRecordResponse.redirectToRecordId :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: { /**