Skip to content

Commit

Permalink
fix: request variable version syncing bug (#3889)
Browse files Browse the repository at this point in the history
Co-authored-by: jamesgeorge007 <jamesgeorge998001@gmail.com>
  • Loading branch information
nivedin and jamesgeorge007 committed Mar 12, 2024
1 parent dce396c commit bf98009
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 61 deletions.
Expand Up @@ -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(
Expand All @@ -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))
}

Expand Down Expand Up @@ -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))
}
4 changes: 0 additions & 4 deletions packages/hoppscotch-data/src/collection/index.ts
Expand Up @@ -52,8 +52,6 @@ export function makeCollection(x: Omit<HoppCollection, "v">): 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)
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 1 addition & 15 deletions packages/hoppscotch-data/src/rest/v/2.ts
Expand Up @@ -18,22 +18,8 @@ export const HoppRESTRequestVariables = z.array(

export type HoppRESTRequestVariables = z.infer<typeof HoppRESTRequestVariables>

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,
})

Expand Down
Expand Up @@ -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,
Expand All @@ -125,20 +130,23 @@ function exportedCollectionToHoppCollection(
params,
preRequestScript,
testScript,
}) => ({
id,
requestVariables,
} = request
return {
v,
auth,
body,
id,
name,
endpoint,
headers,
method,
name,
params,
requestVariables: requestVariables,
auth,
headers,
body,
preRequestScript,
testScript,
})
),
}
}),
}
} else {
const gqlCollection = collection as ExportedUserCollectionGQL
Expand Down
Expand Up @@ -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,
Expand All @@ -134,21 +139,22 @@ function exportedCollectionToHoppCollection(
preRequestScript,
testScript,
requestVariables,
}) => ({
id,
} = request
return {
v,
auth,
body,
id,
name,
endpoint,
headers,
method,
name,
params,
requestVariables: requestVariables,
auth,
headers,
body,
preRequestScript,
testScript,
requestVariables,
})
),
}
}),
auth: data.auth,
headers: data.headers,
}
Expand Down

0 comments on commit bf98009

Please sign in to comment.