Skip to content

Conversation

wrktbiz
Copy link

@wrktbiz wrktbiz commented Aug 27, 2025

WHY

  • Initial release of component "Form.taxi"
  • With source "New Form Submission"

Summary by CodeRabbit

  • New Features

    • Added Form.taxi integration to receive form submissions.
    • Added "New Form Submission" source: webhook-based capture with automatic renewal and cleanup, request acknowledgement, event emission (headers, query, body, timestamps), sample-event fetching, and API key authentication.
  • Documentation

    • Added README with overview and troubleshooting guidance, including support contact.

Copy link

vercel bot commented Aug 27, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
pipedream-docs Ignored Ignored Aug 28, 2025 7:53am
pipedream-docs-redirect-do-not-edit Ignored Ignored Aug 28, 2025 7:53am

@adolfo-pd adolfo-pd added the User submitted Submitted by a user label Aug 27, 2025
Copy link
Contributor

coderabbitai bot commented Aug 27, 2025

Warning

Rate limit exceeded

@wrktbiz has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 7 minutes and 25 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbit 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.

📥 Commits

Reviewing files that changed from the base of the PR and between 1321742 and 1271a44.

📒 Files selected for processing (2)
  • components/form_taxi/package.json (1 hunks)
  • components/form_taxi/sources/new-form-submission/new-form-submission.mjs (1 hunks)

Walkthrough

Adds a new Form.taxi component: README, package manifest, app descriptor, and a “New Form Submission” source that registers, renews, and deletes webhooks, persists webhook state, acknowledges HTTP webhook calls, emits submission events, and supports sample fetching.

Changes

Cohort / File(s) Summary
Docs
components/form_taxi/README.md
New README with Overview and Troubleshooting (support email).
Package manifest
components/form_taxi/package.json
New package metadata for @pipedream/form_taxi, version, deps, publish and dev config.
App descriptor
components/form_taxi/form_taxi.app.mjs
New static default export describing the Form.taxi app (type, app, name, description).
Source: New Form Submission (webhook + samples)
components/form_taxi/sources/new-form-submission/new-form-submission.mjs
New source that registers/renews/deletes webhooks with Form.taxi, persists webhook_id and expiry in DB, ensures freshness, handles HTTP webhook invocations (200 ack), computes event id/timestamp, emits events, provides fetchAndEmitSamples, lifecycle hooks (deploy/activate/deactivate), uses API-key auth and axios, and includes error handling.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Dev as Developer
  participant Source as Pipedream Source
  participant FTAPI as Form.taxi API
  Note over Source,FTAPI: Activation / registration flow
  Dev->>Source: Deploy / Activate
  Source->>FTAPI: POST /webhooks (register)
  FTAPI-->>Source: { webhook_id, expires_at }
  Source->>Source: Persist webhook_id + expiry (db)
  Note over Source: ensureWebhookFresh runs before expiry -> renew
  Source->>FTAPI: POST /webhooks (renew) / DELETE old webhook
  FTAPI-->>Source: { webhook_id, expires_at }
  Source->>Source: Update persisted webhook info
Loading
sequenceDiagram
  autonumber
  participant User as Form Submitter
  participant FT as Form.taxi
  participant Source as Pipedream Source (HTTP)
  participant PD as Pipedream Event Emitter
  Note over FT,Source: Incoming submission flow
  User->>FT: Submit form
  FT->>Source: POST webhook (headers, query, body)
  Source-->>FT: 200 OK (acknowledge)
  Source->>Source: Compute event id, timestamp
  Source->>PD: Emit event {headers, query, body, received_at, source}
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

I twitch my ears—new forms arrive,
Webhooks hop in, alive, alive!
I stash the IDs, renew on cue,
Emit each event, neat and true.
Carrots for logs, a happy hop — Form.taxi and I won't stop. 🥕🐇

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbit in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbit 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:
    • @coderabbit gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbit read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbit help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbit ignore or @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbit summary or @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbit or @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 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

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@pipedream-component-development
Copy link
Collaborator

Thank you so much for submitting this! We've added it to our backlog to review, and our team has been notified.

@pipedream-component-development
Copy link
Collaborator

Thanks for submitting this PR! When we review PRs, we follow the Pipedream component guidelines. If you're not familiar, here's a quick checklist:

Copy link
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.

Actionable comments posted: 4

🧹 Nitpick comments (7)
components/form_taxi/README.md (1)

1-7: Add a concise Setup + Sample event section

This will help users configure the source quickly and understand emitted data.

 # Overview

 Form.taxi provides a simple and secure way to handle form submissions without writing any server-side code. With Form.taxi, you can quickly connect your HTML forms and deliver submissions or integrate them into your existing workflows. By using Pipedream, you can automate actions in response to new form submissions—such as storing data, sending notifications, or connecting with third-party apps—making it easy to streamline processes and boost productivity.
 
+## Setup
+1. In Pipedream, add the “Form.taxi — New Form Submission” source.
+2. Enter your Form Code and API Key from the Form.taxi Panel (Form settings → Information).
+3. Save to provision the webhook. Submit a test form to see an event in Pipedream.
+
+## Sample event
+```json
+{
+  "headers": { "...": "..." },
+  "query": {},
+  "body": { "id": "abc123", "created_at": "2025-08-27T19:00:00Z", "...": "..." },
+  "received_at": "2025-08-27T19:01:00Z",
+  "source": "Form.taxi"
+}
+```
+
 # Troubleshooting

 If you have issues with this integration, please reach out at [[email protected]](mailto:[email protected]).
components/form_taxi/package.json (2)

15-15: Drop gitHead from committed manifest

This is an npm-publish artifact; keeping it in source causes noise.

-    "gitHead": "e12480b94cc03bed4808ebc6b13e7fdb3a1ba535",

19-21: Remove unused devDependency "package"

Looks accidental; not required here.

-    "devDependencies": {
-        "package": "^1.0.1"
-    }
+    "devDependencies": {}
components/form_taxi/sources/new-form-submission/new-form-submission.mjs (4)

216-225: ACK the webhook before renewal work to minimize vendor timeouts

Renewal can block the response. Fire-and-forget after ACK.

   async run(event) {
-    // Vor der Verarbeitung prüfen, ob der Hook bald abläuft und ggf. erneuern
-    await this.ensureWebhookFresh();
-
     // Sofort ACK an Form.taxi
     await this.http.respond({
       status: 200,
       headers: { "Content-Type": "application/json" },
       body: JSON.stringify({ ok: true }),
     });
+
+    // Renew in background (don’t block the webhook response)
+    this.ensureWebhookFresh().catch((err) =>
+      console.error("ensureWebhookFresh failed:", err?.message)
+    );
 
     // Event emittieren

Also applies to: 227-227


134-138: Broaden event id extraction for stable dedupe

Also check id or uuid before falling back to random.

   eventIdFromBody(body) {
     return (
-        body?._id ||
+        body?.id || body?._id || body?.uuid ||
         `${Date.now()}-${Math.random().toString(36).slice(2)}`
     );
   },

60-64: Standardize logs/comments to English for consistency

Minor wording cleanups; no behavior change.

-      const expires_at = resp?.data?.expires_at; // ISO-8601 erwartet
+      const expires_at = resp?.data?.expires_at; // ISO-8601 expected
-      if (!expires_at) throw new Error(`Response without Expire-Date!`);
+      if (!expires_at) throw new Error(`Response missing expires_at!`);
-        console.warn(`Webhook-Delete fehlgeschlagen: ${resp.status} ${msg}`);
+        console.warn(`Webhook deletion failed: ${resp.status} ${msg}`);
-    // ---- Ablaufprüfung & Erneuerung ----
+    // Expiry check & renewal
-      // Wenn wir kein Ablaufdatum kennen, machen wir nichts (oder könnten aggressiv erneuern).
+      // If no expiry is known, renew aggressively.
-      const windowMs = 60 * 60 * 1000; // 60 Minuten
+      const windowMs = 60 * 60 * 1000; // 60 minutes
-      // Erneuerungsbedingungen:
+      // Renewal conditions:
-        // Alten Hook bereinigen (best effort), wenn wir eine neue ID haben
+        // Clean up old webhook (best effort) if the ID changed
-        console.log(
-          `Webhook erstellt/erneuert. Neue ID: ${res?.id || "unbekannt"}, läuft bis: ${res?.expires_at || "unbekannt"}`
-        );
+        console.log(
+          `Webhook created/renewed. New ID: ${res?.id || "unknown"}, expires at: ${res?.expires_at || "unknown"}`
+        );
-        console.error(`Automatische Erneuerung fehlgeschlagen: ${err.message}`);
+        console.error(`Automatic renewal failed: ${err.message}`);
-          console.warn(`Sample-GET fehlgeschlagen (${resp.status}): ${msg}`);
+          console.warn(`Sample GET failed (${resp.status}): ${msg}`);
-          console.warn("Sample-GET: leere Antwort");
+          console.warn("Sample GET: empty response");
-          // Wir packen die Daten in das gleiche Format wie echte Events
+          // Emit in the same shape as real events
-          console.warn("Sample-GET: unbekanntes Format", data);
+          console.warn("Sample GET: unknown format", data);
-        console.error(`Sample-GET Exception: ${err.message}`);
+        console.error(`Sample GET exception: ${err.message}`);
-        // Unmittelbar Sample-Daten laden und emittieren
+        // Immediately fetch and emit sample data
-        // Webhook frisch registrieren
+        // Register webhook
-        console.log("Webhook registriert:", res);
+        console.log("Webhook registered:", res);
-          console.warn("Fehler beim Entfernen des Webhooks:", err.message);
+          console.warn("Error removing webhook:", err.message);
-    // Sofort ACK an Form.taxi
+    // Immediate ACK to Form.taxi
-    // Event emittieren
+    // Emit event

Also applies to: 77-77, 87-94, 99-103, 121-131, 146-146, 152-153, 162-163, 185-185, 188-188, 197-197, 202-205, 210-211, 220-220, 227-227


32-46: Optional: validate webhook authenticity if Form.taxi supports signing

If available (e.g., HMAC header), verify signature and/or verify form_code in payload to prevent spoofed calls.

Would you like me to add a verification helper once we confirm the header name and algorithm?

Also applies to: 48-69, 141-190

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1b4d96e and 37ca887.

📒 Files selected for processing (4)
  • components/form_taxi/README.md (1 hunks)
  • components/form_taxi/form_taxi.app.mjs (1 hunks)
  • components/form_taxi/package.json (1 hunks)
  • components/form_taxi/sources/new-form-submission/new-form-submission.mjs (1 hunks)
🔇 Additional comments (2)
components/form_taxi/README.md (1)

1-7: Docs are clear and accurate

Nice concise overview and support contact.

components/form_taxi/form_taxi.app.mjs (1)

1-6: App descriptor looks good

Matches Pipedream’s app metadata shape.

wrktbiz and others added 2 commits August 28, 2025 09:30
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…ission.mjs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link
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.

Actionable comments posted: 3

♻️ Duplicate comments (1)
components/form_taxi/sources/new-form-submission/new-form-submission.mjs (1)

193-212: Good fix: hooks is now an object, so lifecycle runs

This resolves the earlier issue flagged in a past review; deploy/activate/deactivate will execute.

🧹 Nitpick comments (1)
components/form_taxi/sources/new-form-submission/new-form-submission.mjs (1)

77-79: Standardize logs to English for consistency

Improves maintainability and aligns with repo norms.

-        console.warn(`Webhook-Delete fehlgeschlagen: ${resp.status} ${msg}`);
+        console.warn(`Webhook delete failed: ${resp.status} ${msg}`);
@@
-        console.log(
-          `Webhook erstellt/erneuert. Neue ID: ${res?.id || "unbekannt"}, läuft bis: ${res?.expires_at || "unbekannt"}`
-        );
+        console.log(
+          `Webhook created/renewed. New ID: ${res?.id || "unknown"}, expires at: ${res?.expires_at || "unknown"}`
+        );
@@
-        console.error(`Automatische Erneuerung fehlgeschlagen: ${err.message}`);
+        console.error(`Automatic renewal failed: ${err.message}`);
@@
-          console.warn(`Sample-GET fehlgeschlagen (${resp.status}): ${msg}`);
+          console.warn(`Sample GET failed (${resp.status}): ${msg}`);
@@
-          console.warn("Sample-GET: leere Antwort");
+          console.warn("Sample GET: empty response");
@@
-          console.warn("Sample-GET: unbekanntes Format", data);
+          console.warn("Sample GET: unknown format", data);
@@
-        console.error(`Sample-GET Exception: ${err.message}`);
+        console.error(`Sample GET exception: ${err.message}`);
@@
-      console.log("Webhook registriert:", res);
+      console.log("Webhook registered:", res);
@@
-        console.warn("Fehler beim Entfernen des Webhooks:", err.message);
+        console.warn("Failed to remove webhook:", err.message);

Also applies to: 126-131, 146-147, 152-153, 185-186, 188-189, 202-204, 206-210

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 2670165 and 1321742.

📒 Files selected for processing (1)
  • components/form_taxi/sources/new-form-submission/new-form-submission.mjs (1 hunks)
🔇 Additional comments (2)
components/form_taxi/sources/new-form-submission/new-form-submission.mjs (2)

95-132: Renewal window logic looks solid

Clean handling of missing/expired expiry, and safe best-effort cleanup of old hooks.


150-178: Event shape and summaries are consistent and useful

Headers/query/body payload + summary/ts and dedupe: "unique" are wired correctly.

Also applies to: 225-238

Copy link
Author

@wrktbiz wrktbiz left a comment

Choose a reason for hiding this comment

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

everything is fine

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
User submitted Submitted by a user
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants