Skip to content

Conversation

@michelle0927
Copy link
Collaborator

@michelle0927 michelle0927 commented Oct 30, 2025

Resolves #10936

Summary by CodeRabbit

  • New Features

    • Added Google Jobs Search action to search job listings across domains
    • Added Perform Search action with advanced filtering (device, SERP type, pagination, date range)
  • Improvements

    • Enhanced Serphouse configuration: domain, language, location, query and date-range selection in the UI; domain-type validation and location lookup
    • Enabled real API requests from the Serphouse component
  • Chores

    • Bumped Serphouse version to 0.1.0
    • Added platform dependency support

@vercel
Copy link

vercel bot commented Oct 30, 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 Nov 3, 2025 3:21pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Nov 3, 2025 3:21pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 30, 2025

Walkthrough

Adds two new Serphouse action modules (Google Jobs Search and Perform Search), implements a full API client and propDefinitions in serphouse.app.mjs, and bumps components/serphouse package version while adding an @pipedream/platform dependency.

Changes

Cohort / File(s) Summary
Serphouse Actions
components/serphouse/actions/google-jobs-search/google-jobs-search.mjs, components/serphouse/actions/perform-search/perform-search.mjs
Added two action modules exporting default action objects with metadata, props schemas, and async run({ $ }) methods. perform-search validates locationId for Google/Bing via this.serphouse.getDomainType() and throws ConfigurationError when required. Both map props to API parameters and set $summary on "success". google-jobs-search includes locationAlert prop but does not send it in the payload.
Serphouse App
components/serphouse/serphouse.app.mjs
Replaced placeholders with a working API client and propDefinitions. Added methods: _baseUrl(), _makeRequest({ path, ...opts }), getDomainType(domain), performSearch(opts), googleJobsSearch(opts), listDomains(opts), listLanguages({ type, ...opts }), and listLocations(opts). Implemented axios requests with Authorization from this.$auth.api_key, domain-type resolution, and option providers for props.
Package Config
components/serphouse/package.json
Bumped version from 0.0.1 to 0.1.0 and added dependencies with {"@pipedream/platform": "^3.1.0"}.

Sequence Diagram(s)

sequenceDiagram
    participant Action as Action Module
    participant App as serphouse.app
    participant API as Serphouse API

    Note over Action: Start action run
    Action->>App: call this.serphouse.getDomainType(domain) [perform-search only]
    alt domain requires locationId
        Action->>Action: validate locationId -> throw ConfigurationError if missing
    end
    Action->>App: call this.serphouse.performSearch(mapped_params) or googleJobsSearch(mapped_params)
    App->>App: _baseUrl() and _makeRequest(path, opts)
    App->>API: HTTP request with Authorization header
    API-->>App: response { status, data }
    App-->>Action: return response
    alt response.status == "success"
        Action->>Action: set $summary
    end
    Action-->>User: return full response
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay extra attention to:
    • components/serphouse/serphouse.app.mjs — HTTP helper, auth header, and parameter mappings.
    • components/serphouse/actions/perform-search/perform-search.mjs — domain type detection and ConfigurationError logic.
    • Consistency of propDefinitions and propDefinition wiring across actions.

Poem

🐰 I hopped through code, a curious sprite,

New searches bloom in morning light,
Jobs and serpents answering the call,
Axios whispers down the hall,
Serphouse dances — springtime bytes delight!

Pre-merge checks and finishing touches

❌ Failed checks (2 inconclusive)
Check name Status Explanation Resolution
Description check ❓ Inconclusive The pull request description is minimal, containing only 'Resolves #10936' without elaborating on the changes, rationale, or implementation details. While it references the linked issue, the description lacks substantive information about what is being added and why, making it difficult to understand the context and scope of the work from the description alone. Consider expanding the description to include a 'WHY' section explaining the motivation for adding serphouse components, what functionality they provide, and any relevant implementation notes. This will help reviewers understand the context and purpose of these changes.
Linked Issues check ❓ Inconclusive The linked issue #10936 has a title '[Components] serphouse' but provides no detailed requirements, acceptance criteria, or coding objectives beyond the heading. While the PR introduces serphouse components that presumably address this issue, there is insufficient information in the issue itself to definitively validate that all requirements have been met or to assess compliance with specific coding standards. Refer to the test report mentioned in the PR comments (Actions Batch 1 on Notion) and any feedback from the QA team to ensure that the implementation meets the intended functionality. If test cases failed, address those issues before merging.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title 'New Components - serphouse' clearly and concisely identifies the main change: the addition of new serphouse components to the codebase. The title directly matches the changeset, which introduces three new action modules (google-jobs-search, perform-search) and updates the serphouse.app.mjs file with API client surface and propDefinitions.
Out of Scope Changes check ✅ Passed All changes in the pull request are directly related to implementing the serphouse components. The modifications include creating two new action modules (google-jobs-search and perform-search), implementing the core serphouse.app.mjs with API client methods and propDefinitions, and updating the package.json to reflect version changes and dependencies. These changes are appropriately scoped to the serphouse component implementation.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch issue-10936

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.

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: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7f79f75 and 957b0fc.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1 hunks)
  • components/serphouse/actions/perform-search/perform-search.mjs (1 hunks)
  • components/serphouse/package.json (2 hunks)
  • components/serphouse/serphouse.app.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-06-04T17:52:05.780Z
Learnt from: GTFalcao
PR: PipedreamHQ/pipedream#16954
File: components/salesloft/salesloft.app.mjs:14-23
Timestamp: 2025-06-04T17:52:05.780Z
Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.

Applied to files:

  • components/serphouse/serphouse.app.mjs
📚 Learning: 2024-12-12T19:23:09.039Z
Learnt from: jcortes
PR: PipedreamHQ/pipedream#14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like `fs` to `package.json` dependencies, as they are native modules provided by the Node.js runtime.

Applied to files:

  • components/serphouse/package.json
🧬 Code graph analysis (3)
components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1)
components/serphouse/actions/perform-search/perform-search.mjs (1)
  • response (105-124)
components/serphouse/serphouse.app.mjs (1)
components/serphouse/actions/perform-search/perform-search.mjs (1)
  • type (101-101)
components/serphouse/actions/perform-search/perform-search.mjs (2)
components/serphouse/serphouse.app.mjs (3)
  • type (29-29)
  • type (53-53)
  • type (119-125)
components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1)
  • response (57-68)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Lint Code Base
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
  • GitHub Check: pnpm publish

jcortes
jcortes previously approved these changes Nov 1, 2025
Copy link
Collaborator

@jcortes jcortes left a comment

Choose a reason for hiding this comment

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

Hi @michelle0927 lgtm! Ready for QA!

@vunguyenhung
Copy link
Collaborator

@vunguyenhung
Copy link
Collaborator

Hello everyone, I have tested this PR and there're some test cases failed or needed improvement.

Please check test reports below for more information:

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: 1

♻️ Duplicate comments (1)
components/serphouse/serphouse.app.mjs (1)

47-73: Prevent Yahoo location lookups from crashing.

getDomainType() returns "yahoo" for Yahoo domains, but the /location/search endpoint only accepts type=google or type=bing. Passing "yahoo" will result in a 400 error from Serphouse, breaking the location picker for Yahoo domains.

Apply this diff to guard the call:

         const type = this.getDomainType(domain);
+        if (!["google", "bing"].includes(type)) {
+          return [];
+        }
         const { results } = await this.listLocations({
           params: {
             q: query,
             type,
           },
         });

Based on past review comments.

🧹 Nitpick comments (1)
components/serphouse/actions/perform-search/perform-search.mjs (1)

64-72: Consider clarifying the conditional requirement.

The locationId prop is marked as optional: true, but the description states it's "Required for Google and Bing searches," and runtime validation (lines 107-110) enforces this. While the implementation is functionally correct, users might find it confusing that an "optional" field throws an error when omitted for certain domains.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 957b0fc and bc52938.

📒 Files selected for processing (3)
  • components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1 hunks)
  • components/serphouse/actions/perform-search/perform-search.mjs (1 hunks)
  • components/serphouse/serphouse.app.mjs (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1)
components/serphouse/actions/perform-search/perform-search.mjs (1)
  • response (111-130)
components/serphouse/actions/perform-search/perform-search.mjs (2)
components/serphouse/serphouse.app.mjs (3)
  • type (29-29)
  • type (58-58)
  • type (124-130)
components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (1)
  • response (63-74)
components/serphouse/serphouse.app.mjs (1)
components/serphouse/actions/perform-search/perform-search.mjs (1)
  • type (107-107)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Lint Code Base
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
🔇 Additional comments (10)
components/serphouse/serphouse.app.mjs (5)

1-3: LGTM!

The imports are appropriate for the HTTP-based API integration and error handling.


9-41: LGTM!

The domain and language propDefinitions are well-implemented with proper dynamic options, dependency handling, and empty-state checks.


42-46: LGTM!

The locationAlert, query, and dateRange propDefinitions are well-structured with clear descriptions and appropriate options.

Also applies to: 74-106


109-122: LGTM!

The internal helper methods follow Pipedream patterns with proper authentication and request handling.


123-168: LGTM!

The getDomainType validation and API methods are correctly implemented with proper error handling and endpoint paths.

components/serphouse/actions/google-jobs-search/google-jobs-search.mjs (2)

1-13: LGTM!

The action metadata and annotations are properly configured for a read-only Google Jobs search operation.


14-61: LGTM!

The props are well-configured with appropriate propDefinition references and correct dependency chains. Filtering domain to "google" only is appropriate for the Google Jobs API.

components/serphouse/actions/perform-search/perform-search.mjs (3)

1-14: LGTM!

The imports and action metadata are properly configured, including the ConfigurationError import for validation.


106-110: LGTM!

The domain type validation and location requirement check are correctly implemented, properly enforcing that Google and Bing searches require a location ID.


111-136: LGTM!

The API call properly maps all parameters to the expected format with correct boolean-to-string conversions, and the success handling is appropriate.

@vunguyenhung
Copy link
Collaborator

Hi everyone, all test cases are passed! Ready for release!

Test reports

@michelle0927
Copy link
Collaborator Author

/approve

@michelle0927 michelle0927 merged commit 3c19855 into master Nov 4, 2025
10 checks passed
@michelle0927 michelle0927 deleted the issue-10936 branch November 4, 2025 15:07
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.

[Components] serphouse

4 participants