Skip to content

feat(gateway): configure greptime storage for conversations#313

Draft
turisanapo wants to merge 3 commits intomainfrom
claude-issue-312-20260324-0739
Draft

feat(gateway): configure greptime storage for conversations#313
turisanapo wants to merge 3 commits intomainfrom
claude-issue-312-20260324-0739

Conversation

@turisanapo
Copy link
Copy Markdown
Contributor

@turisanapo turisanapo commented Mar 24, 2026

Configure the gateway's SQL storage for /conversations using GreptimeDB with multi-tenant isolation.

  • Add SqlStorage with GrepTimeDialect using the shared greptimeSqlClient
  • Create OrgScopedStorage wrapper for org-level isolation via organization_id metadata
  • Expose full /conversations CRUD + items routes with Elysia response types
  • Use AsyncLocalStorage to propagate org context to the storage layer

Closes #312

Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Introduced conversation management API with endpoints for creating, viewing, updating, and deleting conversations and items
    • Added request storage with automatic organization-level data isolation to ensure tenant security

- Add SqlStorage with GrepTimeDialect using the shared greptimeSqlClient
- Create OrgScopedStorage wrapper for multi-tenant isolation via organization_id metadata
- Expose full /conversations CRUD routes with Elysia response type annotations
- Include conversation items routes (/conversations/:id/items)
- Use AsyncLocalStorage to propagate org context to the storage layer

Closes #312

Co-authored-by: Davide Selvaggio <turisanapo@users.noreply.github.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 24, 2026

Warning

Rate limit exceeded

@turisanapo has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 0 minutes and 51 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 60e3af05-2274-4c8b-87cb-170886304cdb

📥 Commits

Reviewing files that changed from the base of the PR and between 8fc6de6 and 12fe28e.

📒 Files selected for processing (2)
  • apps/gateway/src/gateway-config.ts
  • apps/gateway/src/index.ts
📝 Walkthrough

Walkthrough

This PR introduces SQL-backed conversation storage for the gateway using GrepTime, initialized during startup with database migrations. It adds a multi-tenant organization-scoped storage wrapper that enforces isolation by injecting and validating organization IDs. New REST endpoints are registered to manage conversations and conversation items with organization-scoped request handling.

Changes

Cohort / File(s) Summary
Storage Configuration
apps/gateway/src/gateway-config.ts
Initializes GrepTime SQL storage with migration, wraps it in OrgScopedStorage, and passes the scoped instance to the gateway configuration.
Organization-Scoped Storage Layer
apps/gateway/src/services/org-scoped-storage.ts
Introduces orgContext async local storage for organization ID tracking and implements OrgScopedStorage wrapper that enforces multi-tenant isolation by validating organization ownership across all conversation and item operations.
Conversation REST API
apps/gateway/src/index.ts
Registers eight authenticated REST routes for conversation management (create, list, fetch, update, delete) and conversation items (add, list, fetch, delete), each wrapped with orgContext.run() to ensure organization-scoped execution and OpenAPI schema definitions.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Gateway
    participant OrgContext as orgContext<br/>(AsyncLocalStorage)
    participant OrgScopedStorage
    participant SqlStorage as SqlStorage<br/>(GrepTime)

    Note over Gateway: Startup Phase
    Gateway->>SqlStorage: new SqlStorage(client)
    SqlStorage->>SqlStorage: migrate()
    Gateway->>OrgScopedStorage: wrap(sqlStorage)

    Note over Client,SqlStorage: Request Handling Phase
    Client->>Gateway: POST /conversations<br/>(organizationId, body)
    Gateway->>OrgContext: orgContext.run(orgId, ...)
    OrgContext->>OrgScopedStorage: createConversation(params)
    OrgScopedStorage->>OrgScopedStorage: getOrgId() from context
    OrgScopedStorage->>OrgScopedStorage: inject metadata.organization_id
    OrgScopedStorage->>SqlStorage: createConversation(...)
    SqlStorage->>SqlStorage: persist to GrepTime
    SqlStorage-->>OrgScopedStorage: ConversationEntity
    OrgScopedStorage-->>Gateway: ConversationEntity
    Gateway-->>Client: 201 + response schema

    Note over Client,SqlStorage: Read with Ownership Validation
    Client->>Gateway: GET /conversations/{id}<br/>(organizationId)
    Gateway->>OrgContext: orgContext.run(orgId, ...)
    OrgContext->>OrgScopedStorage: getConversation(id)
    OrgScopedStorage->>SqlStorage: fetch conversation
    SqlStorage-->>OrgScopedStorage: ConversationEntity
    OrgScopedStorage->>OrgScopedStorage: verify org_id matches context
    alt Organization matches
        OrgScopedStorage-->>Gateway: ConversationEntity
        Gateway-->>Client: 200 + conversation
    else Organization mismatch
        OrgScopedStorage-->>Gateway: undefined
        Gateway-->>Client: 404
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 Whiskers twitching with delight,
Storage tunnels, organized right!
Organization scopes so tight,
Conversations flow through GrepTime's light,
Multi-tenant dreams take flight!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: configuring greptime storage for conversations in the gateway, which aligns with the PR's primary objective.
Linked Issues check ✅ Passed The pull request fully addresses issue #312 by configuring GreptimeDB storage with SqlStorage, implementing organization-scoped isolation via OrgScopedStorage, and exposing /conversations CRUD and items endpoints.
Out of Scope Changes check ✅ Passed All changes directly support the linked objective: storage configuration (gateway-config.ts), endpoint registration (index.ts), and multi-tenant isolation wrapper (org-scoped-storage.ts) with no unrelated modifications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude-issue-312-20260324-0739

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@turisanapo
Copy link
Copy Markdown
Contributor Author

@claude, are we exposing the GET conversation with the by-metadata option?

@hebo-agent
Copy link
Copy Markdown

hebo-agent Bot commented Mar 24, 2026

Claude finished @turisanapo's task in 35s —— View job


Analyzing the PR for by-metadata query support

  • Read changed files to check for by-metadata filtering
  • Provide answer

Short answer: it depends on the @hebo-ai/gateway library's route handler, but the plumbing is in place.

The GET /conversations route at index.ts:126-138 passes the raw request through to gw.handler(...), which means any query parameters (like ?metadata[key]=value) will be forwarded to the gateway library's internal route handler. The key question is whether the gateway library's /conversations list handler parses metadata query params and passes them into ConversationQueryOptions.

Looking at the storage layer in this PR:

  • OrgScopedStorage.listConversations (org-scoped-storage.ts:46-51) accepts ConversationQueryOptions which includes a metadata field, and it merges the caller's metadata with organization_id before passing to the underlying SqlStorage.
  • So if the gateway library's route handler extracts metadata from query params and passes it in ConversationQueryOptions, then yes — filtering by metadata works end-to-end.

However, there's no explicit query schema validation on the GET /conversations Elysia route definition (lines 126-138) that documents or validates a metadata query parameter. This means:

  1. Elysia won't validate or type-check metadata query params
  2. It's entirely up to the gateway library's handler to parse them from the raw Request object

If the @hebo-ai/gateway library's conversation list handler already supports ?metadata[key]=value query params, then this PR exposes it. If not, you'd need to add that parsing in the gateway library itself. The Elysia route layer in this PR is just a pass-through — it doesn't block or strip any query parameters.


@turisanapo turisanapo marked this pull request as ready for review March 24, 2026 07:51
@turisanapo turisanapo marked this pull request as draft March 24, 2026 07:52
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
apps/gateway/src/services/org-scoped-storage.ts (1)

53-63: Minor: Cache getOrgId() result to avoid duplicate call.

getOrgId() is called twice—once for the ownership check (line 58) and once when building the update payload (line 61). While functionally correct, caching the value avoids the redundant AsyncLocalStorage.getStore() lookup.

♻️ Suggested improvement
 async updateConversation(
   id: string,
   metadata: ConversationMetadata,
 ): Promise<ConversationEntity | undefined> {
+  const orgId = this.getOrgId();
   const conv = await this.storage.getConversation(id);
-  if (!conv || conv.metadata?.organization_id !== this.getOrgId()) return undefined;
+  if (!conv || conv.metadata?.organization_id !== orgId) return undefined;
   return this.storage.updateConversation(id, {
     ...metadata,
-    organization_id: this.getOrgId(),
+    organization_id: orgId,
   });
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/gateway/src/services/org-scoped-storage.ts` around lines 53 - 63, In
updateConversation, cache the result of getOrgId() into a local const (e.g.,
const orgId = this.getOrgId()) and use that cached orgId for both the ownership
check (currently comparing conv.metadata?.organization_id) and the update
payload passed to this.storage.updateConversation so you avoid calling
getOrgId() twice (and the duplicate AsyncLocalStorage.getStore() lookup).
apps/gateway/src/index.ts (1)

110-125: Consider type assertion for organizationId.

The isSignedIn: true macro guarantees organizationId is defined at runtime, but TypeScript still types it as string | undefined. While safe (because getOrgId() throws if undefined), a non-null assertion would document this contract and catch any future misuse at compile time.

♻️ Example for one route (apply to all)
 .post(
   "/conversations",
   ({ request, prismaClient, organizationId }) =>
-    orgContext.run(organizationId, () =>
+    orgContext.run(organizationId!, () =>
       gw.handler(request, { prismaClient, organizationId }),
     ),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/gateway/src/index.ts` around lines 110 - 125, The route callback is
passing organizationId typed as string | undefined to orgContext.run and
gw.handler; add a non-null assertion to document the isSignedIn contract and
satisfy TypeScript (e.g., use organizationId! where passed into orgContext.run
and into gw.handler) so the compiler knows organizationId is defined — update
all similar routes that rely on getOrgId() throwing when undefined.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@apps/gateway/src/index.ts`:
- Around line 110-125: The route callback is passing organizationId typed as
string | undefined to orgContext.run and gw.handler; add a non-null assertion to
document the isSignedIn contract and satisfy TypeScript (e.g., use
organizationId! where passed into orgContext.run and into gw.handler) so the
compiler knows organizationId is defined — update all similar routes that rely
on getOrgId() throwing when undefined.

In `@apps/gateway/src/services/org-scoped-storage.ts`:
- Around line 53-63: In updateConversation, cache the result of getOrgId() into
a local const (e.g., const orgId = this.getOrgId()) and use that cached orgId
for both the ownership check (currently comparing
conv.metadata?.organization_id) and the update payload passed to
this.storage.updateConversation so you avoid calling getOrgId() twice (and the
duplicate AsyncLocalStorage.getStore() lookup).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 80266d89-250c-48a9-8ed0-cbb66d038386

📥 Commits

Reviewing files that changed from the base of the PR and between d2a5f39 and 8fc6de6.

📒 Files selected for processing (3)
  • apps/gateway/src/gateway-config.ts
  • apps/gateway/src/index.ts
  • apps/gateway/src/services/org-scoped-storage.ts

@turisanapo turisanapo marked this pull request as ready for review March 24, 2026 08:39
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 24, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/8monkey-ai/hebo-platform/issues/comments/4116080720","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\nNo actionable comments were generated in the recent review. 🎉\n\n<details>\n<summary>ℹ️ Recent review info</summary>\n\n<details>\n<summary>⚙️ Run configuration</summary>\n\n**Configuration used**: defaults\n\n**Review profile**: CHILL\n\n**Plan**: Pro\n\n**Run ID**: `78100dd9-3997-4873-a0ae-12f6b646ac47`\n\n</details>\n\n<details>\n<summary>📥 Commits</summary>\n\nReviewing files that changed from the base of the PR and between 8fc6de6622160f13ba091ea0d873fed9be023fef and 88fed78c319fd081f8d6131a36acb14a4f8a30a3.\n\n</details>\n\n<details>\n<summary>📒 Files selected for processing (2)</summary>\n\n* `apps/gateway/src/gateway-config.ts`\n* `apps/gateway/src/index.ts`\n\n</details>\n\n<details>\n<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>\n\n* apps/gateway/src/gateway-config.ts\n\n</details>\n\n</details>\n\n---\n\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe changes introduce SQL-backed storage configuration for conversation requests using GreptimeDB and establish a new REST API surface for managing conversations. A request interception hook enforces tenant isolation by injecting and filtering on organization IDs, while endpoints support full CRUD operations on conversations and their items.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Storage Configuration** <br> `apps/gateway/src/gateway-config.ts`|Initializes `SqlStorage` instance with GreptimeDB client, runs schema migrations on startup, and adds request interception hook to inject `metadata.organization_id` for `POST /conversations` and enforce tenant filtering via query parameters for other conversation-scoped requests.|\n|**REST API Routes** <br> `apps/gateway/src/index.ts`|Registers 9 new signed-in endpoints under `/conversations` for conversation and conversation item CRUD operations (create, list, fetch, update, delete), all forwarding to gateway handler with tenant context and defining OpenAPI response schemas.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant Gateway as Gateway (Router)\n    participant Hook as onRequest Hook\n    participant Handler as Gateway Handler\n    participant Storage as SqlStorage\n    participant DB as GreptimeDB\n\n    Client->>Gateway: POST /conversations (create)\n    Gateway->>Hook: Intercept request\n    Hook->>Hook: Inject metadata.organization_id\n    Hook->>Handler: Forward modified request\n    Handler->>Storage: Store conversation with org_id\n    Storage->>DB: Execute SQL INSERT\n    DB-->>Storage: Confirm\n    Storage-->>Handler: Return result\n    Handler-->>Client: Return conversation (201)\n\n    Client->>Gateway: GET /conversations\n    Gateway->>Hook: Intercept request\n    Hook->>Hook: Add query param: metadata.organization_id\n    Hook->>Handler: Forward filtered request\n    Handler->>Storage: Query conversations WHERE org_id\n    Storage->>DB: Execute SQL SELECT\n    DB-->>Storage: Results\n    Storage-->>Handler: Return filtered results\n    Handler-->>Client: Return conversations (200)\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~25 minutes\n\n## Poem\n\n> 🐰 *Hop hop, what a treat!*  \n> *Storage configured, tenant filtering sweet,*  \n> *Conversations now flow with organization's care,*  \n> *Nine new endpoints flourish in the air!* 🌟\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 5</summary>\n\n<details>\n<summary>✅ Passed checks (5 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                                                                                                                |\n| :------------------------: | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                                                                |\n|         Title check        | ✅ Passed | The title accurately describes the main change: configuring GreptimeDB storage for conversations in the gateway with multi-tenant support.                                                                                                                 |\n|     Linked Issues check    | ✅ Passed | The pull request successfully implements all coding objectives from issue `#312`: configures SQL storage using GreptimeDB with GrepTimeDialect, implements multi-tenant isolation via organization_id metadata, and exposes full /conversations CRUD routes. |\n| Out of Scope Changes check | ✅ Passed | All changes are directly scoped to issue `#312` requirements: SQL storage configuration, tenant isolation implementation, and conversation management routes. No unrelated or out-of-scope modifications detected.                                           |\n|     Docstring Coverage     | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.                                                                                                                                                 |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>📝 Generate docstrings</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> Create stacked PR\n- [ ] <!-- {\"checkboxId\": \"3e1879ae-f29b-4d0d-8e06-d12b7ba33d98\"} --> Commit on current branch\n\n</details>\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `claude-issue-312-20260324-0739`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=8monkey-ai/hebo-platform&utm_content=313)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [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)\n- [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)\n- [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)\n- [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)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}}}

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.

Gateway: configure greptime storage for conversations

1 participant