From bf98009abbd57773d9ca605ec79467486eaa8e39 Mon Sep 17 00:00:00 2001 From: Nivedin <53208152+nivedin@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:42:05 +0530 Subject: [PATCH] fix: request variable version syncing bug (#3889) Co-authored-by: jamesgeorge007 --- .../src/helpers/import-export/import/hopp.ts | 28 ++++++---------- .../hoppscotch-data/src/collection/index.ts | 4 --- packages/hoppscotch-data/src/rest/v/2.ts | 16 +--------- .../collections/collections.platform.ts | 32 ++++++++++++------- .../collections/collections.platform.ts | 32 +++++++++++-------- 5 files changed, 49 insertions(+), 63 deletions(-) diff --git a/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts b/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts index 723b2af77..2e144ce28 100644 --- a/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts +++ b/packages/hoppscotch-common/src/helpers/import-export/import/hopp.ts @@ -4,11 +4,12 @@ import * as O from "fp-ts/Option" import * as RA from "fp-ts/ReadonlyArray" import * as A from "fp-ts/Array" import { translateToNewRESTCollection, HoppCollection } from "@hoppscotch/data" -import { isPlainObject as _isPlainObject } from "lodash-es" import { IMPORTER_INVALID_FILE_FORMAT } from "." import { safeParseJSON } from "~/helpers/functional/json" import { translateToNewGQLCollection } from "@hoppscotch/data" +import { entityReference } from "verzod" +import { z } from "zod" export const hoppRESTImporter = (content: string[]) => pipe( @@ -26,26 +27,14 @@ export const hoppRESTImporter = (content: string[]) => TE.fromOption(() => IMPORTER_INVALID_FILE_FORMAT) ) -/** - * checks if a value is a plain object - */ -const isPlainObject = (value: any): value is object => _isPlainObject(value) - -/** - * checks if a collection matches the schema for a hoppscotch collection. - * here 2 is the latest version of the schema. - */ -const isValidCollection = (collection: unknown): collection is HoppCollection => - isPlainObject(collection) && "v" in collection && collection.v === 2 - /** * checks if a collection is a valid hoppscotch collection. * else translate it into one. */ const validateCollection = (collection: unknown) => { - if (isValidCollection(collection)) { - return O.some(collection) - } + const result = entityReference(HoppCollection).safeParse(collection) + if (result.success) return O.some(result.data) + return O.some(translateToNewRESTCollection(collection)) } @@ -75,8 +64,9 @@ export const hoppGQLImporter = (content: string) => * @returns the collection if it is valid, else a translated version of the collection */ export const validateGQLCollection = (collection: unknown) => { - if (isValidCollection(collection)) { - return O.some(collection) - } + const result = z.array(entityReference(HoppCollection)).safeParse(collection) + + if (result.success) return O.some(result.data) + return O.some(translateToNewGQLCollection(collection)) } diff --git a/packages/hoppscotch-data/src/collection/index.ts b/packages/hoppscotch-data/src/collection/index.ts index ee01b7098..47e5180c1 100644 --- a/packages/hoppscotch-data/src/collection/index.ts +++ b/packages/hoppscotch-data/src/collection/index.ts @@ -52,8 +52,6 @@ export function makeCollection(x: Omit): HoppCollection { * @returns The proper new collection format */ export function translateToNewRESTCollection(x: any): HoppCollection { - if (x.v && x.v === CollectionSchemaVersion) return x - // Legacy const name = x.name ?? "Untitled" const folders = (x.folders ?? []).map(translateToNewRESTCollection) @@ -81,8 +79,6 @@ export function translateToNewRESTCollection(x: any): HoppCollection { * @returns The proper new collection format */ export function translateToNewGQLCollection(x: any): HoppCollection { - if (x.v && x.v === CollectionSchemaVersion) return x - // Legacy const name = x.name ?? "Untitled" const folders = (x.folders ?? []).map(translateToNewGQLCollection) diff --git a/packages/hoppscotch-data/src/rest/v/2.ts b/packages/hoppscotch-data/src/rest/v/2.ts index 6c257e2ca..894a37271 100644 --- a/packages/hoppscotch-data/src/rest/v/2.ts +++ b/packages/hoppscotch-data/src/rest/v/2.ts @@ -18,22 +18,8 @@ export const HoppRESTRequestVariables = z.array( export type HoppRESTRequestVariables = z.infer -const V2_SCHEMA = z.object({ +const V2_SCHEMA = V1_SCHEMA.extend({ v: z.literal("2"), - id: z.optional(z.string()), // Firebase Firestore ID - - name: z.string(), - method: z.string(), - endpoint: z.string(), - params: HoppRESTParams, - headers: HoppRESTHeaders, - preRequestScript: z.string().catch(""), - testScript: z.string().catch(""), - - auth: HoppRESTAuth, - - body: HoppRESTReqBody, - requestVariables: HoppRESTRequestVariables, }) diff --git a/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts index 7748b0148..dfbe75daa 100644 --- a/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts +++ b/packages/hoppscotch-selfhost-desktop/src/platform/collections/collections.platform.ts @@ -112,10 +112,15 @@ function exportedCollectionToHoppCollection( folders: restCollection.folders.map((folder) => exportedCollectionToHoppCollection(folder, collectionType) ), - requests: restCollection.requests.map( - ({ - id, + requests: restCollection.requests.map((request) => { + const requestParsedResult = HoppRESTRequest.safeParse(request) + if (requestParsedResult.type === "ok") { + return requestParsedResult.value + } + + const { v, + id, auth, body, endpoint, @@ -125,20 +130,23 @@ function exportedCollectionToHoppCollection( params, preRequestScript, testScript, - }) => ({ - id, + requestVariables, + } = request + return { v, - auth, - body, - endpoint, - headers, - method, + id, name, + endpoint, + method, params, + requestVariables: requestVariables, + auth, + headers, + body, preRequestScript, testScript, - }) - ), + } + }), } } else { const gqlCollection = collection as ExportedUserCollectionGQL diff --git a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts index 67c6c39e7..88b057062 100644 --- a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts +++ b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts @@ -120,10 +120,15 @@ function exportedCollectionToHoppCollection( folders: restCollection.folders.map((folder) => exportedCollectionToHoppCollection(folder, collectionType) ), - requests: restCollection.requests.map( - ({ - id, + requests: restCollection.requests.map((request) => { + const requestParsedResult = HoppRESTRequest.safeParse(request) + if (requestParsedResult.type === "ok") { + return requestParsedResult.value + } + + const { v, + id, auth, body, endpoint, @@ -134,21 +139,22 @@ function exportedCollectionToHoppCollection( preRequestScript, testScript, requestVariables, - }) => ({ - id, + } = request + return { v, - auth, - body, - endpoint, - headers, - method, + id, name, + endpoint, + method, params, + requestVariables: requestVariables, + auth, + headers, + body, preRequestScript, testScript, - requestVariables, - }) - ), + } + }), auth: data.auth, headers: data.headers, }