diff --git a/packages/backend/src/graphql/queries/healthcheck.js b/packages/backend/src/graphql/queries/healthcheck.js deleted file mode 100644 index 68bbeea0..00000000 --- a/packages/backend/src/graphql/queries/healthcheck.js +++ /dev/null @@ -1,9 +0,0 @@ -import appConfig from '../../config/app.js'; - -const healthcheck = () => { - return { - version: appConfig.version, - }; -}; - -export default healthcheck; diff --git a/packages/backend/src/graphql/queries/healthcheck.test.js b/packages/backend/src/graphql/queries/healthcheck.test.js deleted file mode 100644 index e590fa21..00000000 --- a/packages/backend/src/graphql/queries/healthcheck.test.js +++ /dev/null @@ -1,27 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import request from 'supertest'; -import app from '../../app'; -import appConfig from '../../config/app'; - -describe('graphQL healthcheck query', () => { - it('should return application version', async () => { - const query = ` - query { - healthcheck { - version - } - } - `; - - const response = await request(app) - .post('/graphql') - .send({ query }) - .expect(200); - - const expectedResponsePayload = { - data: { healthcheck: { version: appConfig.version } }, - }; - - expect(response.body).toEqual(expectedResponsePayload); - }); -}); diff --git a/packages/backend/src/graphql/query-resolvers.js b/packages/backend/src/graphql/query-resolvers.js index dc0eb649..60dadee9 100644 --- a/packages/backend/src/graphql/query-resolvers.js +++ b/packages/backend/src/graphql/query-resolvers.js @@ -21,7 +21,6 @@ import getSubscriptionStatus from './queries/get-subscription-status.ee.js'; import getTrialStatus from './queries/get-trial-status.ee.js'; import getUser from './queries/get-user.js'; import getUsers from './queries/get-users.js'; -import healthcheck from './queries/healthcheck.js'; import listSamlAuthProviders from './queries/list-saml-auth-providers.ee.js'; import testConnection from './queries/test-connection.js'; @@ -49,7 +48,6 @@ const queryResolvers = { getTrialStatus, getUser, getUsers, - healthcheck, listSamlAuthProviders, testConnection, }; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 9ccd9088..da091e00 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -37,7 +37,6 @@ type Query { getTrialStatus: GetTrialStatus getUser(id: String!): User getUsers(limit: Int!, offset: Int!): UserConnection - healthcheck: AppHealth listSamlAuthProviders: [ListSamlAuthProvider] } @@ -602,10 +601,6 @@ type ExecutionStepConnection { pageInfo: PageInfo } -type AppHealth { - version: String -} - type License { id: String name: String diff --git a/packages/backend/src/helpers/authentication.js b/packages/backend/src/helpers/authentication.js index 8d24b657..448d8777 100644 --- a/packages/backend/src/helpers/authentication.js +++ b/packages/backend/src/helpers/authentication.js @@ -44,7 +44,6 @@ export const authenticationRules = { '*': isAuthenticatedRule, getConfig: allow, getNotifications: allow, - healthcheck: allow, listSamlAuthProviders: allow, }, Mutation: { diff --git a/packages/web/src/components/Layout/index.jsx b/packages/web/src/components/Layout/index.jsx index 56410b4c..36d9e008 100644 --- a/packages/web/src/components/Layout/index.jsx +++ b/packages/web/src/components/Layout/index.jsx @@ -9,12 +9,14 @@ import SwapCallsIcon from '@mui/icons-material/SwapCalls'; import HistoryIcon from '@mui/icons-material/History'; import NotificationsIcon from '@mui/icons-material/Notifications'; import ArrowBackIosNew from '@mui/icons-material/ArrowBackIosNew'; + import * as URLS from 'config/urls'; import useFormatMessage from 'hooks/useFormatMessage'; import useVersion from 'hooks/useVersion'; import AppBar from 'components/AppBar'; import Drawer from 'components/Drawer'; import useConfig from 'hooks/useConfig'; + const drawerLinks = [ { Icon: SwapCallsIcon, @@ -35,6 +37,7 @@ const drawerLinks = [ dataTest: 'executions-page-drawer-link', }, ]; + const generateDrawerBottomLinks = async ({ disableNotificationsPage, notificationBadgeContent = 0, @@ -48,23 +51,30 @@ const generateDrawerBottomLinks = async ({ to: URLS.UPDATES, badgeContent: notificationBadgeContent, }; + const hasAdditionalDrawerLink = additionalDrawerLink && additionalDrawerLinkText; + const additionalDrawerLinkObject = { Icon: ArrowBackIosNew, primary: additionalDrawerLinkText || '', to: additionalDrawerLink || '', target: '_blank', }; + const links = []; + if (!disableNotificationsPage) { links.push(notificationsPageLinkObject); } + if (hasAdditionalDrawerLink) { links.push(additionalDrawerLinkObject); } + return links; }; + export default function PublicLayout({ children }) { const version = useVersion(); const { config, loading } = useConfig([ @@ -79,6 +89,7 @@ export default function PublicLayout({ children }) { const [isDrawerOpen, setDrawerOpen] = React.useState(!matchSmallScreens); const openDrawer = () => setDrawerOpen(true); const closeDrawer = () => setDrawerOpen(false); + React.useEffect(() => { async function perform() { const newBottomLinks = await generateDrawerBottomLinks({ @@ -90,9 +101,12 @@ export default function PublicLayout({ children }) { }); setBottomLinks(newBottomLinks); } + if (loading) return; + perform(); }, [config, loading, version.newVersionCount]); + return ( <> { + const { data } = await api.get('/v1/automatisch/version', { + signal, + }); + + return data; + }, + }); + const version = data?.data?.version; + const newVersionCount = notifications.reduce((count, notification) => { if (!version) return 0; // an unexpectedly invalid version would throw and thus, try-catch. @@ -16,6 +28,7 @@ export default function useVersion() { return count; } }, 0); + return { version, newVersionCount,