import type { ApiSpec, CollectionChildDoc, CollectionWorkspaceChildren, DesignWorkspaceChildren, Environment, EnvironmentWorkspaceChildren, GrpcRequestMeta, McpRequest, McpWorkspaceChildren, MockServer, MockServerWorkspaceChildren, RequestGroup, RequestGroupMeta, RequestMeta, SocketIORequestMeta, WebSocketRequestMeta, Workspace, WorkspaceChildren, WorkspaceChildrenForScope, WorkspaceScope, } from 'insomnia-data'; import { database, models } from 'insomnia-data'; // Walk the given collection and group every request, request and request-group meta under it. export const getAllCollectionChildrenAndMetasByWorkspaceIds = async ( workspaceIds: string[], ): Promise> => { const allRequestsAndMetaByWorkspaceId = new Map(); if (workspaceIds.length === 0) { return allRequestsAndMetaByWorkspaceId; } let requestGroupIdQueue = [...workspaceIds]; const allRequestGroups: RequestGroup[] = []; // Map to track which workspace each request group belongs to const requestGroupToWorkspaceId = new Map(); const requestToWorkspaceId = new Map(); const grpcRequestToWorkspaceId = new Map(); const wsRequestToWorkspaceId = new Map(); const socketIORequestToWorkspaceId = new Map(); // Initialize the map with workspace IDs workspaceIds.forEach(workspaceId => { requestGroupToWorkspaceId.set(workspaceId, workspaceId); requestToWorkspaceId.set(workspaceId, workspaceId); grpcRequestToWorkspaceId.set(workspaceId, workspaceId); wsRequestToWorkspaceId.set(workspaceId, workspaceId); socketIORequestToWorkspaceId.set(workspaceId, workspaceId); allRequestsAndMetaByWorkspaceId.set(workspaceId, { data: { requestsAndGroups: [], }, dataMetas: { allRequestMetas: [], requestGroupMetas: [] }, }); }); while (requestGroupIdQueue.length) { const requestGroups = await database.find(models.requestGroup.type, { parentId: { $in: requestGroupIdQueue }, }); if (requestGroups.length === 0) { break; } requestGroups.forEach(requestGroup => { const workspaceId = requestGroupToWorkspaceId.get(requestGroup.parentId); if (workspaceId) { requestGroupToWorkspaceId.set(requestGroup._id, workspaceId); } }); allRequestGroups.push(...requestGroups); requestGroupIdQueue = requestGroups.map(rg => rg._id); } const listOfParentIds = [...workspaceIds, ...allRequestGroups.map(requestGroup => requestGroup._id)]; const [reqs, grpcReqs, wsReqs, socketIOReqs] = await Promise.all([ database.find(models.request.type, { parentId: { $in: listOfParentIds } }), database.find(models.grpcRequest.type, { parentId: { $in: listOfParentIds } }), database.find(models.webSocketRequest.type, { parentId: { $in: listOfParentIds } }), database.find(models.socketIORequest.type, { parentId: { $in: listOfParentIds } }), ]); const allRequests = [...reqs, ...allRequestGroups, ...grpcReqs, ...wsReqs, ...socketIOReqs] as CollectionChildDoc[]; const [requestMetas, grpcRequestMetas, requestGroupMetas, wsRequestMetas, socketIORequestMetas] = await Promise.all([ database.find(models.requestMeta.type, { parentId: { $in: reqs.map(r => r._id) } }), database.find(models.grpcRequestMeta.type, { parentId: { $in: grpcReqs.map(r => r._id) }, }), database.find(models.requestGroupMeta.type, { parentId: { $in: allRequestGroups.map(requestGroup => requestGroup._id) }, }), database.find(models.webSocketRequestMeta.type, { parentId: { $in: wsReqs.map(r => r._id) }, }), database.find(models.socketIORequestMeta.type, { parentId: { $in: socketIOReqs.map(r => r._id) }, }), ]); const allRequestMetas = [...requestMetas, ...grpcRequestMetas, ...wsRequestMetas, ...socketIORequestMetas]; // Associate requests with their workspace IDs and group request metas by workspace ID allRequests.forEach(request => { const { parentId, _id: requestId } = request; const workspaceId = requestGroupToWorkspaceId.get(parentId); if (workspaceId) { // Track which workspace this request belongs to if (models.grpcRequest.isGrpcRequest(request)) { grpcRequestToWorkspaceId.set(requestId, workspaceId); } else if (models.request.isRequest(request)) { requestToWorkspaceId.set(requestId, workspaceId); } else if (models.webSocketRequest.isWebSocketRequest(request)) { wsRequestToWorkspaceId.set(requestId, workspaceId); } else if (models.socketIORequest.isSocketIORequest(request)) { socketIORequestToWorkspaceId.set(requestId, workspaceId); } const workspaceData = allRequestsAndMetaByWorkspaceId.get(workspaceId); if (workspaceData) { workspaceData.data.requestsAndGroups.push(request); } } }); // Build map of requestGroupMetas by workspace ID requestGroupMetas.forEach(requestGroupMeta => { const workspaceId = requestGroupToWorkspaceId.get(requestGroupMeta.parentId); if (workspaceId) { const workspaceData = allRequestsAndMetaByWorkspaceId.get(workspaceId); if (workspaceData) { workspaceData.dataMetas.requestGroupMetas.push(requestGroupMeta); } } }); allRequestMetas.forEach(requestMeta => { const requestOrGrpcRequestId = requestMeta.parentId; let workspaceId: string | undefined; if (models.request.isRequestId(requestOrGrpcRequestId)) { workspaceId = requestToWorkspaceId.get(requestOrGrpcRequestId); } else if (models.grpcRequest.isGrpcRequestId(requestOrGrpcRequestId)) { workspaceId = grpcRequestToWorkspaceId.get(requestOrGrpcRequestId); } else if (models.webSocketRequest.isWebSocketRequestId(requestOrGrpcRequestId)) { workspaceId = wsRequestToWorkspaceId.get(requestOrGrpcRequestId); } else if (models.socketIORequest.isSocketIORequestId(requestOrGrpcRequestId)) { workspaceId = socketIORequestToWorkspaceId.get(requestOrGrpcRequestId); } if (workspaceId) { const workspaceData = allRequestsAndMetaByWorkspaceId.get(workspaceId); if (workspaceData) { workspaceData.dataMetas.allRequestMetas.push(requestMeta); } } }); return allRequestsAndMetaByWorkspaceId; }; export const getAllDesignChildrenByWorkspaceIds = async (workspaceIds: string[]) => { const map = new Map(); if (workspaceIds.length > 0) { const apiSpecs = await database.find(models.apiSpec.type, { parentId: { $in: workspaceIds }, }); const designRequestsAndMetas = await getAllCollectionChildrenAndMetasByWorkspaceIds(workspaceIds); workspaceIds.forEach(workspaceId => { map.set(workspaceId, { data: { apiSpec: apiSpecs.find(apiSpec => apiSpec.parentId === workspaceId), requestsAndGroups: designRequestsAndMetas.get(workspaceId)?.data.requestsAndGroups || [], }, dataMetas: { allRequestMetas: designRequestsAndMetas.get(workspaceId)?.dataMetas.allRequestMetas || [], requestGroupMetas: designRequestsAndMetas.get(workspaceId)?.dataMetas.requestGroupMetas || [], }, }); }); } return map; }; export const getAllMcpChildrenByWorkspaceIds = async (workspaceIds: string[]) => { const map = new Map(); if (workspaceIds.length > 0) { const mcpRequests = await database.find(models.mcpRequest.type, { parentId: { $in: workspaceIds }, }); workspaceIds.forEach(workspaceId => { map.set(workspaceId, { data: { mcpRequest: mcpRequests.find(mcpRequest => mcpRequest.parentId === workspaceId)!, }, dataMetas: {}, }); }); } return map; }; export const getAllEnvironmentChildrenByWorkspaceIds = async (workspaceIds: string[]) => { const map = new Map(); if (workspaceIds.length > 0) { const environments = await database.find(models.environment.type, { parentId: { $in: workspaceIds }, }); workspaceIds.forEach(workspaceId => { map.set(workspaceId, { data: { baseEnvironment: environments.find(environment => environment.parentId === workspaceId)!, }, dataMetas: {}, }); }); } return map; }; export const getAllMockServerChildrenByWorkspaceIds = async (workspaceIds: string[]) => { const map = new Map(); if (workspaceIds.length > 0) { const mockServers = await database.find(models.mockServer.type, { parentId: { $in: workspaceIds }, }); workspaceIds.forEach(workspaceId => { map.set(workspaceId, { data: { mockServer: mockServers.find(mockServer => mockServer.parentId === workspaceId), }, dataMetas: {}, }); }); } return map; }; export const getWorkspaceChildren = async ( workspaceIds: string[], scope?: S, ): Promise>> => { if (scope) { switch (scope) { case 'design': { const designChildrenByWorkspaceIds = await getAllDesignChildrenByWorkspaceIds(workspaceIds); return designChildrenByWorkspaceIds as Map>; } case 'collection': { const collectionChildrenByWorkspaceIds = await getAllCollectionChildrenAndMetasByWorkspaceIds(workspaceIds); return collectionChildrenByWorkspaceIds as Map>; } case 'mock-server': { const mockServerChildrenByWorkspaceIds = await getAllMockServerChildrenByWorkspaceIds(workspaceIds); return mockServerChildrenByWorkspaceIds as Map>; } case 'environment': { const environmentChildrenByWorkspaceIds = await getAllEnvironmentChildrenByWorkspaceIds(workspaceIds); return environmentChildrenByWorkspaceIds as Map>; } case 'mcp': { const mcpChildrenByWorkspaceIds = await getAllMcpChildrenByWorkspaceIds(workspaceIds); return mcpChildrenByWorkspaceIds as Map>; } default: { console.warn(`Unsupported workspace scope: ${scope}`); return new Map(); } } } const workspaces = await database.find(models.workspace.type, { _id: { $in: workspaceIds }, }); if (workspaces.length > 0) { const workspaceIdToScopeMap = new Map(workspaces.map(workspace => [workspace._id, workspace.scope])); const collectionWorkspaceIds = workspaces.filter(w => w.scope === 'collection').map(w => w._id); const mockServerWorkspaceIds = workspaces.filter(w => w.scope === 'mock-server').map(w => w._id); const designWorkspaceIds = workspaces.filter(w => w.scope === 'design').map(w => w._id); const environmentWorkspaceIds = workspaces.filter(w => w.scope === 'environment').map(w => w._id); const mcpWorkspaceIds = workspaces.filter(w => w.scope === 'mcp').map(w => w._id); const collectionChildrenPromise = getAllCollectionChildrenAndMetasByWorkspaceIds(collectionWorkspaceIds); const mockServerChildrenPromise = getAllMockServerChildrenByWorkspaceIds(mockServerWorkspaceIds); const designChildrenPromise = getAllDesignChildrenByWorkspaceIds(designWorkspaceIds); const environmentChildrenPromise = getAllEnvironmentChildrenByWorkspaceIds(environmentWorkspaceIds); const mcpChildrenPromise = getAllMcpChildrenByWorkspaceIds(mcpWorkspaceIds); const [ collectionChildrenByWorkspaceIds, mockServerChildrenByWorkspaceIds, designChildrenByWorkspaceIds, environmentChildrenByWorkspaceIds, mcpChildrenByWorkspaceIds, ] = await Promise.all([ collectionChildrenPromise, mockServerChildrenPromise, designChildrenPromise, environmentChildrenPromise, mcpChildrenPromise, ]); const map = new Map(); workspaceIds.forEach(workspaceId => { const scope = workspaceIdToScopeMap.get(workspaceId); if (scope === 'collection') { map.set(workspaceId, collectionChildrenByWorkspaceIds.get(workspaceId)!); } else if (scope === 'mock-server') { map.set(workspaceId, mockServerChildrenByWorkspaceIds.get(workspaceId)!); } else if (scope === 'design') { map.set(workspaceId, designChildrenByWorkspaceIds.get(workspaceId)!); } else if (scope === 'environment') { map.set(workspaceId, environmentChildrenByWorkspaceIds.get(workspaceId)!); } else if (scope === 'mcp') { map.set(workspaceId, mcpChildrenByWorkspaceIds.get(workspaceId)!); } else { console.warn(`Unsupported workspace scope: ${scope} for workspace ${workspaceId}`); } }); return map as Map>; } return new Map(); };