From e027ae93572e9a6f05e3604bc3fbacb1ab4348d4 Mon Sep 17 00:00:00 2001 From: Corentin Date: Fri, 8 May 2026 12:41:18 +0200 Subject: [PATCH] =?UTF-8?q?fix(acadenice):=20unwrap=20server=20response=20?= =?UTF-8?q?envelope=20in=204=20client=20services=20=E2=80=94=20Patch=20024?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The server applies a global TransformHttpResponseInterceptor that wraps every response body in { data, success, status }. Native Docmost client services use the api axios instance whose interceptor already unwraps once, so callers see r.data === payload directly. The acadenice client services use axios directly (no interceptor), so r.data === { data, success, status } envelope. Calling templates.map() on the envelope crashed with 'templates.map is not a function' — exact symptom Corentin hit (white screen on click). Patched 4 services to read r.data.data: templates, sync-blocks, slash-commands, clipper. The notifications service already uses the api instance so it was untouched. A future refactor should migrate all 4 to the shared api instance for consistency and to inherit auth/redirect handling. Patch 024. --- .../acadenice/clipper/services/clipper-client.ts | 4 ++-- .../services/slash-commands-client.ts | 10 +++++----- .../sync-blocks/services/sync-blocks-client.ts | 8 ++++---- .../templates-admin/services/templates-client.ts | 12 ++++++------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/client/src/features/acadenice/clipper/services/clipper-client.ts b/apps/client/src/features/acadenice/clipper/services/clipper-client.ts index d2647e1f..b1269884 100644 --- a/apps/client/src/features/acadenice/clipper/services/clipper-client.ts +++ b/apps/client/src/features/acadenice/clipper/services/clipper-client.ts @@ -24,13 +24,13 @@ export interface CreateTokenResponse { export const clipperClient = { listTokens(): Promise { - return axios.get(`${BASE}/tokens`).then((r) => r.data); + return axios.get(`${BASE}/tokens`).then((r) => r.data.data); }, createToken(payload: CreateTokenPayload): Promise { return axios .post(`${BASE}/tokens`, payload) - .then((r) => r.data); + .then((r) => r.data.data); }, revokeToken(tokenId: string): Promise { diff --git a/apps/client/src/features/acadenice/slash-commands-admin/services/slash-commands-client.ts b/apps/client/src/features/acadenice/slash-commands-admin/services/slash-commands-client.ts index ef0cce2b..1ed99eff 100644 --- a/apps/client/src/features/acadenice/slash-commands-admin/services/slash-commands-client.ts +++ b/apps/client/src/features/acadenice/slash-commands-admin/services/slash-commands-client.ts @@ -39,21 +39,21 @@ const BASE = '/api/acadenice/slash-commands'; export const slashCommandsClient = { list(): Promise { - return axios.get(BASE).then((r) => r.data); + return axios.get(BASE).then((r) => r.data.data); }, get(id: string): Promise { - return axios.get(`${BASE}/${id}`).then((r) => r.data); + return axios.get(`${BASE}/${id}`).then((r) => r.data.data); }, create(payload: CreateSlashCommandPayload): Promise { - return axios.post(BASE, payload).then((r) => r.data); + return axios.post(BASE, payload).then((r) => r.data.data); }, update(id: string, payload: UpdateSlashCommandPayload): Promise { return axios .patch(`${BASE}/${id}`, payload) - .then((r) => r.data); + .then((r) => r.data.data); }, delete(id: string): Promise { @@ -63,6 +63,6 @@ export const slashCommandsClient = { toggle(id: string, isEnabled: boolean): Promise { return axios .patch(`${BASE}/${id}`, { isEnabled }) - .then((r) => r.data); + .then((r) => r.data.data); }, }; diff --git a/apps/client/src/features/acadenice/sync-blocks/services/sync-blocks-client.ts b/apps/client/src/features/acadenice/sync-blocks/services/sync-blocks-client.ts index 08ab85ca..023d107b 100644 --- a/apps/client/src/features/acadenice/sync-blocks/services/sync-blocks-client.ts +++ b/apps/client/src/features/acadenice/sync-blocks/services/sync-blocks-client.ts @@ -21,15 +21,15 @@ const BASE = '/api/acadenice/sync-blocks'; export const syncBlocksClient = { create(content: Record = {}): Promise { - return axios.post(BASE, { content }).then((r) => r.data); + return axios.post(BASE, { content }).then((r) => r.data.data); }, get(id: string): Promise { - return axios.get(`${BASE}/${id}`).then((r) => r.data); + return axios.get(`${BASE}/${id}`).then((r) => r.data.data); }, update(id: string, content: Record): Promise { - return axios.patch(`${BASE}/${id}`, { content }).then((r) => r.data); + return axios.patch(`${BASE}/${id}`, { content }).then((r) => r.data.data); }, delete(id: string): Promise { @@ -37,6 +37,6 @@ export const syncBlocksClient = { }, usages(id: string): Promise { - return axios.get(`${BASE}/${id}/usages`).then((r) => r.data); + return axios.get(`${BASE}/${id}/usages`).then((r) => r.data.data); }, }; diff --git a/apps/client/src/features/acadenice/templates-admin/services/templates-client.ts b/apps/client/src/features/acadenice/templates-admin/services/templates-client.ts index c185e017..a38542e1 100644 --- a/apps/client/src/features/acadenice/templates-admin/services/templates-client.ts +++ b/apps/client/src/features/acadenice/templates-admin/services/templates-client.ts @@ -42,19 +42,19 @@ export const templatesClient = { list(opts: { category?: string; search?: string } = {}): Promise { return axios .get(BASE, { params: opts }) - .then((r) => r.data); + .then((r) => r.data.data); }, get(id: string): Promise { - return axios.get(`${BASE}/${id}`).then((r) => r.data); + return axios.get(`${BASE}/${id}`).then((r) => r.data.data); }, create(payload: CreateTemplatePayload): Promise { - return axios.post(BASE, payload).then((r) => r.data); + return axios.post(BASE, payload).then((r) => r.data.data); }, update(id: string, payload: UpdateTemplatePayload): Promise { - return axios.patch(`${BASE}/${id}`, payload).then((r) => r.data); + return axios.patch(`${BASE}/${id}`, payload).then((r) => r.data.data); }, delete(id: string): Promise { @@ -67,10 +67,10 @@ export const templatesClient = { ): Promise<{ pageId: string; slugId: string }> { return axios .post<{ pageId: string; slugId: string }>(`${BASE}/${id}/instantiate`, payload) - .then((r) => r.data); + .then((r) => r.data.data); }, setDefault(id: string): Promise { - return axios.patch(`${BASE}/${id}/default`).then((r) => r.data); + return axios.patch(`${BASE}/${id}/default`).then((r) => r.data.data); }, };