From eebbc5181fae92614e3437998f7dc475799892d8 Mon Sep 17 00:00:00 2001 From: Slim Amamou Date: Mon, 27 Nov 2023 12:56:37 +0100 Subject: [PATCH] fix: validation errors are shown as "Server communication error" (#515) * fix: documentLoader() was not loading with method GET When parent function fetchJsonLd() was called with method POST the method is inherited which resulted in a status 415 response from the API which refused the unsafe method with unrecognized Content Type jsonld. * fix: was not displaying a useful error message when creating an entity --- jest.setup.ts | 3 ++- src/hydra/dataProvider.test.ts | 2 +- src/hydra/dataProvider.ts | 2 +- src/hydra/fetchHydra.ts | 23 +++++++++++++++-------- src/types.ts | 32 ++++++++++++++++---------------- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/jest.setup.ts b/jest.setup.ts index 85e80307..663e582a 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -1,8 +1,9 @@ // eslint-disable-next-line import/no-extraneous-dependencies import '@testing-library/jest-dom'; -import { TextEncoder } from 'util'; +import { TextEncoder, TextDecoder } from 'util'; // eslint-disable-next-line import/no-extraneous-dependencies import { Request } from 'node-fetch'; global.TextEncoder = TextEncoder; +global.TextDecoder = TextDecoder as any; global.Request = Request as any; diff --git a/src/hydra/dataProvider.test.ts b/src/hydra/dataProvider.test.ts index 44674b40..1d07e17c 100644 --- a/src/hydra/dataProvider.test.ts +++ b/src/hydra/dataProvider.test.ts @@ -138,7 +138,7 @@ describe('Transform a React Admin request to an Hydra request', () => { perPage: 30, }, sort: { - order: '', + order: 'ASC', field: '', }, filter: { diff --git a/src/hydra/dataProvider.ts b/src/hydra/dataProvider.ts index 017f5457..bf1ff01b 100644 --- a/src/hydra/dataProvider.ts +++ b/src/hydra/dataProvider.ts @@ -722,7 +722,7 @@ function dataProvider( page: 1, }, filter: { id: params.ids }, - sort: { field: '', order: '' }, + sort: { field: '', order: 'ASC' }, }).then(({ data }) => ({ data })); } diff --git a/src/hydra/fetchHydra.ts b/src/hydra/fetchHydra.ts index 99c8afa0..dcc9f70a 100644 --- a/src/hydra/fetchHydra.ts +++ b/src/hydra/fetchHydra.ts @@ -4,7 +4,7 @@ import { getDocumentationUrlFromHeaders, } from '@api-platform/api-doc-parser'; import jsonld from 'jsonld'; -import type { NodeObject } from 'jsonld'; +import type { ContextDefinition, NodeObject } from 'jsonld'; import type { JsonLdObj } from 'jsonld/jsonld-spec'; import type { HttpClientOptions, HydraHttpClientResponse } from '../types.js'; @@ -40,8 +40,12 @@ function fetchHydra( delete (body as NodeObject).trace; - const documentLoader = (input: string) => - fetchJsonLd(input, authOptions).then((response) => { + const documentLoader = (input: string) => { + const loaderOptions = authOptions; + loaderOptions.method = 'GET'; + delete loaderOptions.body; + + return fetchJsonLd(input, loaderOptions).then((response) => { if (!('body' in response)) { throw new Error( 'An empty response was received when expanding JSON-LD error document.', @@ -49,12 +53,15 @@ function fetchHydra( } return response; }); + }; + + return documentLoader(getDocumentationUrlFromHeaders(headers)) + .then((response) => + jsonld.expand(body, { + expandContext: response.document as ContextDefinition, + }), + ) - return jsonld - .expand(body, { - base: getDocumentationUrlFromHeaders(headers), - documentLoader, - }) .then((json) => Promise.reject( new HttpError( diff --git a/src/types.ts b/src/types.ts index f060ef14..30032f7d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -226,22 +226,22 @@ export type ApiPlatformAdminDataProviderTypeParams = T extends typeof GET_LIST ? ApiPlatformAdminGetListParams : T extends typeof GET_ONE - ? ApiPlatformAdminGetOneParams - : T extends typeof GET_MANY - ? ApiPlatformAdminGetManyParams - : T extends typeof GET_MANY_REFERENCE - ? ApiPlatformAdminGetManyReferenceParams - : T extends typeof UPDATE - ? ApiPlatformAdminUpdateParams - : T extends typeof UPDATE_MANY - ? ApiPlatformAdminUpdateManyParams - : T extends typeof CREATE - ? ApiPlatformAdminCreateParams - : T extends typeof DELETE - ? ApiPlatformAdminDeleteParams - : T extends typeof DELETE_MANY - ? ApiPlatformAdminDeleteManyParams - : never; + ? ApiPlatformAdminGetOneParams + : T extends typeof GET_MANY + ? ApiPlatformAdminGetManyParams + : T extends typeof GET_MANY_REFERENCE + ? ApiPlatformAdminGetManyReferenceParams + : T extends typeof UPDATE + ? ApiPlatformAdminUpdateParams + : T extends typeof UPDATE_MANY + ? ApiPlatformAdminUpdateManyParams + : T extends typeof CREATE + ? ApiPlatformAdminCreateParams + : T extends typeof DELETE + ? ApiPlatformAdminDeleteParams + : T extends typeof DELETE_MANY + ? ApiPlatformAdminDeleteManyParams + : never; export interface ApiPlatformAdminDataProviderFactoryParams { entrypoint: string;