docker setup

This commit is contained in:
2025-12-26 18:59:50 +01:00
parent 64377de548
commit 904feb41b8
11 changed files with 198 additions and 30 deletions

View File

@@ -1,5 +1,4 @@
import { ApiClient } from './api/index';
import { getWebsiteApiBaseUrl } from './config/apiBaseUrl';
const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001';
export const apiClient = new ApiClient(API_BASE_URL);
export const apiClient = new ApiClient(getWebsiteApiBaseUrl());

View File

@@ -0,0 +1,36 @@
function normalizeBaseUrl(raw: string): string {
const trimmed = raw.trim();
return trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;
}
export function getWebsiteApiBaseUrl(): string {
const isBrowser = typeof window !== 'undefined';
const configured = isBrowser
? process.env.NEXT_PUBLIC_API_BASE_URL
: process.env.API_BASE_URL ?? process.env.NEXT_PUBLIC_API_BASE_URL;
if (configured && configured.trim()) {
return normalizeBaseUrl(configured);
}
const isTestLike =
process.env.NODE_ENV === 'test' ||
process.env.CI === 'true' ||
process.env.DOCKER === 'true';
if (isTestLike) {
throw new Error(
isBrowser
? 'Missing NEXT_PUBLIC_API_BASE_URL. In Docker/CI/test we do not allow falling back to localhost.'
: 'Missing API_BASE_URL. In Docker/CI/test we do not allow falling back to localhost.',
);
}
const fallback =
process.env.NODE_ENV === 'development'
? 'http://localhost:3001'
: 'http://api:3000';
return normalizeBaseUrl(fallback);
}

View File

@@ -12,6 +12,7 @@ import { DashboardApiClient } from '../api/dashboard/DashboardApiClient';
import { PolicyApiClient } from '../api/policy/PolicyApiClient';
import { ProtestsApiClient } from '../api/protests/ProtestsApiClient';
import { PenaltiesApiClient } from '../api/penalties/PenaltiesApiClient';
import { getWebsiteApiBaseUrl } from '../config/apiBaseUrl';
import { PenaltyService } from './penalties/PenaltyService';
import { ConsoleErrorReporter } from '../infrastructure/logging/ConsoleErrorReporter';
import { ConsoleLogger } from '../infrastructure/logging/ConsoleLogger';
@@ -102,7 +103,7 @@ export class ServiceFactory {
private static getDefaultInstance(): ServiceFactory {
if (!this.defaultInstance) {
this.defaultInstance = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
this.defaultInstance = new ServiceFactory(getWebsiteApiBaseUrl());
}
return this.defaultInstance;
}

View File

@@ -2,6 +2,7 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { createContext, ReactNode, useContext, useMemo } from 'react';
import { getWebsiteApiBaseUrl } from '../config/apiBaseUrl';
import { ServiceFactory } from './ServiceFactory';
// Import all service types
@@ -82,7 +83,7 @@ interface ServiceProviderProps {
export function ServiceProvider({ children }: ServiceProviderProps) {
const services = useMemo(() => {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const serviceFactory = new ServiceFactory(getWebsiteApiBaseUrl());
return {
raceService: serviceFactory.createRaceService(),