From 299376abe50b9645928eb93e06765671bf50c36a Mon Sep 17 00:00:00 2001
From: Brieuc Dubois <git@bhasher.com>
Date: Sat, 7 Dec 2024 22:49:47 +0200
Subject: [PATCH] Fix docker build & technical-debt

---
 backend/app/main.py          |  2 +-
 docker-compose.yaml          |  6 ++++--
 frontend/global.d.ts         |  6 ++++++
 frontend/package.json        |  2 +-
 frontend/src/hooks.server.ts | 14 +++++++++++---
 frontend/src/lib/config.ts   | 16 ++++++++++++----
 frontend/tailwind.config.js  |  5 +++--
 7 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/backend/app/main.py b/backend/app/main.py
index 77902752..77c75c3b 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -65,7 +65,7 @@ app.add_middleware(
     allow_headers=["*"],
 )
 
-apiRouter = APIRouter(prefix="/api")
+apiRouter = APIRouter(prefix="/tmp-api")
 v1Router = APIRouter(prefix="/v1")
 authRouter = APIRouter(prefix="/auth", tags=["auth"])
 usersRouter = APIRouter(prefix="/users", tags=["users"])
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 747c14f5..b2cc191a 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -11,6 +11,7 @@ services:
       - external
     labels:
       - "traefik.enable=true"
+      #- "traefik.http.routers.frontend.rule=Host(`languagelab.be`)"
       - "traefik.http.routers.frontend.rule=Host(`languagelab.sipr.ucl.ac.be`)"
       - "traefik.http.routers.frontend.tls=true"
       - "traefik.http.services.frontend.loadbalancer.server.port=8080"
@@ -25,7 +26,7 @@ services:
       - ADMIN_EMAIL=${LANGUAGELAB_ADMIN_EMAIL}
       - ADMIN_PASSWORD=${LANGUAGELAB_ADMIN_PASSWORD}
       - CALCOM_SECRET=${LANGUAGELAB_CALCOM_SECRET}
-      - ALLOWED_ORIGINS=https://languagelab.sipr.ucl.ac.be
+      - ALLOWED_ORIGINS=https://languagelab.be,https://api.languagelab.be
     volumes:
       - /mnt/data/languagelab/backend:/data
       - /etc/timezone:/etc/timezone:ro
@@ -36,7 +37,8 @@ services:
       - "traefik.enable=true"
       - "traefik.http.routers.backend.tls=true"
       - "traefik.http.services.backend.loadbalancer.server.port=8000"
-      - "traefik.http.routers.backend.rule=Host(`languagelab.sipr.ucl.ac.be`) && (PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
+      #- "traefik.http.routers.backend.rule=Host(`languagelab.be`) && (PathPrefix(`/tmp-api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
+      - "traefik.http.routers.backend.rule=Host(`languagelab.sipr.ucl.ac.be`) && (PathPrefix(`/tmp-api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
 
   traefik:
     container_name: traefik
diff --git a/frontend/global.d.ts b/frontend/global.d.ts
index a95b876f..f7cd09ec 100644
--- a/frontend/global.d.ts
+++ b/frontend/global.d.ts
@@ -6,3 +6,9 @@ declare module 'emoji-picker-element';
 interface ImportMetaEnv {
 	VITE_API_URL: string;
 }
+
+declare global {
+	interface RequestInit {
+		duplex?: string;
+	}
+}
diff --git a/frontend/package.json b/frontend/package.json
index bb074c8d..f0a6699c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -3,7 +3,7 @@
 	"version": "0.0.1",
 	"private": true,
 	"scripts": {
-		"dev": "VITE_API_URL=http://127.0.0.1:5173/api VITE_APP_URL=http://127.0.0.1:5173 VITE_WS_URL=ws://127.0.0.1:8000/api/v1/ws vite dev --host 127.0.0.1",
+		"dev": "VITE_API_URL=http://127.0.0.1:8000/tmp-api VITE_APP_URL=http://127.0.0.1:5173 VITE_WS_URL=ws://127.0.0.1:8000/tmp-api/v1/ws vite dev --host 127.0.0.1",
 		"build": "vite build",
 		"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts
index 1d4d7ef2..a600a147 100644
--- a/frontend/src/hooks.server.ts
+++ b/frontend/src/hooks.server.ts
@@ -1,20 +1,27 @@
 import { type Handle, type RequestEvent } from '@sveltejs/kit';
 import { jwtDecode } from 'jwt-decode';
 import { type JWTContent } from '$lib/utils/login';
+import config from '$lib/config';
 
-const API_BASE_URL = 'http://127.0.0.1:8000/api/v1';
 const PROXY_PATH = '/api';
 
 const handleApiProxy = async (event: RequestEvent, cookies: { name: string; value: string }[]) => {
 	const strippedPath = event.url.pathname.substring(PROXY_PATH.length);
 
-	const urlPath = `${API_BASE_URL}${strippedPath}${event.url.search}`;
+	console.log('redirect to ', `${config.API_URL}/v1${strippedPath}${event.url.search}`);
+	const urlPath = `${config.API_URL}/v1${strippedPath}${event.url.search}`;
 	const proxiedUrl = new URL(urlPath);
 
 	event.request.headers.delete('connection');
 	event.request.headers.set('cookie', cookies.map((c) => `${c.name}=${c.value}`).join('; '));
 
-	return event.fetch(proxiedUrl.toString(), event.request).catch((err: any) => {
+	return fetch(proxiedUrl.toString(), {
+		body: event.request.body,
+		method: event.request.method,
+		headers: event.request.headers,
+		// @ts-ignore: Duplex is missing
+		duplex: 'half'
+	}).catch((err: any) => {
 		console.log('Could not proxy API request: ', err);
 		throw err;
 	});
@@ -28,6 +35,7 @@ export const handle: Handle = async ({ event, resolve }) => {
 	const cookies = event.cookies.getAll();
 
 	if (event.url.pathname.startsWith(PROXY_PATH)) {
+		console.log(event.url.pathname);
 		return await handleApiProxy(event, cookies);
 	}
 
diff --git a/frontend/src/lib/config.ts b/frontend/src/lib/config.ts
index ca3b4dd9..9e42973b 100644
--- a/frontend/src/lib/config.ts
+++ b/frontend/src/lib/config.ts
@@ -1,8 +1,16 @@
 export default {
-	API_URL: import.meta.env.VITE_API_URL || 'https://languagelab.sipr.ucl.ac.be/api',
-	API_PROXY: import.meta.env.VITE_API_PROXY || 'https://languagelab.sipr.ucl.ac.be:8000',
-	APP_URL: import.meta.env.VITE_APP_URL || 'https://languagelab.sipr.ucl.ac.be',
-	WS_URL: import.meta.env.VITE_WS_URL || 'wss://languagelab.sipr.ucl.ac.be/api/v1/ws',
+	API_URL: import.meta.env.VITE_API_URL || 'https://languagelab.sipr.ucl.ac.be/tmp-api',
+	API_PROXY: import.meta.env.VITE_API_PROXY || 'https://languagelab.sipr.ucl.ac.be/tmp-api',
+	APP_URL: import.meta.env.VITE_APP_URL || 'https://languagelab.be',
+	WS_URL: import.meta.env.VITE_WS_URL || 'wss://languagelab.sipr.ucl.ac.be/tmp-api/v1/ws',
+	//API_URL: import.meta.env.VITE_API_URL || 'https://languagelab.be/tmp-api',
+	//API_PROXY: import.meta.env.VITE_API_PROXY || 'https://languagelab.be/tmp-api',
+	//WS_URL: import.meta.env.VITE_WS_URL || 'wss://languagelab.be/tmp-api/v1/ws',
+	//
+	//API_URL: import.meta.env.VITE_API_URL || 'https://api.languagelab.be/api',
+	//API_PROXY: import.meta.env.VITE_API_PROXY || 'https://api.languagelab.be',
+	//WS_URL: import.meta.env.VITE_WS_URL || 'wss://api.languagelab.be/api/v1/ws',
+	//
 	// 1 week - 2 hours
 	WEEKLY_SURVEY_INTERVAL: (7 * 24 - 2) * 60 * 60 * 1000,
 	LEARNING_LANGUAGES: {
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
index a29c48b7..0bf64d16 100644
--- a/frontend/tailwind.config.js
+++ b/frontend/tailwind.config.js
@@ -1,4 +1,5 @@
-/** @type {import('tailwindcss').Config} */
+import daisyui from 'daisyui';
+
 export default {
 	content: ['./src/**/*.{html,js,svelte,ts}'],
 	theme: {
@@ -8,7 +9,7 @@ export default {
 			}
 		}
 	},
-	plugins: [require('daisyui')],
+	plugins: [daisyui],
 	daisyui: {
 		themes: [
 			'bumblebee',
-- 
GitLab