diff --git a/app/components/analysis/logs/ContainerLogs.vue b/app/components/analysis/logs/ContainerLogs.vue index bc4913c..f473c4b 100644 --- a/app/components/analysis/logs/ContainerLogs.vue +++ b/app/components/analysis/logs/ContainerLogs.vue @@ -25,7 +25,7 @@ const { data: response, status, error, -} = await getAnalysisLogs(analysisId, { limit: null }); +} = await getAnalysisLogs(analysisId); const lastFetchedAt = ref(null); @@ -93,7 +93,6 @@ async function refreshLogs() { const result = await useNuxtApp() .$hubApi(`/logs/${analysisId}`, { method: "GET", - query: { limit: null }, }) .catch(() => undefined); if (result) { diff --git a/app/services/hub_adapter_swagger.json b/app/services/hub_adapter_swagger.json index 270d2fd..44522ed 100644 --- a/app/services/hub_adapter_swagger.json +++ b/app/services/hub_adapter_swagger.json @@ -2892,7 +2892,6 @@ } ], "description": "Maximum number of log lines to return per container", - "default": 1000, "title": "Limit" }, "description": "Maximum number of log lines to return per container" @@ -3011,9 +3010,15 @@ "in": "query", "required": false, "schema": { - "type": "integer", + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], "description": "Maximum number of log lines to return per container", - "default": 1000, "title": "Limit" }, "description": "Maximum number of log lines to return per container" @@ -3133,11 +3138,11 @@ "required": false, "schema": { "type": "integer", - "description": "Maximum number of raw log entries to return", + "description": "Maximum number of analysis groups to return", "default": 1000, "title": "Limit" }, - "description": "Maximum number of raw log entries to return" + "description": "Maximum number of analysis groups to return" } ], "responses": { diff --git a/nuxt.config.ts b/nuxt.config.ts index 9d8ad16..a27faa0 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -2,6 +2,10 @@ import { defineNuxtConfig } from "nuxt/config"; import { Flame } from "./app/assets/primevue/flame-preset"; import tailwindcss from "@tailwindcss/vite"; +import { fileURLToPath } from "node:url"; +import { join } from "node:path"; + +const projectRoot = fileURLToPath(new URL(".", import.meta.url)); export default defineNuxtConfig({ ssr: false, @@ -69,8 +73,14 @@ export default defineNuxtConfig({ "~/assets/css/preferences.css", ], + // @ts-expect-error nitro is a valid config key not fully typed in this nuxt version + nitro: { + alias: { + "node-fetch-native/proxy": join(projectRoot, "node_modules/node-fetch-native/dist/proxy.cjs"), + }, + }, + vite: { - // @ts-expect-error plugin complaint plugins: [tailwindcss()], }, diff --git a/package.json b/package.json index e2838d8..a9fe937 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "chart.js": "^4.5.1", "globals": "^15.15.0", "next-auth": "~4.21.1", + "node-fetch-native": "^1.6.7", "nuxt": "^4.4.6", "pinia": "^3.0.4", "prettier": "^3.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cb5092..54f7a10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,6 +52,9 @@ importers: next-auth: specifier: ~4.21.1 version: 4.21.1(patch_hash=be804a50721ec4d24d9187f1dbb3057252a47eef6275eedcc8684444349d1c1d)(next@13.5.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + node-fetch-native: + specifier: ^1.6.7 + version: 1.6.7 nuxt: specifier: ^4.4.6 version: 4.4.6(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.3.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@9.26.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.31.1)(magicast@0.5.3)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.28(typescript@5.9.3)))(rollup-plugin-visualizer@7.0.1(rollup@4.60.4))(rollup@4.60.4)(sass@1.97.3)(srvx@0.11.15)(terser@5.47.1)(typescript@5.9.3)(vite@7.3.3(@types/node@25.3.0)(jiti@2.7.0)(lightningcss@1.31.1)(sass@1.97.3)(terser@5.47.1)(yaml@2.9.0))(yaml@2.9.0) diff --git a/server/routes/flame/api/auth/[...].ts b/server/routes/flame/api/auth/[...].ts index 306130a..f36c007 100644 --- a/server/routes/flame/api/auth/[...].ts +++ b/server/routes/flame/api/auth/[...].ts @@ -1,8 +1,10 @@ +import { createProxy } from "node-fetch-native/proxy"; import KeycloakProvider from "next-auth/providers/keycloak"; import AuthentikProvider from "next-auth/providers/authentik"; import OktaProvider from "next-auth/providers/okta"; import OneLoginProvider from "next-auth/providers/onelogin"; import ZitadelProvider from "next-auth/providers/zitadel"; +import type { Account, Session, User } from "next-auth"; import type { JWT } from "next-auth/jwt"; import { NuxtAuthHandler } from "#auth"; @@ -146,12 +148,16 @@ async function refreshAccessToken(token: JWT) { const clientIssuer = process.env.NUXT_PUBLIC_IDP_ISSUER ?? "http://localhost:8080/realms/flame"; + const proxy = createProxy(); + const discovery = await fetch( `${clientIssuer}/.well-known/openid-configuration`, + proxy as RequestInit, ).then((r) => r.json()); const tokenEndpoint: string = discovery.token_endpoint; const response = await fetch(tokenEndpoint, { + ...(proxy as RequestInit), headers: { "Content-Type": "application/x-www-form-urlencoded" }, method: "POST", body: new URLSearchParams({ @@ -177,13 +183,14 @@ async function refreshAccessToken(token: JWT) { export default NuxtAuthHandler({ secret: useRuntimeConfig().authSecret, events: { - async signIn({ account }) { + async signIn({ account }: { account: Account | null }) { // After successful sign in const hubAdapterApi = process.env.NUXT_PUBLIC_HUB_ADAPTER_URL; if (!hubAdapterApi || !account?.access_token) return; const signInEndpoint = `${hubAdapterApi.replace(/\/$/, "")}/events/signin`; try { await fetch(signInEndpoint, { + ...(createProxy() as RequestInit), headers: { Authorization: `Bearer ${account.access_token}` }, method: "POST", }); @@ -191,13 +198,14 @@ export default NuxtAuthHandler({ console.error("Failed to log sign-in event:", error); } }, - async signOut({ token }) { + async signOut({ token }: { session: Session; token: JWT }) { // After successful sign out const hubAdapterApi = process.env.NUXT_PUBLIC_HUB_ADAPTER_URL; if (!hubAdapterApi || !token?.access_token) return; const signOutEndpoint = `${hubAdapterApi.replace(/\/$/, "")}/events/signout`; try { await fetch(signOutEndpoint, { + ...(createProxy() as RequestInit), headers: { Authorization: `Bearer ${token.access_token}` }, method: "POST", }); @@ -208,7 +216,7 @@ export default NuxtAuthHandler({ }, callbacks: { /* on session retrieval */ - async session({ session, token }) { + async session({ session, token }: { session: Session; token: JWT }) { return { ...session, accessToken: token.access_token, @@ -216,7 +224,15 @@ export default NuxtAuthHandler({ }; }, /* on JWT token creation or mutation */ - async jwt({ token, account, user }) { + async jwt({ + token, + account, + user, + }: { + token: JWT; + account: Account | null; + user: User; + }) { if (account && user) { if (account.type === "credentials") { // CredentialsProvider (Hub password grant): tokens live on the user object