Add X-User-ID header to all FastAPI ML service proxy routes

- Add X-User-ID header containing user.id to all fetch calls from proxy routes
- Updated routes: /api/predict, /api/predict/batch, /api/model/info, /api/model/load, /api/patterns/detect, /api/patterns/available, /api/training/start, /api/training/runs
- Enables user scoping on the FastAPI ML service side

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marko Djordjevic 2026-02-20 13:12:25 +01:00
parent 685639a0d3
commit bd668589b6
10 changed files with 10 additions and 7 deletions

View file

@ -21,6 +21,7 @@ export async function GET(request: NextRequest) {
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.API_KEY || '',
'X-User-ID': user.id,
},
signal: controller.signal,
});

View file

@ -34,7 +34,7 @@ export async function POST(request: NextRequest) {
const response = await fetch(`${INFERENCE_API_URL}/model/load`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '' },
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '', 'X-User-ID': user.id },
body: JSON.stringify(validatedBody),
signal: controller.signal,
});

View file

@ -16,7 +16,7 @@ export async function GET(_request: NextRequest) {
try {
const response = await fetch(`${INFERENCE_API_URL}/patterns/available`, {
method: 'GET',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '' },
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '', 'X-User-ID': user.id },
signal: controller.signal,
});
clearTimeout(timeoutId);

View file

@ -45,7 +45,7 @@ export async function POST(request: NextRequest) {
const response = await fetch(`${INFERENCE_API_URL}/patterns/detect`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '' },
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '', 'X-User-ID': user.id },
body: JSON.stringify(validatedBody),
signal: controller.signal,
});

View file

@ -41,6 +41,7 @@ export async function POST(request: NextRequest) {
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.API_KEY || '',
'X-User-ID': user.id,
},
body: JSON.stringify(validatedBody),
signal: controller.signal,

View file

@ -49,6 +49,7 @@ export async function POST(request: NextRequest) {
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.API_KEY || '',
'X-User-ID': user.id,
},
body: JSON.stringify(validatedBody),
signal: controller.signal,

View file

@ -16,7 +16,7 @@ export async function GET(_request: NextRequest) {
try {
const response = await fetch(`${INFERENCE_API_URL}/training/runs`, {
method: 'GET',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '' },
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '', 'X-User-ID': user.id },
signal: controller.signal,
});
clearTimeout(timeoutId);

View file

@ -35,7 +35,7 @@ export async function POST(request: NextRequest) {
const response = await fetch(`${INFERENCE_API_URL}/training/start`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '' },
headers: { 'Content-Type': 'application/json', 'X-API-Key': process.env.API_KEY || '', 'X-User-ID': user.id },
body: JSON.stringify(validatedBody),
signal: controller.signal,
});