refactor(api): version routes and externalize client base url

- serve REST endpoints under /api/v1 with root exceptions for health and mcp

- move swagger UI to /docs and allow direct frontend calls via CORS

- remove Vite proxy/hash routing and rely on env-driven VITE_API_URL
This commit is contained in:
2026-04-10 22:53:32 +03:00
parent ccce3381c1
commit 11db983ea6
7 changed files with 38 additions and 19 deletions
+3
View File
@@ -0,0 +1,3 @@
# Frontend API base URL.
# Example for local Docker server: backend container is exposed on localhost:13000.
VITE_API_URL=http://localhost:13000/api/v1
+3 -3
View File
@@ -13,9 +13,9 @@ import type {
} from './types';
import { emitApiErrorToast } from '../lib/toast-events';
// In dev, Vite proxies /environments /sessions /scenarios to localhost:3000.
// In production (or when VITE_API_URL is set) we hit the configured origin directly.
const BASE_URL: string = (import.meta.env.VITE_API_URL as string | undefined) ?? '';
// API calls are versioned under /api/v1 by default.
// Set VITE_API_URL (for example, http://localhost:13000/api/v1) to use a different origin.
const BASE_URL = ((import.meta.env.VITE_API_URL as string | undefined) ?? '/api/v1').replace(/\/$/, '');
async function request<T>(path: string, init?: RequestInit): Promise<T> {
let res: Response;
+3 -3
View File
@@ -1,6 +1,6 @@
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { HashRouter } from 'react-router-dom';
import { BrowserRouter } from 'react-router-dom';
import './i18n';
import './ui/tokens.css';
import App from './App';
@@ -9,9 +9,9 @@ import { ToastProvider } from './ui';
createRoot(document.getElementById('root')!).render(
<StrictMode>
<ToastProvider>
<HashRouter>
<BrowserRouter>
<App />
</HashRouter>
</BrowserRouter>
</ToastProvider>
</StrictMode>,
);
-9
View File
@@ -68,15 +68,6 @@ export default defineConfig({
},
},
},
server: {
proxy: {
'/environments': 'http://localhost:13000',
'/credentials': 'http://localhost:13000',
'/snippets': 'http://localhost:13000',
'/sessions': 'http://localhost:13000',
'/scenarios': 'http://localhost:13000',
},
},
test: {
projects: [{
extends: true,