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

feat(api-client): Get all workspace invitation #619

Merged
merged 3 commits into from
Jan 11, 2025

Conversation

Souvik9205
Copy link
Contributor

@Souvik9205 Souvik9205 commented Jan 10, 2025

User description

Description

Api client update to get all workspace invitation

Fixes #553

I am not too much sure about the changes, like for the URL, i take reference form #586 api-collection url -

get {
  url: {{BASE_URL}}/api/workspace/invitations?page=0&limit=10

etc. So I am open to changes :)


PR Type

Enhancement, Tests


Description

  • Added a new API method getWorkspaceInvitations to fetch workspace invitations.

  • Implemented query parameter handling for pagination, sorting, and searching.

  • Added a test case to validate the getWorkspaceInvitations functionality.

  • Ensured response parsing and metadata validation in the test case.


Changes walkthrough 📝

Relevant files
Enhancement
workspace.ts
Add `getWorkspaceInvitations` method in WorkspaceController

packages/api-client/src/controllers/workspace.ts

  • Added getWorkspaceInvitations method to fetch workspace invitations.
  • Implemented query parameter handling for pagination and filtering.
  • Integrated response parsing for the new API endpoint.
  • +30/-1   
    Tests
    workspace.spec.ts
    Add test case for `getWorkspaceInvitations` method             

    packages/api-client/tests/workspace.spec.ts

  • Added a test case for getWorkspaceInvitations method.
  • Validated response structure and metadata in the test.
  • Ensured proper handling of empty invitation lists.
  • +21/-0   

    💡 PR-Agent usage: Comment /help "your question" on any pull request to receive relevant information

    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    🎫 Ticket compliance analysis 🔶

    553 - Partially compliant

    Compliant requirements:

    • Add endpoint to fetch all workspace invitations of a user
    • Add request in workspace.ts controller
    • Add relevant tests in workspace.spec.ts

    Non-compliant requirements:

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Test Coverage

    Test only verifies empty invitation list case. Should add tests for non-empty lists and pagination/sorting functionality.

    it('should return list of invitations of the workshop', async () => {
      const invitations = (
        await workspaceController.getWorkspaceInvitations(
          {
            page: 0,
            limit: 10
          },
          {
            'x-e2e-user-email': email
          }
        )
      ).data
    
      expect(invitations.items).toHaveLength(0)
    
      expect(invitations.metadata.totalCount).toEqual(0)
      expect(invitations.metadata.links.self).toBe(
        `/workspace/invitation?page=0&limit=10&sort=name&order=asc&search=`
      )
    })
    Error Handling

    No error handling or input validation for invalid pagination parameters or failed API responses.

    async getWorkspaceInvitations(
      request: GetWorkspaceInvitationsRequest,
      headers?: Record<string, string>
    ): Promise<ClientResponse<GetWorkspaceInvitationsResponse>> {
      const queryParams = new URLSearchParams({
        page: request.page?.toString() || '0',
        limit: request.limit?.toString() || '10',
        sort: request.sort || '',
        order: request.order || '',
        search: request.search || ''
      })
    
      ;[...queryParams.keys()].forEach((key) => {
        if (!queryParams.get(key)) {
          queryParams.delete(key)
        }
      })
    
      const url = parsePaginationUrl(
        `/api/workspace/invitations?${queryParams.toString()}`,
        headers
      )
      const response = await this.apiClient.get(url, headers)
    
      return await parseResponse<GetWorkspaceInvitationsResponse>(response)
    }

    Copy link
    Contributor

    codiumai-pr-agent-free bot commented Jan 10, 2025

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Score
    Possible issue
    Fix inconsistent API endpoint paths between implementation and test

    The test assertion URL doesn't match the actual API endpoint used in the controller.
    Update the test to match the correct endpoint path.

    packages/api-client/tests/workspace.spec.ts [53-54]

     expect(invitations.metadata.links.self).toBe(
    -  `/workspace/invitation?page=0&limit=10&sort=name&order=asc&search=`
    +  `/api/workspace/invitations?page=0&limit=10&sort=name&order=asc&search=`
     )
    • Apply this suggestion
    Suggestion importance[1-10]: 9

    Why: This catches a critical mismatch between the implementation and test - the test is asserting against a different API path than what's actually used in the code.

    9
    Add validation to prevent negative pagination parameters that could cause API errors

    Add input validation for page and limit parameters to ensure they are non-negative
    numbers. Currently negative values could cause API issues.

    packages/api-client/src/controllers/workspace.ts [119-125]

    +const page = Math.max(0, request.page ?? 0);
    +const limit = Math.max(1, request.limit ?? 10);
     const queryParams = new URLSearchParams({
    -  page: request.page?.toString() || '0',
    -  limit: request.limit?.toString() || '10',
    +  page: page.toString(),
    +  limit: limit.toString(), 
       sort: request.sort || '',
       order: request.order || '',
       search: request.search || ''
     })
    • Apply this suggestion
    Suggestion importance[1-10]: 8

    Why: This is an important validation that prevents potential API errors and improves robustness. Negative page/limit values could cause unexpected behavior or server errors.

    8
    General
    Validate sort order parameter to prevent invalid API requests

    Validate the order parameter to only accept 'asc' or 'desc' values to prevent
    invalid API requests.

    packages/api-client/src/controllers/workspace.ts [123]

    -order: request.order || '',
    +order: ['asc', 'desc'].includes(request.order?.toLowerCase() ?? '') ? request.order.toLowerCase() : 'asc',
    • Apply this suggestion
    Suggestion importance[1-10]: 7

    Why: Validating the order parameter to only accept valid values ('asc'/'desc') prevents invalid API requests and improves API reliability.

    7

    @rajdip-b rajdip-b merged commit 8a23850 into keyshade-xyz:develop Jan 11, 2025
    6 checks passed
    rajdip-b pushed a commit that referenced this pull request Jan 23, 2025
    ## [2.9.0](v2.8.0...v2.9.0) (2025-01-23)
    
    ### 🚀 Features
    
    * **api-client:** Get all workspace invitation ([#619](#619)) ([8a23850](8a23850))
    * **api,cli,api-client,schema:** Enhance permissions to allow filtering by environments through project roles ([#599](#599)) ([030b539](030b539))
    * **api:** Add `ADMIN` authority for API keys ([#609](#609)) ([fb6aba7](fb6aba7))
    * **api:** Add email template for inviting user to workspace ([#480](#480)) ([f5ddf7a](f5ddf7a))
    * **api:** Add email template for sending OTP to the user ([#582](#582)) ([cb6bbcb](cb6bbcb))
    * **api:** Add endpoint to fetch all workspace invitations for a user ([#586](#586)) ([d45417a](d45417a))
    * **api:** Add logout endpoint to clear token cookie ([#581](#581)) ([27f81ba](27f81ba))
    * **api:** Add slack integration ([#531](#531)) ([fe124d8](fe124d8))
    * **cli:** Add CLI command to check version flag using `--version` or `-v` ([#650](#650)) ([31b5efe](31b5efe))
    * **cli:** Add functionality to operate on Workspace Membership ([#589](#589)) ([0fde62b](0fde62b))
    * **cli:** Add import sub commmand for project. ([#594](#594)) ([9896f27](9896f27))
    * **cli:** Add List-invitation command ([#633](#633)) ([874f8c2](874f8c2))
    * **cli:** Added keyshade command to cli ([cf260ae](cf260ae))
    * **cli:** Api health probe ([#645](#645)) ([dd854f4](dd854f4))
    * **cli:** Create basic README.md ([a1b74e9](a1b74e9))
    * **cli:** Log publicKey, privacyKey, & accessLevel after project creation ([#623](#623)) ([5d5b329](5d5b329))
    * **cli:** Supports to specify environment(s) and its optional description ([#634](#634)) ([62083b1](62083b1))
    * **cli:** update README with feature and installation ([#644](#644)) ([a4d2a6a](a4d2a6a))
    * **platform:** Add a new [secure] and added loader on project screen ([#603](#603)) ([c3a08cc](c3a08cc))
    * **platform:** Add new variables to a project ([#593](#593)) ([d6c6252](d6c6252))
    * **platform:** Delete variable from a project ([#600](#600)) ([e64a738](e64a738))
    * **platform:** Edit existing variables in a project ([#602](#602)) ([bb48f6c](bb48f6c))
    * **platform:** Show all the existing variables inside a project ([#591](#591)) ([5276bb8](5276bb8))
    * **platofrm:** Added online/offline status detection in the platform ([#585](#585)) ([89aa84f](89aa84f))
    * **schema:** Add workspace invitation schema ([#612](#612)) ([1a5721b](1a5721b))
    * **web:** Add Google Analytics integration ([#649](#649)) ([397d6da](397d6da))
    
    ### 🐛 Bug Fixes
    
    * **api:** Empty name `""` accepted as a valid name while creating environments ([#583](#583)) ([a33f4b5](a33f4b5))
    * **api:** Enable global project access ([#580](#580)) ([b3a0309](b3a0309))
    * **api:** Update build command ([0ddfa59](0ddfa59))
    * **cli:** Add keywords for improved package discoverability ([#641](#641)) ([57ce10b](57ce10b))
    * **cli:** Check for .keyshade dir if profile isn't found ([#636](#636)) ([a69665d](a69665d))
    * **cli:** Create project --store-private-key option default value removed ([#638](#638)) ([20f16c6](20f16c6))
    * **cli:** Fixed binary path in package.json ([e531af0](e531af0))
    * **cli:** Fixed binary path in package.json ([81d674d](81d674d))
    * **cli:** Incorrect message on listing projects ([#624](#624)) ([eeffa42](eeffa42))
    * **cli:** Module errors ([d3432c5](d3432c5))
    * **cli:** Module errors ([a639065](a639065))
    * **cli:** Module errors ([a7742b1](a7742b1))
    * **cli:** Module errors ([e96300e](e96300e))
    * **cli:** Profile name now can use - and _ and updated error message ([#639](#639)) ([00dd66a](00dd66a))
    * **cli:** Prompt users for all values if no option set and show default values ([#640](#640)) ([fe862ab](fe862ab))
    * **docker:** Update build script ([40ef3e2](40ef3e2))
    * **platform:** Check if `Env. Name` is left empty ([#646](#646)) ([5f3fac8](5f3fac8))
    * **platform:** Clickable Workspaces combobox options ([#630](#630)) ([acc96f7](acc96f7))
    * **platform:** Optimized user update request body ([#605](#605)) ([ee1adf0](ee1adf0))
    * **platform:** Type error in navbar ([8199de8](8199de8))
    * **README:** Update Discord badge ([6f9382e](6f9382e))
    * **schema:** Add versions field to project [secure]s and variables response ([#590](#590)) ([755ea46](755ea46))
    
    ### 📚 Documentation
    
    * **cli:** Update changelog to include missed out changes ([8910c5c](8910c5c))
    * Updated alignment of pictures in API Testing page ([5d69223](5d69223))
    * Updated alignment of pictures in API Testing page ([e31eeca](e31eeca))
    
    ### 🔧 Miscellaneous Chores
    
    * Add Sentry and update CI ([#653](#653)) ([ca96862](ca96862))
    * **ci:** Add CLI deployment script ([51de9d1](51de9d1))
    * **ci:** Add internal package dependencies to existing workflows ([#592](#592)) ([a9fc39e](a9fc39e))
    * **ci:** Add scope ([8ef89a8](8ef89a8))
    * **ci:** Bug fix in workflow ([d583a46](d583a46))
    * **ci:** Bug fix in workflow ([eb9d60f](eb9d60f))
    * **ci:** Bump version to 2.2.0 ([951bd14](951bd14))
    * **ci:** Deploy DB migrations ([ea1beed](ea1beed))
    * **ci:** Fixed chaining and scripts ([6a009eb](6a009eb))
    * **ci:** Fixed environment name ([172c348](172c348))
    * **ci:** Fixed errors ([f28e3b5](f28e3b5))
    * **ci:** Minor fixes ([c7f05a0](c7f05a0))
    * **ci:** Push docker images of platform and API to ACR ([5f79dd7](5f79dd7))
    * **ci:** Remove npm ci ([3d45a4c](3d45a4c))
    * **ci:** Remove pnpm cache ([f45970c](f45970c))
    * **ci:** Update app redeployment ([18cf765](18cf765))
    * **ci:** Update web deployment to push to ACR ([26d4bed](26d4bed))
    * **cli:** Bumped CLI to v2.4.0 ([09efcd9](09efcd9))
    * **cli:** Rearranged dependency ([b6e344d](b6e344d))
    * **cli:** Removed changeset ([6c436de](6c436de))
    * **cli:** Update package name ([23552a1](23552a1))
    * **cli:** Update package name ([480cf54](480cf54))
    * **cli:** Update package.json ([871679a](871679a))
    * **cli:** Updated build scripts ([2e2b42d](2e2b42d))
    * **docker:** Update port of platform docker build ([c79d886](c79d886))
    * Housekeeping ([2ed31c0](2ed31c0))
    * **platoform:** Swapped all legacy API calls with `@keyshade/api-client` ([#584](#584)) ([c600db7](c600db7))
    * Removed .postman folder ([4b2b675](4b2b675))
    * Reverted back registry ([1699a89](1699a89))
    * **schema:** Add describe blocks in tests for each kind of schema ([#577](#577)) ([c0763f3](c0763f3))
    * Update npmrc ([9f7f495](9f7f495))
    * Update pipelines; fixed api docker ([3f36a17](3f36a17))
    * Update platform build command ([83a1851](83a1851))
    * **web:** Fix CI ([d1bc740](d1bc740))
    * **web:** Update dockerfile and ci to include google analytics env ([f2df4f4](f2df4f4))
    
    ### 🔨 Code Refactoring
    
    * **cli:** Replace arguments with options ([#615](#615)) ([498f44e](498f44e))
    * **platform:** Optimized codebase ([#629](#629)) ([d411081](d411081))
    * **platform:** Refactor project components ([#626](#626)) ([5b70805](5b70805))
    * **web:** Changed the text in the hero section of the web application ([#579](#579)) ([a92925f](a92925f))
    @rajdip-b
    Copy link
    Member

    🎉 This PR is included in version 2.9.0 🎉

    The release is available on GitHub release

    Your semantic-release bot 📦🚀

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    API-CLIENT: Add "Get All Workspace Invitation" request
    2 participants