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

hotfix: request variable version syncing bug #3889

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
jamesgeorge007 marked this conversation as resolved.
Show resolved Hide resolved
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