diff --git a/package-lock.json b/package-lock.json index 83c34648cc9..97630108522 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47881,6 +47881,7 @@ "electron": "^37.8.0", "hadron-ipc": "^3.5.21", "lodash": "^4.17.21", + "mongodb-ns": "^3.0.3", "react": "^17.0.2", "redux": "^4.2.1", "redux-thunk": "^2.4.2" @@ -47911,6 +47912,12 @@ "node": ">=0.3.1" } }, + "packages/atlas-service/node_modules/mongodb-ns": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.0.3.tgz", + "integrity": "sha512-ctpHlSXGYlIim3JSgcsQjNkgB4CWvwWSFIxKFphSY/MoY/2i6E5rtVkOt1FBbSjEJYa2XvD4c+G2BbLfjhQqaQ==", + "license": "Apache-2.0" + }, "packages/atlas-service/node_modules/sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -48630,6 +48637,7 @@ "license": "SSPL", "dependencies": { "@faker-js/faker": "^9.0.0", + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-app-stores": "^7.72.0", "@mongodb-js/compass-components": "^1.57.1", @@ -52479,6 +52487,7 @@ "version": "5.86.0", "license": "SSPL", "dependencies": { + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-app-stores": "^7.72.0", "@mongodb-js/compass-components": "^1.57.1", @@ -53388,11 +53397,11 @@ "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-components": "^1.57.1", "@mongodb-js/compass-connections": "^1.86.0", - "@mongodb-js/compass-logging": "^1.7.23", "@mongodb-js/compass-telemetry": "^1.19.1", "@mongodb-js/compass-workspaces": "^0.67.0", "compass-preferences-model": "^2.64.0", "react": "^17.0.2", + "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, @@ -54411,6 +54420,7 @@ "version": "1.83.0", "license": "SSPL", "dependencies": { + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-components": "^1.57.1", "@mongodb-js/compass-connections": "^1.86.0", "@mongodb-js/compass-telemetry": "^1.19.1", @@ -62852,6 +62862,7 @@ "hadron-ipc": "^3.5.21", "lodash": "^4.17.21", "mocha": "^10.2.0", + "mongodb-ns": "^3.0.3", "nyc": "^15.1.0", "react": "^17.0.2", "redux": "^4.2.1", @@ -62866,6 +62877,11 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "mongodb-ns": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.0.3.tgz", + "integrity": "sha512-ctpHlSXGYlIim3JSgcsQjNkgB4CWvwWSFIxKFphSY/MoY/2i6E5rtVkOt1FBbSjEJYa2XvD4c+G2BbLfjhQqaQ==" + }, "sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -63304,6 +63320,7 @@ "version": "file:packages/compass-collection", "requires": { "@faker-js/faker": "^9.0.0", + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-app-stores": "^7.72.0", "@mongodb-js/compass-components": "^1.57.1", @@ -66275,6 +66292,7 @@ "@mongodb-js/compass-sidebar": { "version": "file:packages/compass-sidebar", "requires": { + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-app-stores": "^7.72.0", "@mongodb-js/compass-components": "^1.57.1", @@ -67023,7 +67041,6 @@ "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-components": "^1.57.1", "@mongodb-js/compass-connections": "^1.86.0", - "@mongodb-js/compass-logging": "^1.7.23", "@mongodb-js/compass-telemetry": "^1.19.1", "@mongodb-js/compass-workspaces": "^0.67.0", "@mongodb-js/eslint-config-compass": "^1.4.12", @@ -67043,6 +67060,7 @@ "mocha": "^10.2.0", "nyc": "^15.1.0", "react": "^17.0.2", + "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2", "sinon": "^9.2.3", @@ -67481,6 +67499,7 @@ "@mongodb-js/databases-collections-list": { "version": "file:packages/databases-collections-list", "requires": { + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-components": "^1.57.1", "@mongodb-js/compass-connections": "^1.86.0", "@mongodb-js/compass-telemetry": "^1.19.1", diff --git a/packages/atlas-service/package.json b/packages/atlas-service/package.json index 408f4c28b56..7963a19ca02 100644 --- a/packages/atlas-service/package.json +++ b/packages/atlas-service/package.json @@ -83,6 +83,7 @@ "electron": "^37.8.0", "hadron-ipc": "^3.5.21", "lodash": "^4.17.21", + "mongodb-ns": "^3.0.3", "react": "^17.0.2", "redux": "^4.2.1", "redux-thunk": "^2.4.2" diff --git a/packages/atlas-service/src/provider.tsx b/packages/atlas-service/src/provider.tsx index c4786939a91..bf35540122b 100644 --- a/packages/atlas-service/src/provider.tsx +++ b/packages/atlas-service/src/provider.tsx @@ -1,3 +1,5 @@ +export * from './url-builders'; + import React, { createContext, useContext, useMemo } from 'react'; import type { AtlasAuthService } from './atlas-auth-service'; import { AtlasService, type AtlasServiceOptions } from './atlas-service'; diff --git a/packages/atlas-service/src/url-builders.ts b/packages/atlas-service/src/url-builders.ts new file mode 100644 index 00000000000..857ce2e1085 --- /dev/null +++ b/packages/atlas-service/src/url-builders.ts @@ -0,0 +1,51 @@ +import toNS from 'mongodb-ns'; +import type { AtlasClusterMetadata } from '@mongodb-js/connection-info'; + +export function buildPerformanceMetricsUrl({ + projectId, + metricsType, + metricsId, +}: AtlasClusterMetadata): string { + const url = new URL(`/v2/${projectId}`, window.location.origin); + return `${url}#/host/${metricsType}/${metricsId}/realtime/panel`; +} + +export function buildMonitoringUrl({ + projectId, + metricsType, + metricsId, +}: AtlasClusterMetadata): string { + const url = new URL(`/v2/${projectId}`, window.location.origin); + return `${url}#/host/${metricsType}/${metricsId}`; +} + +export function buildClusterOverviewUrl({ + projectId, + clusterName, +}: AtlasClusterMetadata): string { + const url = new URL(`/v2/${projectId}`, window.location.origin); + return `${url}#/clusters/detail/${clusterName}`; +} + +export function buildQueryInsightsUrl({ + projectId, + metricsType, + metricsId, +}: AtlasClusterMetadata): string { + const url = new URL(`/v2/${projectId}`, window.location.origin); + return `${url}#/metrics/${metricsType}/${metricsId}/queryInsights/shape`; +} + +export function buildChartsUrl( + { projectId, clusterName }: AtlasClusterMetadata, + namespace?: string +): string { + const { database } = toNS(namespace ?? ''); + const url = new URL(`/charts/${projectId}`, window.location.origin); + url.searchParams.set('sourceType', 'cluster'); + url.searchParams.set('name', clusterName); + if (database) { + url.searchParams.set('database', database); + } + return `${url}`; +} diff --git a/packages/compass-collection/package.json b/packages/compass-collection/package.json index 176fde6ccce..bd109dade2c 100644 --- a/packages/compass-collection/package.json +++ b/packages/compass-collection/package.json @@ -49,6 +49,7 @@ }, "dependencies": { "@faker-js/faker": "^9.0.0", + "@mongodb-js/atlas-service": "^0.70.0", "@mongodb-js/compass-app-registry": "^9.4.27", "@mongodb-js/compass-app-stores": "^7.72.0", "@mongodb-js/compass-components": "^1.57.1", diff --git a/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx b/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx index 35238ca9b7f..a1ef5f33167 100644 --- a/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx +++ b/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx @@ -30,6 +30,10 @@ import { type SchemaAnalysisError, } from '../../schema-analysis-types'; import { MAX_COLLECTION_NESTING_DEPTH } from '../mock-data-generator-modal/utils'; +import { + buildChartsUrl, + buildMonitoringUrl, +} from '@mongodb-js/atlas-service/provider'; const collectionHeaderActionsStyles = css({ display: 'flex', @@ -46,20 +50,6 @@ const tooltipMessageStyles = css({ }, }); -function buildChartsUrl( - groupId: string, - clusterName: string, - namespace: string -) { - const { database, collection } = toNS(namespace); - const url = new URL(`/charts/${groupId}`, window.location.origin); - url.searchParams.set('sourceType', 'cluster'); - url.searchParams.set('name', clusterName); - url.searchParams.set('database', database); - url.searchParams.set('collection', collection); - return url.toString(); -} - type CollectionHeaderActionsProps = { namespace: string; isReadonly: boolean; @@ -234,15 +224,23 @@ const CollectionHeaderActions: React.FunctionComponent< )} + {atlasMetadata && ( + + )} {atlasMetadata && ( )} - + {connectionInfo.atlasMetadata && ( + + )} {connectionInfo.atlasMetadata && (