From c8ae2f654967a9e4ab55965267fd232c67e15f15 Mon Sep 17 00:00:00 2001 From: Stephan Meijer Date: Fri, 27 Jun 2025 14:19:53 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20rename=20`convert?= =?UTF-8?q?-markdown`=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renamed the `convert-markdown` endpoint to `convert` as a general-purpose conversion endpoint for integration with DocSpec conversion (DOCX import), without altering its existing functionality. In a future contribution, this endpoint will not only support conversion from Markdown -> BlockNote -> Yjs but also directly BlockNote -> Yjs. Signed-off-by: Stephan Meijer --- docs/env.md | 2 +- src/backend/impress/settings.py | 2 +- .../{convertMarkdown.test.ts => convert.test.ts} | 16 ++++++++-------- .../servers/y-provider/__tests__/server.test.ts | 8 ++++---- ...nvertMarkdownHandler.ts => convertHandler.ts} | 2 +- .../servers/y-provider/src/handlers/index.ts | 2 +- src/frontend/servers/y-provider/src/routes.ts | 2 +- .../servers/y-provider/src/servers/appServer.ts | 8 ++++---- 8 files changed, 21 insertions(+), 21 deletions(-) rename src/frontend/servers/y-provider/__tests__/{convertMarkdown.test.ts => convert.test.ts} (75%) rename src/frontend/servers/y-provider/src/handlers/{convertMarkdownHandler.ts => convertHandler.ts} (96%) diff --git a/docs/env.md b/docs/env.md index ac6e18e2..0f1a092f 100644 --- a/docs/env.md +++ b/docs/env.md @@ -29,7 +29,7 @@ These are the environment variables you can set for the `impress-backend` contai | COLLABORATION_WS_NOT_CONNECTED_READY_ONLY | Users not connected to the collaboration server cannot edit | false | | COLLABORATION_WS_URL | collaboration websocket url | | | CONVERSION_API_CONTENT_FIELD | Conversion api content field | content | -| CONVERSION_API_ENDPOINT | Conversion API endpoint | convert-markdown | +| CONVERSION_API_ENDPOINT | Conversion API endpoint | convert | | CONVERSION_API_SECURE | Require secure conversion api | false | | CONVERSION_API_TIMEOUT | Conversion api timeout | 30 | | CONTENT_SECURITY_POLICY_DIRECTIVES | A dict of directives set in the Content-Security-Policy header | All directives are set to 'none' | diff --git a/src/backend/impress/settings.py b/src/backend/impress/settings.py index dd1d3acc..7a0635a2 100755 --- a/src/backend/impress/settings.py +++ b/src/backend/impress/settings.py @@ -639,7 +639,7 @@ class Base(Configuration): # Conversion endpoint CONVERSION_API_ENDPOINT = values.Value( - default="convert-markdown", + default="convert", environ_name="CONVERSION_API_ENDPOINT", environ_prefix=None, ) diff --git a/src/frontend/servers/y-provider/__tests__/convertMarkdown.test.ts b/src/frontend/servers/y-provider/__tests__/convert.test.ts similarity index 75% rename from src/frontend/servers/y-provider/__tests__/convertMarkdown.test.ts rename to src/frontend/servers/y-provider/__tests__/convert.test.ts index ed4765b2..917c0b09 100644 --- a/src/frontend/servers/y-provider/__tests__/convertMarkdown.test.ts +++ b/src/frontend/servers/y-provider/__tests__/convert.test.ts @@ -21,9 +21,9 @@ describe('Server Tests', () => { server.close(); }); - test('POST /api/convert-markdown with incorrect API key should return 403', async () => { + test('POST /api/convert with incorrect API key should return 403', async () => { const response = await request(app as any) - .post('/api/convert-markdown') + .post('/api/convert') .set('Origin', origin) .set('Authorization', 'wrong-api-key'); @@ -31,9 +31,9 @@ describe('Server Tests', () => { expect(response.body.error).toBe('Forbidden: Invalid API Key'); }); - test('POST /api/convert-markdown with a Bearer token', async () => { + test('POST /api/convert with a Bearer token', async () => { const response = await request(app as any) - .post('/api/convert-markdown') + .post('/api/convert') .set('Origin', origin) .set('Authorization', 'Bearer test-secret-api-key'); @@ -41,9 +41,9 @@ describe('Server Tests', () => { expect(response.status).toBe(403); }); - test('POST /api/convert-markdown with missing body param content', async () => { + test('POST /api/convert with missing body param content', async () => { const response = await request(app as any) - .post('/api/convert-markdown') + .post('/api/convert') .set('Origin', origin) .set('Authorization', 'yprovider-api-key'); @@ -51,9 +51,9 @@ describe('Server Tests', () => { expect(response.body.error).toBe('Invalid request: missing content'); }); - test('POST /api/convert-markdown with body param content being an empty string', async () => { + test('POST /api/convert with body param content being an empty string', async () => { const response = await request(app as any) - .post('/api/convert-markdown') + .post('/api/convert') .set('Origin', origin) .set('Authorization', 'yprovider-api-key') .send({ diff --git a/src/frontend/servers/y-provider/__tests__/server.test.ts b/src/frontend/servers/y-provider/__tests__/server.test.ts index 0c4ed30a..816e941a 100644 --- a/src/frontend/servers/y-provider/__tests__/server.test.ts +++ b/src/frontend/servers/y-provider/__tests__/server.test.ts @@ -39,20 +39,20 @@ describe('Server Tests', () => { }); }); - it('should allow JSON payloads up to 500kb for the CONVERT_MARKDOWN route', async () => { + it('should allow JSON payloads up to 500kb for the CONVERT route', async () => { const largePayload = 'a'.repeat(400 * 1024); // 400kb payload const response = await request(app) - .post(routes.CONVERT_MARKDOWN) + .post(routes.CONVERT) .send({ data: largePayload }) .set('Content-Type', 'application/json'); expect(response.status).not.toBe(413); }); - it('should reject JSON payloads larger than 500kb for the CONVERT_MARKDOWN route', async () => { + it('should reject JSON payloads larger than 500kb for the CONVERT route', async () => { const oversizedPayload = 'a'.repeat(501 * 1024); // 501kb payload const response = await request(app) - .post(routes.CONVERT_MARKDOWN) + .post(routes.CONVERT) .send({ data: oversizedPayload }) .set('Content-Type', 'application/json'); diff --git a/src/frontend/servers/y-provider/src/handlers/convertMarkdownHandler.ts b/src/frontend/servers/y-provider/src/handlers/convertHandler.ts similarity index 96% rename from src/frontend/servers/y-provider/src/handlers/convertMarkdownHandler.ts rename to src/frontend/servers/y-provider/src/handlers/convertHandler.ts index 9fc09134..1a16d84a 100644 --- a/src/frontend/servers/y-provider/src/handlers/convertMarkdownHandler.ts +++ b/src/frontend/servers/y-provider/src/handlers/convertHandler.ts @@ -16,7 +16,7 @@ interface ErrorResponse { error: string; } -export const convertMarkdownHandler = async ( +export const convertHandler = async ( req: Request< object, ConversionResponse | ErrorResponse, diff --git a/src/frontend/servers/y-provider/src/handlers/index.ts b/src/frontend/servers/y-provider/src/handlers/index.ts index 75bd7f7b..296fefa2 100644 --- a/src/frontend/servers/y-provider/src/handlers/index.ts +++ b/src/frontend/servers/y-provider/src/handlers/index.ts @@ -1,3 +1,3 @@ export * from './collaborationResetConnectionsHandler'; export * from './collaborationWSHandler'; -export * from './convertMarkdownHandler'; +export * from './convertHandler'; diff --git a/src/frontend/servers/y-provider/src/routes.ts b/src/frontend/servers/y-provider/src/routes.ts index 98803b87..7d219e2e 100644 --- a/src/frontend/servers/y-provider/src/routes.ts +++ b/src/frontend/servers/y-provider/src/routes.ts @@ -1,5 +1,5 @@ export const routes = { COLLABORATION_WS: '/collaboration/ws/', COLLABORATION_RESET_CONNECTIONS: '/collaboration/api/reset-connections/', - CONVERT_MARKDOWN: '/api/convert-markdown/', + CONVERT: '/api/convert/', }; diff --git a/src/frontend/servers/y-provider/src/servers/appServer.ts b/src/frontend/servers/y-provider/src/servers/appServer.ts index 5c035db7..00e26718 100644 --- a/src/frontend/servers/y-provider/src/servers/appServer.ts +++ b/src/frontend/servers/y-provider/src/servers/appServer.ts @@ -8,7 +8,7 @@ import { PORT } from '../env'; import { collaborationResetConnectionsHandler, collaborationWSHandler, - convertMarkdownHandler, + convertHandler, } from '../handlers'; import { corsMiddleware, httpSecurity, wsSecurity } from '../middlewares'; import { routes } from '../routes'; @@ -22,7 +22,7 @@ import { logger } from '../utils'; export const initServer = () => { const { app } = expressWebsockets(express()); app.use((req, res, next) => { - if (req.path === routes.CONVERT_MARKDOWN) { + if (req.path === routes.CONVERT) { // Large transcript files are bigger than the default '100kb' limit return express.json({ limit: '500kb' })(req, res, next); } @@ -47,9 +47,9 @@ export const initServer = () => { ); /** - * Route to convert markdown + * Route to convert Markdown or BlockNote blocks */ - app.post(routes.CONVERT_MARKDOWN, httpSecurity, convertMarkdownHandler); + app.post(routes.CONVERT, httpSecurity, convertHandler); Sentry.setupExpressErrorHandler(app);