Skip to content

feat: v2/keys.getKey#3421

Merged
chronark merged 23 commits intounkeyed:mainfrom
Flo4604:feat/v2/keys.getKey
Jul 3, 2025
Merged

feat: v2/keys.getKey#3421
chronark merged 23 commits intounkeyed:mainfrom
Flo4604:feat/v2/keys.getKey

Conversation

@Flo4604
Copy link
Member

@Flo4604 Flo4604 commented Jul 1, 2025

What does this PR do?

Is one of the endpoints for #3419 and adds the keys.getKey endpoint.

This also kills the need for the whoami endpoint by accepting both a keyId and a key parameter.

Other changes are:

  • Utility for bulk inserts
  • Switched some places to bulk inserts
  • Cleanup of openapi spec to re-use some components
  • Key encryption when creating a key & perms & condition checks for decrypting
  • listKeys endpoint was missing identity ratelimits
  • updating auditlog service to use tx wrapper and bulks inserts + fault wrapping the error
  • adding auto apply field for ratelimits where needed

Some of the existing endpoints still need work, but ill do that in seperate branches.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Chore (refactoring code, technical debt, workflow improvements)
  • Enhancement (small improvements)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How should this be tested?

Unit tests

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read Contributing Guide
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand areas
  • [] Ran pnpm build
  • [] Ran pnpm fmt
  • [] Checked for warnings, there are none
  • [] Removed all console.logs
  • [] Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues

Appreciated

  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Unkey Docs if changes were necessary

Summary by CodeRabbit

  • New Features

    • Added support for encrypted (recoverable) API keys with secure storage and decryption, controlled by permissions.
    • Introduced a new API endpoint to retrieve key details by key ID or plaintext key, including optional decryption and enriched metadata.
    • Added an OpenAPI reference endpoint and enhanced the OpenAPI schema for clearer request/response models and new properties.
    • Extended ratelimit functionality with an autoApply option and more detailed response data.
    • Enhanced key and identity responses with additional fields like enabled, apiId, and inclusion of identity ratelimits.
  • Bug Fixes

    • Improved error handling and input validation for key and identity operations.
    • Fixed permission checks and workspace isolation enforcement for key retrieval and decryption.
  • Refactor

    • Optimized database interactions by implementing bulk inserts and batch updates for ratelimits, permissions, and roles.
    • Simplified and standardized audit log error handling across multiple endpoints.
    • Removed redundant types and unified request/response schemas for keys and ratelimits.
  • Chores

    • Updated database schema and queries to support encryption, ratelimit enhancements, and new features.
    • Added comprehensive integration and unit tests covering new endpoints, encryption, permission scenarios, and error cases.
  • Documentation

    • Improved OpenAPI documentation with reusable schemas, clearer constraints, and removal of deprecated endpoints.

@changeset-bot
Copy link

changeset-bot bot commented Jul 1, 2025

⚠️ No Changeset found

Latest commit: 9a072c0

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link

vercel bot commented Jul 1, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
dashboard ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 3, 2025 10:16am
engineering ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 3, 2025 10:16am

@vercel
Copy link

vercel bot commented Jul 1, 2025

@Flo4604 is attempting to deploy a commit to the Unkey Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 1, 2025

📝 Walkthrough
## Walkthrough

This update introduces encrypted key support and multi-rate limit enhancements to the API, database schema, and handlers. It adds new API endpoints for retrieving keys, supports batch operations for rate limits and audit logs, and introduces the `autoApply` flag for ratelimits. The OpenAPI spec and generated Go types are refactored for clearer request/response separation.

## Changes

| Files/Paths (grouped)                                                               | Change Summary |
|-------------------------------------------------------------------------------------|----------------|
| `go/pkg/db/schema.sql`<br>`go/pkg/db/queries/key_encryption_*.sql`<br>`go/pkg/db/key_encryption_*.sql_generated.go`<br>`go/pkg/db/key_find_by_id_or_hash.sql`<br>`go/pkg/db/key_find_by_id_or_hash.sql_generated.go`<br>`go/pkg/db/key_insert.sql`<br>`go/pkg/db/key_insert.sql_generated.go`<br>`go/pkg/db/identity_list_ratelimits_by_ids.sql`<br>`go/pkg/db/identity_list_ratelimits_by_ids.sql_generated.go`<br>`go/pkg/db/keyring_update_key_encryption.sql`<br>`go/pkg/db/keyring_update_key_encryption.sql_generated.go`<br>`go/pkg/db/ratelimit_list_by_key_id.sql`<br>`go/pkg/db/ratelimit_list_by_key_id.sql_generated.go` | Database schema changes for encrypted keys, batch ratelimit queries, and new fields; new SQL queries and generated Go code for key encryption, ratelimit, and keyring updates. |
| `go/pkg/db/models_generated.go`<br>`go/pkg/db/identity_insert_ratelimit.sql_generated.go`<br>`go/pkg/db/key_insert_ratelimit.sql_generated.go`<br>`go/pkg/db/ratelimit_update.sql_generated.go`<br>`go/pkg/db/ratelimit_list_by_key_ids.sql_generated.go`<br>`go/pkg/db/identity_list_ratelimits.sql_generated.go`<br>`go/pkg/db/identity_list_ratelimits_by_id.sql_generated.go` | Add `AutoApply` to ratelimit models and generated query structs; update ratelimit insert/update/query logic for new field. |
| `go/pkg/db/querier_generated.go` | Extend interface with new query methods for encrypted keys, ratelimits, and batch operations; update signatures for new fields. |
| `go/pkg/db/bulk_insert.go` | Add generic `BulkInsert` utility for batch SQL inserts. |
| `go/apps/api/routes/v2_keys_create_key/handler.go`<br>`go/apps/api/routes/v2_keys_get_key/handler.go`<br>`go/apps/api/routes/v2_apis_list_keys/handler.go`<br>`go/apps/api/routes/v2_identities_create_identity/handler.go`<br>`go/apps/api/routes/v2_identities_update_identity/handler.go` | Handlers updated for encrypted key support, batch ratelimit/permission/role inserts, new ratelimit fields, and improved permission checks. |
| `go/apps/api/routes/v2_keys_create_key/200_test.go`<br>`go/apps/api/routes/v2_keys_create_key/403_test.go`<br>`go/apps/api/routes/v2_keys_create_key/412_test.go`<br>`go/apps/api/routes/v2_keys_get_key/200_test.go`<br>`go/apps/api/routes/v2_keys_get_key/400_test.go`<br>`go/apps/api/routes/v2_keys_get_key/401_test.go`<br>`go/apps/api/routes/v2_keys_get_key/403_test.go`<br>`go/apps/api/routes/v2_keys_get_key/404_test.go`<br>`go/apps/api/routes/v2_keys_get_key/412_test.go`<br>`go/apps/api/routes/v2_apis_list_keys/200_test.go`<br>`go/apps/api/routes/v2_apis_list_keys/403_test.go`<br>`go/apps/api/routes/v2_apis_list_keys/404_test.go`<br>`go/apps/api/routes/v2_apis_list_keys/412_test.go`<br>`go/apps/api/routes/v2_identities_create_identity/200_test.go`<br>`go/apps/api/routes/v2_identities_create_identity/400_test.go`<br>`go/apps/api/routes/v2_identities_get_identity/200_test.go`<br>`go/apps/api/routes/v2_identities_get_identity/400_test.go`<br>`go/apps/api/routes/v2_identities_update_identity/200_test.go`<br>`go/apps/api/routes/v2_identities_update_identity/400_test.go` | Add/modify tests for encrypted keys, ratelimit `autoApply`, batch operations, and new handler logic. |
| `go/apps/api/routes/v2_keys_get_key/handler.go`<br>`go/apps/api/routes/v2_keys_get_key/200_test.go`<br>`go/apps/api/routes/v2_keys_get_key/400_test.go`<br>`go/apps/api/routes/v2_keys_get_key/401_test.go`<br>`go/apps/api/routes/v2_keys_get_key/403_test.go`<br>`go/apps/api/routes/v2_keys_get_key/404_test.go`<br>`go/apps/api/routes/v2_keys_get_key/412_test.go` | New API endpoint for retrieving key details by ID or plaintext, with permission and decryption support. |
| `go/apps/api/routes/register.go` | Register new routes for key retrieval and OpenAPI handler. |
| `go/apps/api/routes/openapi/handler.go`<br>`apps/agent/pkg/api/routes/openapi/handler.go` | Add OpenAPI reference endpoint handler and minor formatting cleanup. |
| `go/apps/api/openapi/gen.go`<br>`go/apps/api/openapi/openapi.yaml` | Refactor OpenAPI spec and generated types for ratelimits, credits, endpoints, and remove deprecated whoami endpoint. |
| `go/internal/services/auditlogs/insert.go` | Refactor audit log insertion for batch/bulk operations and improved transaction handling. |
| `go/pkg/testutil/seed/seed.go` | Update test seed for new key fields and error handling. |
| `go/pkg/testutil/http.go` | Minor formatting change (whitespace). |
| `apps/agent/services/vault/service.go`<br>`go/apps/api/routes/v2_apis_get_api/handler.go`<br>`go/internal/services/keys/verify.go` | Minor formatting/whitespace-only changes. |
| `go/apps/api/routes/v2_apis_create_api/handler.go`<br>`go/apps/api/routes/v2_apis_delete_api/handler.go`<br>`go/apps/api/routes/v2_identities_delete_identity/handler.go`<br>`go/apps/api/routes/v2_keys_add_permissions/handler.go`<br>`go/apps/api/routes/v2_keys_add_roles/handler.go`<br>`go/apps/api/routes/v2_keys_remove_permissions/handler.go`<br>`go/apps/api/routes/v2_keys_remove_roles/handler.go`<br>`go/apps/api/routes/v2_keys_set_permissions/handler.go`<br>`go/apps/api/routes/v2_keys_set_roles/handler.go`<br>`go/apps/api/routes/v2_permissions_create_permission/handler.go`<br>`go/apps/api/routes/v2_permissions_create_role/handler.go`<br>`go/apps/api/routes/v2_permissions_delete_permission/handler.go`<br>`go/apps/api/routes/v2_permissions_delete_role/handler.go`<br>`go/apps/api/routes/v2_ratelimit_delete_override/handler.go`<br>`go/apps/api/routes/v2_ratelimit_set_override/handler.go` | Simplify error handling for audit log insertion (return raw error instead of wrapping). |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Client
    participant API_Server
    participant DB
    participant Vault

    Client->>API_Server: POST /v2/keys.createKey (with Recoverable=true)
    API_Server->>DB: Validate API, Keyring, Permissions
    API_Server->>Vault: Encrypt key (if Recoverable)
    Vault-->>API_Server: Encrypted key data
    API_Server->>DB: Insert key, encrypted key, ratelimits, permissions, roles (batch)
    API_Server->>DB: Insert audit logs (batch)
    API_Server-->>Client: 200 OK (key metadata)

    Client->>API_Server: POST /v2/keys.getKey (with Decrypt=true)
    API_Server->>DB: Find key by ID or hash
    API_Server->>DB: Fetch API, Keyring, Permissions
    API_Server->>Vault: Decrypt key (if encrypted and permitted)
    Vault-->>API_Server: Plaintext key
    API_Server->>DB: Fetch ratelimits, roles, permissions, identity info (batch)
    API_Server-->>Client: 200 OK (key details, plaintext if allowed)

Possibly related PRs

Suggested reviewers

  • perkinsjr
  • mcstepp
  • MichaelUnkey
  • ogzhanolguncu
  • chronark


</details>

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=unkeyed/unkey&utm_content=3421):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@vercel
Copy link

vercel bot commented Jul 2, 2025

Deployment failed with the following error:

The provided GitHub repository does not contain the requested branch or commit reference. Please ensure the repository is not empty.

@coderabbitai coderabbitai bot mentioned this pull request Sep 12, 2025
18 tasks
This was referenced Nov 4, 2025
@coderabbitai coderabbitai bot mentioned this pull request Nov 12, 2025
19 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants