diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index a6d6afc90..459696ed5 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -510,7 +510,7 @@ const HoppGistCollectionsExporter: ImporterOrExporter = { const collectionJSON = await getCollectionJSON() const accessToken = currentUser.value?.accessToken - if (!accessToken) { + if (!accessToken || E.isLeft(collectionJSON)) { toast.error(t("error.something_went_wrong")) isHoppGistCollectionExporterInProgress.value = false return @@ -606,6 +606,7 @@ const selectedTeamID = computed(() => { }) const getCollectionJSON = async () => { + // TODO: Implement `getRESTCollectionJSONView` for team workspace if ( props.collectionsType.type === "team-collections" && props.collectionsType.selectedTeam?.teamID @@ -616,11 +617,31 @@ const getCollectionJSON = async () => { return E.isRight(res) ? E.right(res.right.exportCollectionsToJSON) - : E.left(res.left) + : E.left(res.left.error.toString()) } if (props.collectionsType.type === "my-collections") { - return E.right(JSON.stringify(myCollections.value, null, 2)) + if (!activeWorkspaceHandle.value) { + return E.left("INVALID_WORKSPACE_HANDLE") + } + + const collectionJSONHandleResult = + await workspaceService.getRESTCollectionJSONView( + activeWorkspaceHandle.value + ) + + if (E.isLeft(collectionJSONHandleResult)) { + return E.left(collectionJSONHandleResult.left.error) + } + + const collectionJSONHandle = collectionJSONHandleResult.right + + if (collectionJSONHandle.value.type === "invalid") { + // WORKSPACE_INVALIDATED + return E.left("WORKSPACE_INVALIDATED") + } + + return E.right(collectionJSONHandle.value.data.content) } return E.left("INVALID_SELECTED_TEAM_OR_INVALID_COLLECTION_TYPE") diff --git a/packages/hoppscotch-common/src/services/new-workspace/index.ts b/packages/hoppscotch-common/src/services/new-workspace/index.ts index 156fa0952..e7ad2fdb4 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/index.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/index.ts @@ -14,6 +14,7 @@ import { HandleRef } from "./handle" import { WorkspaceProvider } from "./provider" import { RESTCollectionChildrenView, + RESTCollectionJSONView, RESTCollectionLevelAuthHeadersView, RESTSearchResultsView, RootRESTCollectionView, @@ -721,6 +722,35 @@ export class NewWorkspaceService extends Service { return E.right(result.right) } + public async getRESTCollectionJSONView( + workspaceHandle: HandleRef + ): Promise< + E.Either< + WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, + HandleRef + > + > { + if (workspaceHandle.value.type === "invalid") { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) + } + + const provider = this.registeredProviders.get( + workspaceHandle.value.data.providerID + ) + + if (!provider) { + return E.left({ type: "SERVICE_ERROR", error: "INVALID_PROVIDER" }) + } + + const result = await provider.getRESTCollectionJSONView(workspaceHandle) + + if (E.isLeft(result)) { + return E.left({ type: "PROVIDER_ERROR", error: result.left }) + } + + return E.right(result.right) + } + public registerWorkspaceProvider(provider: WorkspaceProvider) { if (this.registeredProviders.has(provider.providerID)) { console.warn( diff --git a/packages/hoppscotch-common/src/services/new-workspace/provider.ts b/packages/hoppscotch-common/src/services/new-workspace/provider.ts index 79c2a487e..8a0fa4fb5 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/provider.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/provider.ts @@ -13,6 +13,7 @@ import { RESTCollectionChildrenView, RootRESTCollectionView, RESTSearchResultsView, + RESTCollectionJSONView, } from "./view" import { HoppCollection, HoppRESTRequest } from "@hoppscotch/data" @@ -35,17 +36,20 @@ export interface WorkspaceProvider { getRESTRootCollectionView( workspaceHandle: HandleRef - ): Promise>> + ): Promise>> getRESTCollectionChildrenView( collectionHandle: HandleRef - ): Promise>> + ): Promise>> getRESTCollectionLevelAuthHeadersView( collectionHandle: HandleRef - ): Promise>> + ): Promise>> getRESTSearchResultsView( workspaceHandle: HandleRef, searchQuery: Ref - ): Promise>> + ): Promise>> + getRESTCollectionJSONView( + workspaceHandle: HandleRef + ): Promise>> createRESTRootCollection( workspaceHandle: HandleRef, diff --git a/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts index 0da00120f..27ce66dba 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts @@ -43,6 +43,7 @@ import { HandleRef } from "~/services/new-workspace/handle" import { WorkspaceProvider } from "~/services/new-workspace/provider" import { RESTCollectionChildrenView, + RESTCollectionJSONView, RESTCollectionLevelAuthHeadersView, RESTCollectionViewItem, RESTSearchResultsView, @@ -1037,6 +1038,42 @@ export class PersonalWorkspaceProviderService ) } + public getRESTCollectionJSONView( + workspaceHandle: HandleRef + ): Promise>> { + return Promise.resolve( + E.right( + computed(() => { + if ( + !isValidWorkspaceHandle( + workspaceHandle, + this.providerID, + "personal" + ) + ) { + return { + type: "invalid" as const, + reason: "INVALID_WORKSPACE_HANDLE" as const, + } + } + + return markRaw({ + type: "ok" as const, + data: { + providerID: this.providerID, + workspaceID: workspaceHandle.value.data.workspaceID, + content: JSON.stringify( + this.restCollectionState.value.state, + null, + 2 + ), + }, + }) + }) + ) + ) + } + public getWorkspaceHandle( workspaceID: string ): Promise>> { diff --git a/packages/hoppscotch-common/src/services/new-workspace/view.ts b/packages/hoppscotch-common/src/services/new-workspace/view.ts index 7b81c6bef..401624306 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/view.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/view.ts @@ -55,3 +55,10 @@ export interface RESTSearchResultsView { results: Ref onSessionEnd: () => void } + +export interface RESTCollectionJSONView { + providerID: string + workspaceID: string + + content: string +}