diff --git a/backend/app/routers/admin.py b/backend/app/routers/admin.py index f923404..fd13a95 100644 --- a/backend/app/routers/admin.py +++ b/backend/app/routers/admin.py @@ -59,7 +59,7 @@ class TokenAnalytics(BaseModel): never_used_tokens: int recent_active_tokens: int -router = APIRouter(prefix="/admin", tags=["admin"]) +router = APIRouter(prefix="/api/admin", tags=["admin"]) @router.get("/auth/github") diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 4695c9e..4750cb0 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -15,7 +15,7 @@ COPY --from=deps /app/node_modules ./node_modules COPY . . # Set the API base URL as a build argument -ARG NEXT_PUBLIC_API_BASE=http://localhost:8000 +ARG NEXT_PUBLIC_API_BASE=http://localhost:8000/api ENV NEXT_PUBLIC_API_BASE=$NEXT_PUBLIC_API_BASE # Build the application diff --git a/frontend/src/app/admin/components/AdminUsersManager.tsx b/frontend/src/app/admin/components/AdminUsersManager.tsx index 543b5b7..ee1901c 100644 --- a/frontend/src/app/admin/components/AdminUsersManager.tsx +++ b/frontend/src/app/admin/components/AdminUsersManager.tsx @@ -60,7 +60,7 @@ export default function AdminUsersManager() { }); const { toast } = useToast(); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; useEffect(() => { fetchUsers(); diff --git a/frontend/src/app/admin/components/BinariesManager.tsx b/frontend/src/app/admin/components/BinariesManager.tsx index 4e512d3..2027a83 100644 --- a/frontend/src/app/admin/components/BinariesManager.tsx +++ b/frontend/src/app/admin/components/BinariesManager.tsx @@ -42,7 +42,7 @@ export default function BinariesManager() { const [isDialogOpen, setIsDialogOpen] = useState(false); const { toast } = useToast(); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; const [formData, setFormData] = useState({ id: '', diff --git a/frontend/src/app/admin/components/EnvironmentsManager.tsx b/frontend/src/app/admin/components/EnvironmentsManager.tsx index e521ad7..820e056 100644 --- a/frontend/src/app/admin/components/EnvironmentsManager.tsx +++ b/frontend/src/app/admin/components/EnvironmentsManager.tsx @@ -39,7 +39,7 @@ export default function EnvironmentsManager() { const [isDialogOpen, setIsDialogOpen] = useState(false); const { toast } = useToast(); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; const [formData, setFormData] = useState({ id: '', diff --git a/frontend/src/app/admin/components/RunsManager.tsx b/frontend/src/app/admin/components/RunsManager.tsx index d9dd831..4f9567d 100644 --- a/frontend/src/app/admin/components/RunsManager.tsx +++ b/frontend/src/app/admin/components/RunsManager.tsx @@ -79,7 +79,7 @@ export default function RunsManager() { }); const { toast } = useToast(); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; const [filters, setFilters] = useState({ commit_sha: '', diff --git a/frontend/src/app/admin/page.tsx b/frontend/src/app/admin/page.tsx index c8bcf18..af3ea05 100644 --- a/frontend/src/app/admin/page.tsx +++ b/frontend/src/app/admin/page.tsx @@ -30,7 +30,7 @@ export default function AdminPage() { const [authenticating, setAuthenticating] = useState(false); const { toast } = useToast(); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; useEffect(() => { checkAuth(); diff --git a/frontend/src/app/auth/callback/page.tsx b/frontend/src/app/auth/callback/page.tsx index 5631f1c..6d805fd 100644 --- a/frontend/src/app/auth/callback/page.tsx +++ b/frontend/src/app/auth/callback/page.tsx @@ -20,7 +20,7 @@ function AuthCallbackContent() { ); const [errorMessage, setErrorMessage] = useState(''); - const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; + const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; useEffect(() => { const handleCallback = async () => { diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index e80209d..2dfc7a4 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -12,7 +12,7 @@ import type { TokenAnalytics, } from './types'; -const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000'; +const API_BASE = process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8000/api'; class ApiError extends Error { constructor( @@ -98,12 +98,12 @@ async function fetchApi( export const api = { // Commit endpoints getCommits: (skip: number = 0, limit: number = 100) => - fetchApi(`/api/commits?skip=${skip}&limit=${limit}`), - getCommit: (sha: string) => fetchApi(`/api/commits/${sha}`), + fetchApi(`/commits?skip=${skip}&limit=${limit}`), + getCommit: (sha: string) => fetchApi(`/commits/${sha}`), // Binary endpoints - getBinaries: () => fetchApi(`/api/binaries?_t=${Date.now()}`), - getBinary: (id: string) => fetchApi(`/api/binaries/${id}`), + getBinaries: () => fetchApi(`/binaries?_t=${Date.now()}`), + getBinary: (id: string) => fetchApi(`/binaries/${id}`), getEnvironmentsForBinary: (binaryId: string) => fetchApi< Array<{ @@ -113,7 +113,7 @@ export const api = { run_count: number; commit_count: number; }> - >(`/api/binaries/${binaryId}/environments`), + >(`/binaries/${binaryId}/environments`), getCommitsForBinaryAndEnvironment: ( binaryId: string, environmentId: string @@ -127,19 +127,19 @@ export const api = { python_version: { major: number; minor: number; patch: number }; run_timestamp: string; }> - >(`/api/binaries/${binaryId}/environments/${environmentId}/commits`), + >(`/binaries/${binaryId}/environments/${environmentId}/commits`), // Environment endpoints - getEnvironments: () => fetchApi('/api/environments'), + getEnvironments: () => fetchApi('/environments'), getEnvironment: (id: string) => - fetchApi(`/api/environments/${id}`), + fetchApi(`/environments/${id}`), // Python version endpoints getPythonVersions: () => - fetchApi('/api/python-versions'), + fetchApi('/python-versions'), // Benchmark endpoints - getAllBenchmarks: () => fetchApi('/api/benchmarks'), + getAllBenchmarks: () => fetchApi('/benchmarks'), getBenchmarkNames: (params: { environment_id: string; binary_id: string; @@ -152,7 +152,7 @@ export const api = { queryParams.append('python_major', params.python_major.toString()); queryParams.append('python_minor', params.python_minor.toString()); - return fetchApi(`/api/benchmark-names?${queryParams.toString()}`); + return fetchApi(`/benchmark-names?${queryParams.toString()}`); }, // Diff endpoint @@ -168,7 +168,7 @@ export const api = { queryParams.append('environment_id', params.environment_id); queryParams.append('metric_key', params.metric_key); - return fetchApi(`/api/diff?${queryParams.toString()}`); + return fetchApi(`/diff?${queryParams.toString()}`); }, // Upload endpoint @@ -183,7 +183,7 @@ export const api = { }; benchmark_results: BenchmarkResultJson[]; }) => - fetchApi<{ success: boolean }>('/api/upload', { + fetchApi<{ success: boolean }>('/upload', { method: 'POST', body: JSON.stringify(data), }), @@ -209,7 +209,7 @@ export const api = { high_watermark_bytes: number; total_allocated_bytes: number; }> - >(`/api/trends?${queryParams.toString()}`); + >(`/trends?${queryParams.toString()}`); }, // Batch trends endpoint @@ -232,7 +232,7 @@ export const api = { total_allocated_bytes: number; }> >; - }>('/api/trends-batch', { + }>('/trends-batch', { method: 'POST', body: JSON.stringify({ trend_queries: trendQueries.map((query) => ({ @@ -247,7 +247,7 @@ export const api = { // Flamegraph endpoint getFlamegraph: (id: string) => - fetchApi<{ flamegraph_html: string }>(`/api/flamegraph/${id}`), + fetchApi<{ flamegraph_html: string }>(`/flamegraph/${id}`), // Token management endpoints getTokens: () =>