Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(compass-saved-aggregation-queries): refactor of "My Queries" to support multiple connections COMPASS-7915 #5794

Closed
wants to merge 10 commits into from
Closed
2 changes: 2 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/compass-saved-aggregations-queries/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
"@mongodb-js/compass-workspaces": "^0.8.0",
"@mongodb-js/my-queries-storage": "^0.8.0",
"bson": "^6.6.0",
"compass-preferences-model": "^2.20.0",
"fuse.js": "^6.5.3",
"hadron-app-registry": "^9.1.11",
"mongodb-ns": "^2.4.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ import { editItem } from '../stores/edit-item';
import { confirmDeleteItem } from '../stores/delete-item';
import { copyToClipboard } from '../stores/copy-to-clipboard';
import { useTrackOnChange } from '@mongodb-js/compass-logging/provider';
import {
type ConnectionInfo,
useActiveConnections,
} from '@mongodb-js/compass-connections/provider';

const sortBy: { name: keyof Item; label: string }[] = [
{
Expand Down Expand Up @@ -73,7 +77,7 @@ export type AggregationsQueriesListProps = {
loading: boolean;
items: Item[];
onMount(): void;
onOpenItem(id: string): void;
onOpenItem(id: string, activeConnections: ConnectionInfo[]): void;
onEditItem(id: string): void;
onDeleteItem(id: string): void;
onCopyToClipboard(id: string): void;
Expand All @@ -92,6 +96,8 @@ export const AggregationsQueriesList = ({
void onMount();
}, [onMount]);

const activeConnections = useActiveConnections();

const {
controls: filterControls,
conditions: filters,
Expand Down Expand Up @@ -155,7 +161,7 @@ export const AggregationsQueriesList = ({
(id: string, actionName: Action) => {
switch (actionName) {
case 'open':
onOpenItem(id);
onOpenItem(id, activeConnections);
return;
case 'rename':
onEditItem(id);
Expand All @@ -168,7 +174,7 @@ export const AggregationsQueriesList = ({
return;
}
},
[onOpenItem, onEditItem, onDeleteItem, onCopyToClipboard]
[activeConnections, onOpenItem, onEditItem, onDeleteItem, onCopyToClipboard]
);

const renderItem: React.ComponentProps<typeof VirtualGrid>['renderItem'] =
Expand Down
46 changes: 37 additions & 9 deletions packages/compass-saved-aggregations-queries/src/index.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import type {
PipelineStorage,
FavoriteQueryStorage,
} from '@mongodb-js/my-queries-storage/provider';
import { ConnectionsManager } from '@mongodb-js/compass-connections/provider';
import { createNoopLoggerAndTelemetry } from '@mongodb-js/compass-logging/provider';
import { TestMongoDBInstanceManager } from '@mongodb-js/compass-app-stores/provider';
import type { PreferencesAccess } from 'compass-preferences-model/provider';

describe('AggregationsQueriesList', function () {
const sandbox = Sinon.createSandbox();
Expand All @@ -29,19 +33,43 @@ describe('AggregationsQueriesList', function () {
updateAttributes: sandbox.stub().resolves({}),
};

const Plugin = MyQueriesPlugin.withMockServices({
dataService,
instance,
favoriteQueryStorageAccess: {
getStorage() {
return queryStorage as unknown as FavoriteQueryStorage;
},
const connectionsManager = new ConnectionsManager({
logger: createNoopLoggerAndTelemetry().log.unbound,
});

const instancesManager = new TestMongoDBInstanceManager();

const preferencesAccess = {
getPreferences() {
return {
enableNewMultipleConnectionSystem: false,
};
},
pipelineStorage: pipelineStorage as unknown as PipelineStorage,
} as PreferencesAccess;
let Plugin: any;

beforeEach(function () {
sandbox
.stub(connectionsManager, 'getDataServiceForConnection')
.returns(dataService);
sandbox
.stub(instancesManager, 'getMongoDBInstanceForConnection')
.returns(instance);
Plugin = MyQueriesPlugin.withMockServices({
connectionsManager,
instancesManager,
preferencesAccess,
favoriteQueryStorageAccess: {
getStorage() {
return queryStorage as unknown as FavoriteQueryStorage;
},
},
pipelineStorage: pipelineStorage as unknown as PipelineStorage,
});
});

afterEach(function () {
sandbox.resetHistory();
sandbox.restore();
cleanup();
});

Expand Down
20 changes: 6 additions & 14 deletions packages/compass-saved-aggregations-queries/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import { registerHadronPlugin } from 'hadron-app-registry';
import {
connectionInfoAccessLocator,
dataServiceLocator,
type DataService,
type DataServiceLocator,
} from '@mongodb-js/compass-connections/provider';
import { mongoDBInstanceLocator } from '@mongodb-js/compass-app-stores/provider';
import { connectionsManagerLocator } from '@mongodb-js/compass-connections/provider';
import { mongoDBInstancesManagerLocator } from '@mongodb-js/compass-app-stores/provider';
import { createLoggerAndTelemetryLocator } from '@mongodb-js/compass-logging/provider';
import { activatePlugin } from './stores';
import AggregationsQueriesList from './components/aggregations-queries-list';
Expand All @@ -15,19 +10,16 @@ import {
pipelineStorageLocator,
favoriteQueryStorageAccessLocator,
} from '@mongodb-js/my-queries-storage/provider';
import { preferencesLocator } from 'compass-preferences-model/provider';

const serviceLocators = {
dataService: dataServiceLocator as DataServiceLocator<
// Getting passed to the mongodb instance so hard to be more explicit
// about used methods
keyof DataService
>,
instance: mongoDBInstanceLocator,
connectionsManager: connectionsManagerLocator,
instancesManager: mongoDBInstancesManagerLocator,
preferencesAccess: preferencesLocator,
logger: createLoggerAndTelemetryLocator('COMPASS-MY-QUERIES-UI'),
workspaces: workspacesServiceLocator,
pipelineStorage: pipelineStorageLocator,
favoriteQueryStorageAccess: favoriteQueryStorageAccessLocator,
connectionInfoAccess: connectionInfoAccessLocator,
};

export const MyQueriesPlugin = registerHadronPlugin<
Expand Down
26 changes: 12 additions & 14 deletions packages/compass-saved-aggregations-queries/src/stores/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,37 @@ import type { ThunkAction } from 'redux-thunk';
import itemsReducer from './aggregations-queries-items';
import openItemReducer from './open-item';
import editItemReducer from './edit-item';
import type {
ConnectionInfoAccess,
DataService,
} from '@mongodb-js/compass-connections/provider';
import type { MongoDBInstance } from '@mongodb-js/compass-app-stores/provider';
import { type ConnectionsManager } from '@mongodb-js/compass-connections/provider';
import type { MongoDBInstancesManager } from '@mongodb-js/compass-app-stores/provider';
import type { LoggerAndTelemetry } from '@mongodb-js/compass-logging/provider';
import type { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider';
import type {
FavoriteQueryStorageAccess,
PipelineStorage,
FavoriteQueryStorage,
} from '@mongodb-js/my-queries-storage/provider';
import type { PreferencesAccess } from 'compass-preferences-model';

type MyQueriesServices = {
dataService: DataService;
instance: MongoDBInstance;
connectionsManager: ConnectionsManager;
instancesManager: MongoDBInstancesManager;
preferencesAccess: PreferencesAccess;
globalAppRegistry: AppRegistry;
logger: LoggerAndTelemetry;
pipelineStorage?: PipelineStorage;
workspaces: ReturnType<typeof workspacesServiceLocator>;
favoriteQueryStorageAccess?: FavoriteQueryStorageAccess;
connectionInfoAccess: ConnectionInfoAccess;
};

export function configureStore({
globalAppRegistry,
dataService,
instance,
connectionsManager,
instancesManager,
preferencesAccess,
logger,
workspaces,
pipelineStorage,
favoriteQueryStorageAccess,
connectionInfoAccess,
}: MyQueriesServices) {
return createStore(
combineReducers({
Expand All @@ -49,13 +47,13 @@ export function configureStore({
applyMiddleware(
thunk.withExtraArgument({
globalAppRegistry,
dataService,
instance,
connectionsManager,
instancesManager,
preferencesAccess,
logger,
pipelineStorage,
queryStorage: favoriteQueryStorageAccess?.getStorage(),
workspaces,
connectionInfoAccess,
})
)
);
Expand Down