From 58857be6504ffbce565180073312567ed8b61f57 Mon Sep 17 00:00:00 2001 From: Nivedin <53208152+nivedin@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:06:53 +0530 Subject: [PATCH] feat: save api responses (#4382) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- packages/hoppscotch-common/locales/en.json | 17 +- .../hoppscotch-common/src/components.d.ts | 8 + .../app/spotlight/entry/RESTRequest.vue | 4 +- .../src/components/collections/AddRequest.vue | 3 + .../src/components/collections/Collection.vue | 2 +- .../components/collections/EditResponse.vue | 95 +++ .../collections/ExampleResponse.vue | 247 +++++++ .../components/collections/MyCollections.vue | 57 +- .../src/components/collections/Request.vue | 60 +- .../components/collections/SaveRequest.vue | 30 +- .../collections/TeamCollections.vue | 57 +- .../src/components/collections/index.vue | 604 +++++++++++++++++- .../src/components/embeds/Request.vue | 4 +- .../src/components/embeds/index.vue | 4 +- .../src/components/graphql/RequestOptions.vue | 8 +- .../src/components/history/index.vue | 1 + .../src/components/http/ImportCurl.vue | 2 + .../src/components/http/Request.vue | 8 +- .../src/components/http/RequestOptions.vue | 39 +- .../src/components/http/RequestTab.vue | 6 +- .../src/components/http/Response.vue | 122 +++- .../src/components/http/ResponseInterface.vue | 15 +- .../src/components/http/SaveResponseName.vue | 81 +++ .../src/components/http/TabHead.vue | 46 +- .../http/example/LenseBodyRenderer.vue | 85 +++ .../src/components/http/example/Response.vue | 23 + .../components/http/example/ResponseMeta.vue | 70 ++ .../http/example/ResponseRequest.vue | 265 ++++++++ .../components/http/example/ResponseTab.vue | 48 ++ .../src/components/lenses/HeadersRenderer.vue | 21 +- .../lenses/HeadersRendererEntry.vue | 65 +- .../lenses/ResponseBodyRenderer.vue | 20 +- .../lenses/renderers/HTMLLensRenderer.vue | 53 +- .../lenses/renderers/JSONLensRenderer.vue | 123 +++- .../lenses/renderers/RawLensRenderer.vue | 78 ++- .../lenses/renderers/XMLLensRenderer.vue | 89 ++- .../src/components/share/Request.vue | 2 +- .../src/components/share/index.vue | 1 + .../src/components/smart/EnvInput.vue | 26 +- .../src/composables/codemirror.ts | 9 +- .../src/composables/lens-actions.ts | 25 +- .../src/helpers/RequestRunner.ts | 4 +- .../hoppscotch-common/src/helpers/actions.ts | 10 +- .../src/helpers/collection/collection.ts | 16 +- .../src/helpers/collection/request.ts | 5 +- .../helpers/curl/__tests__/curlparser.spec.js | 28 + .../src/helpers/curl/curlparser.ts | 1 + .../editor/extensions/HoppEnvironment.ts | 21 +- .../src/helpers/findStatusGroup.ts | 2 +- .../helpers/import-export/import/insomnia.ts | 3 + .../helpers/import-export/import/openapi.ts | 123 +++- .../helpers/import-export/import/postman.ts | 175 +++-- .../src/helpers/keybindings.ts | 3 +- .../src/helpers/rest/default.ts | 1 + .../src/helpers/rest/document.ts | 46 +- .../src/helpers/rest/labelColoring.ts | 7 +- .../src/helpers/teams/TeamRequest.ts | 9 + .../src/helpers/teams/TeamsSearch.service.ts | 1 + .../src/helpers/utils/statusCodes.ts | 35 + .../hoppscotch-common/src/newstore/history.ts | 1 + .../hoppscotch-common/src/pages/e/_id.vue | 5 +- .../hoppscotch-common/src/pages/index.vue | 39 +- .../hoppscotch-common/src/pages/r/_id.vue | 1 + .../menu/__tests__/url.menu.spec.ts | 1 + .../context-menu/menu/parameter.menu.ts | 16 +- .../services/context-menu/menu/url.menu.ts | 1 + .../src/services/inspection/index.ts | 24 +- .../inspectors/environment.inspector.ts | 28 +- .../inspection/inspectors/header.inspector.ts | 10 +- .../inspectors/response.inspector.ts | 7 +- .../persistence/__tests__/__mocks__/index.ts | 8 +- .../persistence/validation-schemas/index.ts | 18 +- .../__tests__/history.searcher.spec.ts | 1 + .../searchers/collections.searcher.ts | 1 + .../spotlight/searchers/history.searcher.ts | 5 +- .../spotlight/searchers/request.searcher.ts | 7 +- .../searchers/teamRequest.searcher.ts | 1 + .../src/services/tab/rest.ts | 16 +- packages/hoppscotch-data/src/rest/index.ts | 15 +- packages/hoppscotch-data/src/rest/v/2.ts | 6 - packages/hoppscotch-data/src/rest/v/8.ts | 70 +- .../hoppscotch-data/src/utils/statusCodes.ts | 101 +++ .../collections/collections.platform.ts | 4 +- .../collections/collections.platform.ts | 2 + 84 files changed, 3080 insertions(+), 321 deletions(-) create mode 100644 packages/hoppscotch-common/src/components/collections/EditResponse.vue create mode 100644 packages/hoppscotch-common/src/components/collections/ExampleResponse.vue create mode 100644 packages/hoppscotch-common/src/components/http/SaveResponseName.vue create mode 100644 packages/hoppscotch-common/src/components/http/example/LenseBodyRenderer.vue create mode 100644 packages/hoppscotch-common/src/components/http/example/Response.vue create mode 100644 packages/hoppscotch-common/src/components/http/example/ResponseMeta.vue create mode 100644 packages/hoppscotch-common/src/components/http/example/ResponseRequest.vue create mode 100644 packages/hoppscotch-common/src/components/http/example/ResponseTab.vue create mode 100644 packages/hoppscotch-data/src/utils/statusCodes.ts diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index c036de5b7..b1e96397a 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -43,6 +43,7 @@ "rename": "Rename", "restore": "Restore", "save": "Save", + "save_as_example": "Save as example", "scroll_to_bottom": "Scroll to bottom", "scroll_to_top": "Scroll to top", "search": "Search", @@ -224,6 +225,7 @@ "remove_folder": "Are you sure you want to permanently delete this folder?", "remove_history": "Are you sure you want to permanently delete all history?", "remove_request": "Are you sure you want to permanently delete this request?", + "remove_response": "Are you sure you want to permanently delete this response?", "remove_shared_request": "Are you sure you want to permanently delete this shared request?", "remove_team": "Are you sure you want to delete this workspace?", "remove_telemetry": "Are you sure you want to opt-out of Telemetry?", @@ -391,7 +393,8 @@ "codegen": "{request_name} - code", "graphql_response": "GraphQL-Response", "lens": "{request_name} - response", - "realtime_response": "Realtime-Response" + "realtime_response": "Realtime-Response", + "response_interface": "Response-Interface" }, "filter": { "all": "All", @@ -528,7 +531,9 @@ "confirm": "Confirm", "customize_request": "Customize Request", "edit_request": "Edit Request", + "edit_response": "Edit Response", "import_export": "Import / Export", + "response_name": "Response Name", "share_request": "Share Request" }, "mqtt": { @@ -595,6 +600,7 @@ }, "request": { "added": "Request added", + "add": "Add Request", "authorization": "Authorization", "body": "Request Body", "choose_language": "Choose language", @@ -631,6 +637,7 @@ "rename": "Rename Request", "renamed": "Request renamed", "request_variables": "Request variables", + "response_name_exists": "Response name already exists", "run": "Run", "save": "Save", "save_as": "Save as", @@ -650,14 +657,18 @@ "response": { "audio": "Audio", "body": "Response Body", + "duplicated": "Response duplicated", + "duplicate_name_error": "Same name response already exists", "filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "headers": "Headers", "html": "HTML", "image": "Image", "json": "JSON", "pdf": "PDF", + "please_save_request": "Save the request to create example", "preview_html": "Preview HTML", "raw": "Raw", + "renamed": "Response renamed", "size": "Size", "status": "Status", "time": "Time", @@ -666,7 +677,9 @@ "waiting_for_connection": "waiting for connection", "xml": "XML", "generate_data_schema": "Generate Data Schema", - "data_schema": "Data Schema" + "data_schema": "Data Schema", + "saved": "Response saved", + "invalid_name": "Please provide a name for the response" }, "settings": { "accent_color": "Accent color", diff --git a/packages/hoppscotch-common/src/components.d.ts b/packages/hoppscotch-common/src/components.d.ts index e51899b8d..d08d3f35e 100644 --- a/packages/hoppscotch-common/src/components.d.ts +++ b/packages/hoppscotch-common/src/components.d.ts @@ -49,6 +49,8 @@ declare module 'vue' { CollectionsEdit: typeof import('./components/collections/Edit.vue')['default'] CollectionsEditFolder: typeof import('./components/collections/EditFolder.vue')['default'] CollectionsEditRequest: typeof import('./components/collections/EditRequest.vue')['default'] + CollectionsEditResponse: typeof import('./components/collections/EditResponse.vue')['default'] + CollectionsExampleResponse: typeof import('./components/collections/ExampleResponse.vue')['default'] CollectionsGraphql: typeof import('./components/collections/graphql/index.vue')['default'] CollectionsGraphqlAdd: typeof import('./components/collections/graphql/Add.vue')['default'] CollectionsGraphqlAddFolder: typeof import('./components/collections/graphql/AddFolder.vue')['default'] @@ -142,6 +144,11 @@ declare module 'vue' { HttpBodyParameters: typeof import('./components/http/BodyParameters.vue')['default'] HttpCodegen: typeof import('./components/http/Codegen.vue')['default'] HttpCodegenModal: typeof import('./components/http/CodegenModal.vue')['default'] + HttpExampleLenseBodyRenderer: typeof import('./components/http/example/LenseBodyRenderer.vue')['default'] + HttpExampleResponse: typeof import('./components/http/example/Response.vue')['default'] + HttpExampleResponseMeta: typeof import('./components/http/example/ResponseMeta.vue')['default'] + HttpExampleResponseRequest: typeof import('./components/http/example/ResponseRequest.vue')['default'] + HttpExampleResponseTab: typeof import('./components/http/example/ResponseTab.vue')['default'] HttpHeaders: typeof import('./components/http/Headers.vue')['default'] HttpImportCurl: typeof import('./components/http/ImportCurl.vue')['default'] HttpKeyValue: typeof import('./components/http/KeyValue.vue')['default'] @@ -157,6 +164,7 @@ declare module 'vue' { HttpResponse: typeof import('./components/http/Response.vue')['default'] HttpResponseInterface: typeof import('./components/http/ResponseInterface.vue')['default'] HttpResponseMeta: typeof import('./components/http/ResponseMeta.vue')['default'] + HttpSaveResponseName: typeof import('./components/http/SaveResponseName.vue')['default'] HttpSidebar: typeof import('./components/http/Sidebar.vue')['default'] HttpTabHead: typeof import('./components/http/TabHead.vue')['default'] HttpTestResult: typeof import('./components/http/TestResult.vue')['default'] diff --git a/packages/hoppscotch-common/src/components/app/spotlight/entry/RESTRequest.vue b/packages/hoppscotch-common/src/components/app/spotlight/entry/RESTRequest.vue index 062b47459..0ba4cb15b 100644 --- a/packages/hoppscotch-common/src/components/app/spotlight/entry/RESTRequest.vue +++ b/packages/hoppscotch-common/src/components/app/spotlight/entry/RESTRequest.vue @@ -7,9 +7,9 @@ {{ request.method.toUpperCase() }} diff --git a/packages/hoppscotch-common/src/components/collections/AddRequest.vue b/packages/hoppscotch-common/src/components/collections/AddRequest.vue index ae3ebd537..8633cf823 100644 --- a/packages/hoppscotch-common/src/components/collections/AddRequest.vue +++ b/packages/hoppscotch-common/src/components/collections/AddRequest.vue @@ -92,6 +92,9 @@ watch( () => props.show, (show) => { if (show) { + if (tabs.currentActiveTab.value.document.type === "example-response") + return + editingName.value = tabs.currentActiveTab.value.document.request.name } } diff --git a/packages/hoppscotch-common/src/components/collections/Collection.vue b/packages/hoppscotch-common/src/components/collections/Collection.vue index 60860a1b0..0faf43bb6 100644 --- a/packages/hoppscotch-common/src/components/collections/Collection.vue +++ b/packages/hoppscotch-common/src/components/collections/Collection.vue @@ -62,7 +62,7 @@